Upload
198206
View
119
Download
13
Embed Size (px)
DESCRIPTION
RE for beginners
Citation preview
Reverse Engineering Its very well done .. and for free .. amazing.1 Daniel Bilar, Siege Technologies, LLC.
...excellent and free2 Pete Finnigan, Oracle RDBMS.
... book is interesting, great job! Michael Sikorski, Practical Malware Analysis: The Hands-OnGuide to Dissecting Malicious Software.
... my compliments for the very nice tutorial! Herbert Bos, Vrije Universiteit Amsterdam.
... It is amazing and unbelievable. Luis Rocha, CISSP / ISSAP, Technical Manager, Network & InformationSecurity at Verizon Business.
Thanks for the great work and your book. Joris van de Vis, SAP Netweaver & Security specialist.
... reasonable intro to some of the techniques.3 (Mike Stay, teacher at the Federal Law Enforcement TrainingCenter, Georgia, US.)
1https://twitter.com/daniel_bilar/status/4365786172217425932https://twitter.com/petefinnigan/status/4005517057978695683http://www.reddit.com/r/IAmA/comments/24nb6f/i_was_a_professional_password_cracker_who_taught/
Reverse Engineering
cbnd
2013-2014, . Creative Commons
Attribution-NonCommercial-NoDerivs ( ) 3.0 . ,
http://creativecommons.org/licenses/by-nc-nd/3.0/. (22 i 2014 .).
, , , http://yurichev.com/RE-book.html.
, .: @yurichev_ru4,
5.
4https://twitter.com/yurichev_ru5http://yurichev.com/mailing_lists.html
ii
!
, 700 , . $20 $50.
: 0.1.
i
I 1
II 416
III 420
IV 442
V 496
VI 502
VII 602
VIII 620
IX 624
670
672
712
ii
0.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvi
I 1
1 CPU 3
2 Hello, world! 42.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.1 MSVC x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.2 GCC x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.3 GCC: AT&T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2.1 MSVC x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.2.2 GCC x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 GCC - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4.1 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.4.2 Keil: thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.4.3 Xcode (LLVM) + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . 122.4.4 Xcode (LLVM) + thumb-2 . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.5.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3 153.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4 164.1 ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164.2 ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.1 . . . . . . . 174.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184.2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2.4 x86: alloca() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194.2.5 (Windows) SEH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.2.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.5.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.5.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5 printf() 265.1 x86: 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.1.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265.1.2 MSVC OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275.1.3 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305.1.4 GCC GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2 x64: 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.2.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335.2.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
iii
5.2.3 GCC + GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3 ARM: 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.3.1 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365.3.2 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.3.3 Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.4 ARM: 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375.4.1 Keil: ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385.4.2 Keil: thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.4.3 Xcode (LLVM): ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395.4.4 Xcode (LLVM): thumb-2 . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6 scanf() 416.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416.2 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.2.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416.2.2 MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436.2.3 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.3 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.3.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456.3.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.4 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.4.1 Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466.5.1 MSVC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476.5.2 MSVC: x86 + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486.5.3 GCC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.5.4 MSVC: x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.5.5 ARM: Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.6 scanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.6.1 MSVC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516.6.2 MSVC: x86: IDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526.6.3 MSVC: x86 + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 556.6.4 MSVC: x86 + Hiew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566.6.5 GCC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.6.6 MSVC: x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.6.7 ARM: Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7 607.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
7.1.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607.1.2 MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.1.3 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.2 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.2.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627.2.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647.2.3 GCC: uint64_t int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.3 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.3.1 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657.3.2 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.3.3 Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
8 67
9 709.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
iv
10 76
10.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7610.1.1 x86 + MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7610.1.2 x86 + MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7810.1.3 x86 + MSVC + Hiew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8010.1.4 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8210.1.5 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
10.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8310.2.1 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8310.2.2 Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
11 switch()/case/default 8611.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
11.1.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8611.1.2 ARM: Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9211.1.3 ARM: Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
11.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9311.2.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9411.2.2 ARM: Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9811.2.3 ARM: Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
11.3 case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10111.3.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10211.3.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
12 10412.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
12.1.1 OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10712.1.2 tracer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
12.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11012.2.1 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11012.2.2 Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11012.2.3 Xcode (LLVM) + thumb-2 . . . . . . . . . . . . . . . . . . . . . . . . . 111
12.3 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11112.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
12.4.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11212.4.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11212.4.3 #3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11212.4.4 #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
13 - 11513.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
13.1.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11513.1.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11613.1.3 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11713.1.4 MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11713.1.5 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
13.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12013.2.1 Xcode (LLVM) + ARM . . . . . . . . . . . . . . . . . . . . . . . . . 12013.2.2 Xcode (LLVM) + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . 12113.2.3 Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
13.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12213.3.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12213.3.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
14 12514.1 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
14.1.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12514.1.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12714.1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12814.1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
14.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13014.2.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
v
14.2.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
15 FPU 13215.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
15.1.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13315.1.2 ARM: Xcode (LLVM) + ARM . . . . . . . . . . . . . . . . . . . . . . 13815.1.3 ARM: Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
15.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13915.2.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13915.2.2 ARM + Xcode (LLVM) + thumb-2 . . . . . . . . . . . . . . . . . . 14015.2.3 ARM + Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
15.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14115.3.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14115.3.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
15.4 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16315.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
15.5.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16315.5.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
16 16516.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
16.1.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16516.1.2 ARM + Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . 16816.1.3 ARM + Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
16.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17016.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17016.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
16.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17616.3.1 Xcode (LLVM) + thumb-2 . . . . . . . . . . . . . . . . . . . . . . . . . 178
16.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18016.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
16.5.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18116.5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
16.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18416.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
16.7.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18716.7.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18916.7.3 #3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19116.7.4 #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19216.7.5 #5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
17 19617.1 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
17.1.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19617.1.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
17.2 / . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20017.2.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20017.2.2 ARM + Keil + ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20417.2.3 ARM + Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . 20417.2.4 ARM + Xcode (LLVM) + ARM . . . . . . . . . . . . . . . . . . . . . 204
17.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20517.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20517.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
17.4 CRC32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21317.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
17.5.1 calc_network_address() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21717.5.2 form_IP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21817.5.3 print_as_IP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21917.5.4 form_netmask() set_bit() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22117.5.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
17.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
vi
17.6.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22217.6.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22317.6.3 #3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22417.6.4 #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
18 22618.1 MSVC: SYSTEMTIME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
18.1.1 OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22718.1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
18.2 malloc() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22918.3 struct tm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
18.3.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23118.3.2 ARM + Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . 23618.3.3 ARM + Xcode (LLVM) + thumb-2 . . . . . . . . . . . . . . . . . . . 236
18.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23718.4.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23818.4.2 x86 + OllyDbg + . . . . . . . . . . . . . . . . . . . . . . . . . . . 24018.4.3 x86 + OllyDbg + 1 . . . . . . . . . . . . . . . . . . . . . . . . 24118.4.4 ARM + Keil + thumb . . . . . . . . . . . . . . . . . . . . . . . . . . . 24118.4.5 ARM + Xcode (LLVM) + thumb-2 . . . . . . . . . . . . . . . . . . . 242
18.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24218.5.1 OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
18.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24518.6.1 CPUID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24518.6.2 float . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
18.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25218.7.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25218.7.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
19 (union) 25619.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
20 25920.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
20.1.1 MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26120.1.2 MSVC + tracer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26220.1.3 MSVC + tracer (code coverage) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
20.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26420.2.1 GCC + GDB ( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26520.2.2 GCC + GDB ( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
21 64- 32- 26921.1 , , . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26921.2 , . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27121.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27221.4 32- 64- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
22 SIMD 27522.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
22.1.1 Intel C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27622.1.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
22.2 strlen() SIMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
23 64 28623.1 x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28623.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29323.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
vii
24 SIMD 294
24.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29424.1.1 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29424.1.2 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
24.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30024.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
24.3.1 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30224.3.2 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
24.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
25 30425.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
25.1.1 MSVC 2012 x86 /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30425.1.2 MSVC 2012 x64 /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
25.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
26 30926.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30926.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31226.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
27 C99 restrict 316
28 Inline- 31928.1 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
28.1.1 strcmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32028.1.2 strlen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32228.1.3 strcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32228.1.4 memcpy() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32328.1.5 memcmp() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32528.1.6 IDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
29 32729.1 (x86) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32729.2 ? . . . . . . . . . . . . . . . . . . . . . . 32829.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
29.3.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34429.3.2 ARM (Thumb) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34429.3.3 ARM ( ARM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34529.3.4 MIPS (little endian) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
30 ++ 34630.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
30.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34630.1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35230.1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35530.1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35730.1.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
30.2 ostream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36330.3 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36430.4 STL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
30.4.1 std::string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36530.4.2 std::list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37230.4.3 std::vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38230.4.4 std::map std::set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
viii
31 401
31.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40131.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
31.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40231.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40231.2.3 / . . . . . . . . . . . . . . . . . . . . . . 40231.2.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40231.2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
31.3 / - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40331.4 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
32 Windows 16-bit 40432.1 #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40432.2 #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40432.3 #3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40532.4 #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40632.5 #5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40932.6 #6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
32.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
II 416
33 41733.1 integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417
34 Endianness ( ) 41934.1 Big-endian ( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41934.2 Little-endian ( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41934.3 Bi-endian ( ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41934.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419
III 420
35 42235.1 Microsoft Visual C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
35.1.1 Name mangling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42235.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
35.2.1 Name mangling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42235.2.2 Cygwin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42235.2.3 MinGW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
35.3 Intel FORTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42235.4 Watcom, OpenWatcom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
35.4.1 Name mangling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42335.5 Borland . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
35.5.1 Delphi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42335.6 DLL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424
36 (win32) 42536.1 - Windows API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42536.2 tracer: - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426
37 42737.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427
37.1.1 Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42837.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 430
38 assert() 432
ix
39 433
39.1 Magic numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43339.1.1 DHCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
39.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434
40 435
41 43741.1 XOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43741.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
42 magic numbers 439
43 44043.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44043.2 ++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 440
44 , , 44144.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
44.1.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
IV 442
45 44345.1 cdecl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44345.2 stdcall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
45.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 44445.3 fastcall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
45.3.1 GCC regparm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44545.3.2 Watcom/OpenWatcom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
45.4 thiscall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44545.5 x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
45.5.1 Windows x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44645.5.2 Linux x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
45.6 float , double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44945.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
46 Thread Local Storage 450
47 (syscall-) 45147.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45147.2 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
48 Linux 45348.1 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453
48.1.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45548.2 LD_PRELOAD Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
49 Windows NT 45949.1 CRT (win32) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45949.2 Win32 PE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
49.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46349.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46349.2.3 Subsystem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46349.2.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46449.2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46449.2.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46549.2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46549.2.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46749.2.9 .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46849.2.10TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46849.2.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
x
49.2.12Further reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
49.3 Windows SEH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46849.3.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46849.3.2 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47449.3.3 Windows x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48949.3.4 SEH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
49.4 Windows NT: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
V 496
50 49750.1 IDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 497
51 49851.1 tracer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49851.2 OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49851.3 GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
52 49952.0.1 strace / dtruss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
53 500
54 501
VI 502
55 + SMT- Z3 - 50355.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50355.2 Z3 SMT- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507
56 51256.1 #1: MacOS Classic PowerPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51256.2 #2: SCO OpenServer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
56.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52756.3 #3: MS-DOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530
57 QR9: , 536
58 SAP 56758.1 SAP . . . . . . . . . . . . . . . . . . . . . . . . . . 56758.2 SAP 6.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 578
59 Oracle RDBMS 58359.1 V$VERSION Oracle RDBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58359.2 X$KSMLRU Oracle RDBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59159.3 V$TIMER Oracle RDBMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
60 59760.1 EICAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
61 59961.1 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
61.1.1 42- Trixter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59961.1.2 Trixter: 27 . . . . . . . . . . . . . . . . . . . . . . . . . . . 60061.1.3 . . . . . . . . 60061.1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
xi
VII 602
62 npad 603
63 60563.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60563.2 x86- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605
64 Compiler intrinsic 606
65 607
66 OpenMP 60866.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61066.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
67 Itanium 614
68 8086 617
69 basic block- 61869.1 Profile-guided optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 618
VIII 620
70 62170.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62170.2 /++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62170.3 x86 / x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62170.4 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621
71 62271.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
72 623
IX 624
73 1 62673.1 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
73.1.1 MSVC 2012 x64 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62673.1.2 Keil (ARM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62673.1.3 Keil (thumb) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
73.2 1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 626
74 2 62774.1 2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
74.1.1 MSVC 2010 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62774.1.2 GCC 4.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62874.1.3 Keil (ARM) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62974.1.4 Keil (thumb) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630
74.2 2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63174.2.1 MSVC 2010 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63174.2.2 GCC 4.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63174.2.3 Keil (ARM) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63274.2.4 Keil (thumb) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
74.3 2.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63374.3.1 MSVC 2010 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63374.3.2 GCC 4.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63474.3.3 Keil (ARM) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63574.3.4 Keil (thumb) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
xii
74.4 2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636
74.4.1 MSVC 2010 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63674.5 2.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
74.5.1 MSVC 2010 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63774.5.2 Keil (ARM) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63874.5.3 Keil (thumb) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
74.6 2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64074.6.1 MSVC 2010 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64074.6.2 Keil (ARM) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64174.6.3 Keil (thumb) + -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
74.7 2.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64474.8 2.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
74.8.1 MSVC 2012 x64 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64474.8.2 Keil (ARM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64574.8.3 Keil (thumb) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
74.9 2.13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64774.9.1 MSVC 2012 + /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64774.9.2 Keil (ARM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64774.9.3 Keil (thumb) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
74.10 2.14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64774.10.1MSVC 2012 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64874.10.2Keil (ARM mode) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64974.10.3GCC 4.6.3 for Raspberry Pi (ARM mode) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
74.11 2.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65074.11.1MSVC 2012 x64 /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65074.11.2GCC 4.4.6 -O3 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65374.11.3GCC 4.8.1 -O3 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65474.11.4Keil (ARM mode): Cortex-R4F . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
74.12 2.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65674.12.1MSVC 2012 x64 /Ox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65674.12.2Keil (ARM) -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65674.12.3Keil (thumb) -O3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657
74.13 2.17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65774.14 2.18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65774.15 2.19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 658
75 3 65975.1 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65975.2 3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66575.3 3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66675.4 3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66675.5 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66675.6 3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66675.7 3.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66675.8 3.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667
76 crackme / keygenme 668
670
77 ? 670
672
A 672
xiii
B x86 673
B.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673B.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
B.2.1 RAX/EAX/AX/AL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673B.2.2 RBX/EBX/BX/BL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674B.2.3 RCX/ECX/CX/CL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674B.2.4 RDX/EDX/DX/DL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674B.2.5 RSI/ESI/SI/SIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674B.2.6 RDI/EDI/DI/DIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674B.2.7 R8/R8D/R8W/R8L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674B.2.8 R9/R9D/R9W/R9L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674B.2.9 R10/R10D/R10W/R10L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675B.2.10 R11/R11D/R11W/R11L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675B.2.11 R12/R12D/R12W/R12L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675B.2.12 R13/R13D/R13W/R13L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675B.2.13 R14/R14D/R14W/R14L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675B.2.14 R15/R15D/R15W/R15L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675B.2.15 RSP/ESP/SP/SPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 675B.2.16 RBP/EBP/BP/BPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676B.2.17 RIP/EIP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676B.2.18 CS/DS/ES/SS/FS/GS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676B.2.19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676
B.3 FPU- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677B.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677B.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678B.3.3 Tag Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678
B.4 SIMD- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679B.4.1 MMX- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679B.4.2 SSE AVX- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
B.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679B.5.1 DR6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679B.5.2 DR7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
B.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680B.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680B.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 681B.6.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685B.6.4 FPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 690B.6.5 SIMD- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691B.6.6 ASCII- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691
C ARM 693C.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693C.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693C.3 Current Program Status Register (CPSR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694C.4 VPF ( ) NEON . . . . . . . . . . . . . . . . . . . . . . . . . 694
D GCC 695
E MSVC 696
F Cheatsheets 697F.1 IDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697F.2 OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697F.3 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698F.4 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698F.5 GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 698
xiv
G 700
G.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700G.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700G.1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700G.1.3 #3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700G.1.4 #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 700G.1.5 - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 701G.1.6 . . . . . . . . . . . . . . . . . . 701G.1.7 FPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702G.1.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702G.1.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703G.1.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
G.2 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706G.2.1 1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706G.2.2 1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706
G.3 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706G.3.1 2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706G.3.2 2.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706G.3.3 2.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707G.3.4 2.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707G.3.5 2.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708G.3.6 2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708G.3.7 2.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709G.3.8 2.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709G.3.9 2.13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709G.3.10 2.14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709G.3.11 2.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709G.3.12 2.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709G.3.13 2.17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.3.14 2.18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.3.15 2.19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
G.4 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.4.1 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.4.2 3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.4.3 3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.4.4 3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.4.5 3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.4.6 3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710G.4.7 3.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 710
712
716
718
720
xv
0.1. 0.1 () reverse engineering , /++ x86 (, , ) ARM.
reverse engineering : 1) -; 2) ; 3) .
x86, ARM.
Oracle RDBMS (59), Itanium (67), (56), LD_PRELOAD (48.2), , ELF6, PE win32 (49.2), x86-64 (23.1), (49.4), (47), TLS7,- (PIC8) (48.1), profile-guided optimization (69.1), C++ STL (30.4), OpenMP (66), SEH().
- ? OS, : 9. CPU10 , . - , : 1) malware () security research; 2) .
, , , , .
reverse engineer-? reddit, RE11, hiring thread (2013 Q3, 2014). .
reverse engineer . 12.
, : herm1t , Avid .
, : Beaver , , Shell Rocket. : , Arnaud Patard (rtp #debian-arm IRC).: Lstar , , Logxen , Yuan Jochen Kang.
6 , Linux *NIX7Thread Local Storage8Position Independent Code: 48.19 : [10]10Central processing unit11http://www.reddit.com/r/ReverseEngineering/12http://yurichev.com/Dennis_Yurichev.pdf
xvi
0.1. github.com . LATEX .
, () .
, , 13 (LaTeX), .
: PLANS14. , , -
. 15, 650 . 330 TEX-, 110
/++, 350 , 100 . amazon.com $20 $50 . http://yurichev.com/donate.html !
- , . ? , , ,
. - Wikipedia MSDN16, . - , , , . , . , , , , , . . , :https://github.com/dennis714/RE-for-beginners/commits/master.
, , rolling release, Linux Gentoo . ( ) , . , . , 10 . , , , ChangeLog 17 , . , , , /twitter 18 .
10 * , 2 * , Daniel Bilar, James Truscott, Luis Rocha, Joris van de Vis, Richard S Shultz,Jang Minchang, Shade Atlas, Yao Xiao, Pawel Szczur, Justin Simms, Shawn the R0ck, Ki Chan Ahn, Triop AB, AngeAlbertini, , Ludvig Gislason, Gerard Labadie, Sergey Volchkov.
, -, , . , . , - . , , , .1.1.
13https://github.com/dennis714/RE-for-beginners14https://github.com/dennis714/RE-for-beginners/blob/master/PLANS15 git 2013:
https://github.com/dennis714/RE-for-beginners/tree/1e57ef540d827c7f7a92fcb3a4626af3e13c7ee416Microsoft Developer Network17https://github.com/dennis714/RE-for-beginners/blob/master/ChangeLog18http://blog.yurichev.com/ https://twitter.com/yurichev_ru
xvii
I
1
, ++, , . . , /++ , , , , , , , . - , .
x86/x64 ARM. , , .
2
1. CPU
1
CPU
CPU . :
: CPU. : , , . , CPU - (ISA1).
: CPU. .
: :, .
CPU : CPU (GPR2). 8 x86, 16 x86-64, 16 ARM. . 3 8 32 . !
? /++, Java, Python, CPU . , CPU , . , - , , . 4 .
1Instruction Set Architecture ( )2General Purpose Registers ( )3 4 .
3
2. HELLO, WORLD!
2
Hello, world!
The C programming Language [17]:
#include
int main(){
printf("hello, world");return 0;
};
2.1 x86
2.1.1 MSVC x86 MSVC 2010:
cl 1.cpp /Fa1.asm
( /Fa )
2.1: MSVC 2010CONST SEGMENT$SG3830 DB hello, world, 00HCONST ENDSPUBLIC _mainEXTRN _printf:PROC; Function compile flags: /Odtp_TEXT SEGMENT_main PROC
push ebpmov ebp, esppush OFFSET $SG3830call _printfadd esp, 4xor eax, eaxpop ebpret 0
_main ENDP_TEXT ENDS
MSVC Intel- . Intel- AT&T - .
1.obj, 1.exe. : CONST ( -) _TEXT ( ). hello, world /++ const char*, . - , $SG3830. :
4
2.1. X86 2. HELLO, WORLD!
#include
const char *$SG3830="hello, world";
int main(){
printf($SG3830);return 0;
};
. , /++ . : 37.1.
_TEXT : main(). main(), , 1. printf() : CALL _printf. ( )
PUSH . , printf() main(), (
) . , ( ESP) .ADD ESP, 4 4 ESP. 4? 32- , 4 . x64- 8 .ADD ESP, 4 POP , - 2. , , Intel C++ Compiler, ADD
POP ECX ( , , Oracle RDBMS, ), , ECX.
, POP ECX, (1 3). (4). printf() /++ return 0 0 -
main(). XOR EAX, EAXXOR, , , 3 ,
MOV EAX, 0 , (2 5). , SUB EAX, EAX, EAX
EAX, 0 . RET . /-
++ CRT4, , , .
2.1.2 GCC x86 GCC 4.4.1 Linux : gcc 1.c -o 1
, IDA5, , main().(IDA, MSVC, Intel-).N.B. GCC -S
-masm=intel
2.2: GCC
main proc near
var_10 = dword ptr -10h
push ebpmov ebp, espand esp, 0FFFFFFF0hsub esp, 10hmov eax, offset aHelloWorld ; "hello, world"
1 (3).2 , , 3http://en.wikipedia.org/wiki/Exclusive_or4C runtime library: sec:CRT5Interactive Disassembler
5
2.1. X86 2. HELLO, WORLD!mov [esp+10h+var_10], eaxcall _printfmov eax, 0leaveretn
main endp
. hello, world, , EAX, . AND ESP, 0FFFFFFF0h ESP 16- , ( , 4 16)6.
SUB ESP, 10h 16 . , , 4. , 16-
. ( ) PUSH.
var_10 printf(). .
printf(). MSVC, GCC MOV EAX, 0
. LEAVE MOV ESP, EBP POP EBP
EBP . , .., ESP EBP ( MOV EBP,
ESP / AND ESP, ...).
2.1.3 GCC: AT&T , AT&T- . UNIX-.
2.3: GCC 4.7.3
gcc -S 1_1.c
:
2.4: GCC 4.7.3
.file "1_1.c"
.section .rodata.LC0:
.string "hello, world"
.text
.globl main
.type main, @functionmain:.LFB0:
.cfi_startprocpushl %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl %esp, %ebp.cfi_def_cfa_register 5andl $-16, %espsubl $16, %espmovl $.LC0, (%esp)call printfmovl $0, %eaxleave.cfi_restore 5.cfi_def_cfa 4, 4
6Wikipedia:
6
2.2. X86-64 2. HELLO, WORLD!ret.cfi_endproc
.LFE0:.size main, .-main.ident "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3".section .note.GNU-stack,"",@progbits
( ). . , , ( .string, , , ). 7:
2.5: GCC 4.7.3
.LC0:.string "hello, world"
main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $16, %espmovl $.LC0, (%esp)call printfmovl $0, %eaxleaveret
Intel AT&T :
.
Intel-: .
AT&T-: .
, : Intel- (=) , AT&T- () 8.
AT&T: (%), ($). .
AT&T: , :
l long (32 )
w word (16 )
b byte (8 )
: , IDA. :0FFFFFFF0h $-16. : 16 0x10 .-0x10 0xFFFFFFF0 ( 32- ).
: 0 MOV XOR . MOV . ( ), load - .
2.2 x86-64
2.2.1 MSVC x86-64 64- MSVC:
7, , GCC : -fno-asynchronous-unwind-tables8 , (, memcpy(), strcpy())
Intel-: , -.
7
2.2. X86-64 2. HELLO, WORLD! 2.6: MSVC 2012 x64
$SG2989 DB hello, world, 00H
main PROCsub rsp, 40lea rcx, OFFSET FLAT:$SG2923call printfxor eax, eaxadd rsp, 40ret 0
main ENDP
x86-64 64- R- . - ( , ), - (fastcall: 45.3). .., - . Win64 4 - RCX, RDX, R8, R9. : printf() , RCX .
64-, 64- ( R-) . , 32- , E- .
, , RAX/EAX/AX/AL 64- x86- CPU:
7 ( ) 6 5 4 3 2 1 0RAXx64
EAXAX
AH AL
- main() int , , , -, 32-, - main() RAX EAX, .., 32- .
2.2.2 GCC x86-64 GCC 64- Linux:
2.7: GCC 4.4.6 x64
.string "hello, world"main:
sub rsp, 8mov edi, OFFSET FLAT:.LC0 ; "hello, world"xor eax, eax ; call printfxor eax, eaxadd rsp, 8ret
Linux, *BSD Mac OS X x86-64 - [21].6 RDI, RSI, RDX, RCX, R8, R9, .
EDI (32- ). 64-, RDI?
64- , MOV - 32- , 32- [14]. , MOV EAX, 011223344h RAX, .
IDA (.o), 9:
2.8: GCC 4.4.6 x64
.text:00000000004004D0 main proc near
.text:00000000004004D0 48 83 EC 08 sub rsp, 8
.text:00000000004004D4 BF E8 05 40 00 mov edi, offset format ; "hello, world"
9 Options Disassembly Number of opcode bytes8
2.3. GCC - 2. HELLO, WORLD!.text:00000000004004D9 31 C0 xor eax, eax.text:00000000004004DB E8 D8 FE FF FF call _printf.text:00000000004004E0 31 C0 xor eax, eax.text:00000000004004E2 48 83 C4 08 add rsp, 8.text:00000000004004E6 C3 retn.text:00000000004004E6 main endp
, , EDI 0x4004D4, 5 . , 64- RDI, 7 . , GCC . , , , 4GiB.
EAX printf(). , - *NIX x86-64 EAX :with variable arguments passes information about the number of vector registers used [21].
2.3 GCC - - const (2.1.1), - (immutable), : - .
:
#include
int f1(){
printf ("world\n");};
int f2(){
printf ("hello world\n");};
int main(){
f1();f2();
};
/++ ( MSVC) , GCC 4.8.1:
2.9: GCC 4.8.1 + IDA
f1 proc near
s = dword ptr -1Ch
sub esp, 1Chmov [esp+1Ch+s], offset s ; "world"call _putsadd esp, 1Chretn
f1 endp
f2 proc near
s = dword ptr -1Ch
sub esp, 1Chmov [esp+1Ch+s], offset aHello ; "hello "
9
2.4. ARM 2. HELLO, WORLD!call _putsadd esp, 1Chretn
f2 endp
aHello db hello s db world,0
: , puts(), - f2(), . , , .
puts() f1(), world . puts() - !
GCC .
2.4 ARM ARM : embedded- Keil Release6/2013 Apple Xcode 4.6.3 ( LLVM-GCC 4.2 ), ARM- SOC10 iPod/iPhone/iPad, Windows 8 WindowsRT11 Raspberry Pi.
, , 32- ARM .
2.4.1 Keil + ARM Keil:
armcc.exe --arm --c90 -O0 1.c
armcc Intel, - , ARM 12, , IDA .
2.10: Keil + ARM + IDA
.text:00000000 main
.text:00000000 10 40 2D E9 STMFD SP!, {R4,LR}
.text:00000004 1E 0E 8F E2 ADR R0, aHelloWorld ; "hello, world"
.text:00000008 15 19 00 EB BL __2printf
.text:0000000C 00 00 A0 E3 MOV R0, #0
.text:00000010 10 80 BD E8 LDMFD SP!, {R4,PC}
.text:000001EC 68 65 6C 6C+aHelloWorld DCB "hello, world",0 ; DATA XREF: main+4
- ARM, . ARM : ARM thumb . (ARM) 32 ( 4 ) . (thumb) 16 ( 2 )13. thumb , 1) ; 2) 16- . : thumb , , 8- ,, , ARM , thumb- .
ARMv7, thumb-2. thumb, . , thumb-2 ARM thumb. . thumb-2 , ARM. ARM , . iPod/iPhone/iPad thumb-2, Xcode .
10System on Chip11http://en.wikipedia.org/wiki/List_of_Windows_8_and_RT_tablet_devices12, PUSH/POP, ARM13, , ( )
. switch() (11.2.2).
10
2.4. ARM 2. HELLO, WORLD! , 4 . -
, ARM thumb . , STMFD SP!, {R4,LR}14, PUSH x86, -
(R4 LR16) . , armcc, , PUSH {r4,lr}. , PUSH thumb, , , IDA .
, SP17, , , R4 LR , SP .
, PUSH thumb, , . , x86 . , STMFD PUSH ( , ), , SP, .
ADR R0, aHelloWorld PC18 , hello, world. PC, ? , - 19
- . ADR , . , , 20 . , ( PC), - .
BL __2printf21 printf(). :
BL (0xC) LR ;
printf(), PC .
printf() , , , , , LR .
RISC22- ARM CISC23- x86, 24.
, 32- , , 32- BL, 24- . , - , ARM 4 (32 ), 4, 2 ( ) . 26 , , 32 .
MOV R0, #025 0 R0. - - 0, R0 .
LDMFD SP!, R4,PC26 , STMFD. R4 PC, SP . , - , POP.N.B. STMFD R4 LR, LDMFD R4 PC .
, LR , . , main() , printf() . , , PC, , , . main() /++, , - CRT - .
DCB , ASCII-, DB x86- .
2.4.2 Keil: thumb Keil thumb:
14STMFD1516Link Register17 . SP/ESP/RSP x86/x64. SP ARM.18Program Counter. IP/EIP/RIP x86/64. PC ARM.19 (48.1)20 21Branch with Link22Reduced instruction set computing23Complex instruction set computing24 (4)25MOVe26LDMFD27
11
2.4. ARM 2. HELLO, WORLD!
armcc.exe --thumb --c90 -O0 1.c
( IDA):
2.11: Keil + thumb + IDA
.text:00000000 main
.text:00000000 10 B5 PUSH {R4,LR}
.text:00000002 C0 A0 ADR R0, aHelloWorld ; "hello, world"
.text:00000004 06 F0 2E F9 BL __2printf
.text:00000008 00 20 MOVS R0, #0
.text:0000000A 10 BD POP {R4,PC}
.text:00000304 68 65 6C 6C+aHelloWorld DCB "hello, world",0 ; DATA XREF: main+2
(16-) , , thumb . BL. 16- . , PC , printf(), 16- , . 16- 10 , 11 . , thumb- 2 ( 16 ) . , thumb- . -, . , , thumb- BL 2 .
: PUSH POP , STMFD/LDMFD, SP . ADR , . MOVS 0 R0 .
2.4.3 Xcode (LLVM) + ARMXcode 4.6.3 , , : -O3.
2.12: Xcode (LLVM) + ARM
__text:000028C4 _hello_world__text:000028C4 80 40 2D E9 STMFD SP!, {R7,LR}__text:000028C8 86 06 01 E3 MOV R0, #0x1686__text:000028CC 0D 70 A0 E1 MOV R7, SP__text:000028D0 00 00 40 E3 MOVT R0, #0__text:000028D4 00 00 8F E0 ADD R0, PC, R0__text:000028D8 C3 05 00 EB BL _puts__text:000028DC 00 00 A0 E3 MOV R0, #0__text:000028E0 80 80 BD E8 LDMFD SP!, {R7,PC}
__cstring:00003F62 48 65 6C 6C+aHelloWorld_0 DCB "Hello world!",0
STMFD LDMFD . MOV 0x1686 R0 ,
Hello world! . R7, , [2] frame pointer , . MOVT R0, #0 0 16 . , MOV
ARM - 16 , . , ARM 32 ., . (16- 31- ) MOVT . , -, MOV R0, #0x1686 . , .
ADD R0, PC, R0 PC R0 Helloworld!. , - , .
BL puts() printf() . printf() puts(). , printf()
puts().
12
2.4. ARM 2. HELLO, WORLD!, , printf(),
. 28. ? puts() 29. , puts() stdout . MOV R0, #0, 0 -
.
2.4.4 Xcode (LLVM) + thumb-2 , Xcode 4.6.3 thumb-2 :
2.13: Xcode (LLVM) + thumb-2
__text:00002B6C _hello_world__text:00002B6C 80 B5 PUSH {R7,LR}__text:00002B6E 41 F2 D8 30 MOVW R0, #0x13D8__text:00002B72 6F 46 MOV R7, SP__text:00002B74 C0 F2 00 00 MOVT.W R0, #0__text:00002B78 78 44 ADD R0, PC__text:00002B7A 01 F0 38 EA BLX _puts__text:00002B7E 00 20 MOVS R0, #0__text:00002B80 80 BD POP {R7,PC}
...
__cstring:00003E70 48 65 6C 6C 6F 20+aHelloWorld DCB "Hello world!",0xA,0
BL BLX thumb, , 16- , thumb-2 , 32- . thumb-2 0xFx 0xEx . IDA , - , ARM : , ( thumb thumb-2 ), , ( ARM) , , (.., endianness) . MOVW, MOVT.W BLX 0xFx.
thumb-2 MOVW R0, #0x13D8 16- R0 .
MOVT.W R0, #0 , MOVT , thumb-2.
, BLX BL. , - LR puts(), thumb ARM, . , , , ( ARM):
__symbolstub1:00003FEC _puts ; CODE XREF: _hello_world+E__symbolstub1:00003FEC 44 F0 9F E5 LDR PC, =__imp__puts
, : puts() , ?
( ) . ( DLL Windows, .so
*NIX .dylib Mac OS X). , puts() .
(Windows PE .exe, ELF Mach-O) , ( ) , .
, , .
, __imp__puts 32- , . LDR 32- , PC, .
28 , puts() \n , .29http://www.ciselant.de/projects/gcc_printf/gcc_printf.html
13
2.5. 2. HELLO, WORLD! ,
, . , , 32-
. , ARM, , . ( thunk-) thumb- .
, ( ARM), BL thunk-, (, X ) .
2.5
2.5.1 #1
main:push 0xFFFFFFFFcall MessageBeepxor eax,eaxretn
win32--?
14
3.
3
. - :
push ebpmov ebp, espsub esp, X
: EBP , EBP ESP, .
EBP , . ESP, .
, EBP :
mov esp, ebppop ebpret 0
- - .
3.1 .
, . - , - , , , .
, .
15
4.
4
1., + ESP RSP x86 x64, SP
ARM, - . PUSH POP ( x86 thumb- ARM).
PUSH ESP/RSP/SP 4 32- ( 8 64-), , ESP/RSP/SP, .
POP (- ) 4 ( 8).
- . PUSH -, POP . , . , .
ARM, , , , ., STMFD/LDMFD, STMED2/LDMED3 descending-, .. -
. STMFA4/LDMFA5, STMEA6/LDMEA7 ascending-, .. -.
4.1 ? , , , .. .
, , , . , , . , , , .
Heap Stack
[26] :
The user-core part of an image is divided into three logical segments. The program text segmentbegins at location 0 in the virtual address space. During execution, this segment is write-protectedand a single copy of it is shared among all processes executing the same program. At the first 8K byte
1http://en.wikipedia.org/wiki/Call_stack2Store Multiple Empty Descending ( ARM)3Load Multiple Empty Descending ( ARM)4Store Multiple Full Ascending ( ARM)5Load Multiple Full Ascending ( ARM)6Store Multiple Empty Ascending ( ARM)7Load Multiple Empty Ascending ( ARM)
16
4.2. ? 4.
boundary above the program text segment in the virtual address space begins a nonshared, writabledata segment, the size of which may be extended by a system call. Starting at the highest address inthe virtual address space is a stack segment, which automatically grows downward as the hardwaresstack pointer fluctuates.
4.2 ?
4.2.1 -
x86
CALL , CALL, ( JMP) , .
CALL PUSH address_after_call / JMP .RET
POP tmp / JMP tmp. , :
void f(){
f();};
MSVC 2008 :
c:\tmp6>cl ss.cpp /Fass.asmMicrosoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86Copyright (C) Microsoft Corporation. All rights reserved.
ss.cppc:\tmp6\ss.cpp(4) : warning C4717: f : recursive on all control paths, function will cause runtime stack overflow
. . . , , :
?f@@YAXXZ PROC ; f; File c:\tmp6\ss.cpp; Line 2
push ebpmov ebp, esp
; Line 3call ?f@@YAXXZ ; f
; Line 4pop ebpret 0
?f@@YAXXZ ENDP ; f
. . . , (/Ox), , , 8:
?f@@YAXXZ PROC ; f; File c:\tmp6\ss.cpp; Line 2$LL3@f:; Line 3
jmp SHORT $LL3@f?f@@YAXXZ ENDP ; f
GCC 4.4.1 , .8
17
4.2. ? 4. ARM
ARM RA9, , . Hello, world! (2.4), RA LR (link register). - LR , . , PUSH R4-R7,LR , POP R4-R7,PC , , LR.
, , ARM - leaf function10. , leaf- LR . , , . , ARM leaf- . x86, 11. , .
4.2.2 x86 cdecl:
push arg3push arg2push arg1call fadd esp, 4*3
., -
f():
ESP ESP+4 #1, IDA arg_0ESP+8 #2, IDA arg_4ESP+0xC #3, IDA arg_8. . . . . .
. (45). , , , , . , .
, , EAX. 12. , , x86 ARM .
, - , . ( printf()) ( %). -
printf("%d %d %d", 1234);
printf() 1234, , . , - main() : main(), main(int argc, char *argv[]) main(int argc, char *argv[], char *envp[]).
, CRT- main() :
push envppush argvpush argc
9 10http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13785.html11-, , PDP-11 VAX CALL ( ) 50%
( - ), , - [25, Chapter 4, Part II].12, , 1.4.1 [18,
1.4.1], JMP, - . System/360.
18
4.2. ? 4. call main...
main() main() , , , , . main() main(int argc, char *argv[]), -, - . , main(int argc), .
4.2.3 , .
. . .
4.2.4 x86: alloca() alloca() 13.
malloc(), . free() , (3) ESP
. alloca(). , , ESP ,
ESP . :
#ifdef __GNUC__#include // GCC#else#include // MSVC#endif#include
void f(){
char *buf=(char*)alloca (600);#ifdef __GNUC__
snprintf (buf, 600, "hi! %d, %d, %d\n", 1, 2, 3); // GCC#else
_snprintf (buf, 600, "hi! %d, %d, %d\n", 1, 2, 3); // MSVC#endif
puts (buf);};
( _snprintf() , printf(), stdout (.., ), buf. puts() buf stdout. , printf(), .)
MSVC
(MSVC 2010):
4.1: MSVC 2010
...
mov eax, 600 ; 00000258Hcall __alloca_probe_16mov esi, esp
13 MSVC, alloca16.asm chkstk.asm C:\Program Files (x86)\MicrosoftVisual Studio 10.0\VC\crt\src\intel
19
4.2. ? 4. push 3push 2push 1push OFFSET $SG2672push 600 ; 00000258Hpush esicall __snprintf
push esicall _putsadd esp, 28 ; 0000001cH
...
alloca() EAX, 14. alloca(), ESP 600 , buf.
GCC + Intel
GCC 4.4.1 :
4.2: GCC 4.7.3
.LC0:.string "hi! %d, %d, %d\n"
f:push ebpmov ebp, esppush ebxsub esp, 660lea ebx, [esp+39]and ebx, -16 ; 16- mov DWORD PTR [esp], ebx ; smov DWORD PTR [esp+20], 3mov DWORD PTR [esp+16], 2mov DWORD PTR [esp+12], 1mov DWORD PTR [esp+8], OFFSET FLAT:.LC0 ; "hi! %d, %d, %d\n"mov DWORD PTR [esp+4], 600 ; maxlencall _snprintfmov DWORD PTR [esp], ebx ; scall putsmov ebx, DWORD PTR [ebp-4]leaveret
GCC + AT&T
, AT&T:
4.3: GCC 4.7.3
.LC0:.string "hi! %d, %d, %d\n"
f:pushl %ebpmovl %esp, %ebppushl %ebxsubl $660, %espleal 39(%esp), %ebx
14 , alloca() , .. compiler intrinsic (64) . , , ,
alloca() MSVC15 , , VM16.
20
4.3. 4. andl $-16, %ebxmovl %ebx, (%esp)movl $3, 20(%esp)movl $2, 16(%esp)movl $1, 12(%esp)movl $.LC0, 8(%esp)movl $600, 4(%esp)call _snprintfmovl %ebx, (%esp)call putsmovl -4(%ebp), %ebxleaveret
, .N.B. , movl $3, 20(%esp) mov DWORD PTR [esp+20], 3 Intel-:
+, AT&T (%).
4.2.5 (Windows) SEH SEH17 ( ) .
: (49.3).
4.2.6 (16.2).
4.3 32- - :
. . . . . .ESP-0xC #2, IDA var_8ESP-8 #1, IDA var_4ESP-4 EBPESP ESP+4 #1, IDA arg_0ESP+8 #2, IDA arg_4ESP+0xC #3, IDA arg_8. . . . . .
4.4 . ? , -. :
#include
void f1(){
int a=1, b=2, c=3;};
void f2(){
int a, b, c;printf ("%d, %d, %d\n", a, b, c);
};
int main()
17Structured Exception Handling: 49.3
21
4.4. 4. {
f1();f2();
};
...
4.4: MSVC 2010
$SG2752 DB %d, %d, %d, 0aH, 00H
_c$ = -12 ; size = 4_b$ = -8 ; size = 4_a$ = -4 ; size = 4_f1 PROC
push ebpmov ebp, espsub esp, 12mov DWORD PTR _a$[ebp], 1mov DWORD PTR _b$[ebp], 2mov DWORD PTR _c$[ebp], 3mov esp, ebppop ebpret 0
_f1 ENDP
_c$ = -12 ; size = 4_b$ = -8 ; size = 4_a$ = -4 ; size = 4_f2 PROC
push ebpmov ebp, espsub esp, 12mov eax, DWORD PTR _c$[ebp]push eaxmov ecx, DWORD PTR _b$[ebp]push ecxmov edx, DWORD PTR _a$[ebp]push edxpush OFFSET $SG2752 ; %d, %d, %dcall DWORD PTR __imp__printfadd esp, 16mov esp, ebppop ebpret 0
_f2 ENDP
_main PROCpush ebpmov ebp, espcall _f1call _f2xor eax, eaxpop ebpret 0
_main ENDP
...
c:\Polygon\c>cl st.c /Fast.asm /MDMicrosoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86Copyright (C) Microsoft Corporation. All rights reserved.
22
4.4. 4. st.cc:\polygon\c\st.c(11) : warning C4700: uninitialized local variable c usedc:\polygon\c\st.c(11) : warning C4700: uninitialized local variable b usedc:\polygon\c\st.c(11) : warning C4700: uninitialized local variable a usedMicrosoft (R)