743
Отзывы о книге Reverse Engineering для начинающих • “It’s very well done .. and for free .. amazing.” 1 Daniel Bilar, Siege Technologies, LLC. • “...excellent and free” 2 Pete Finnigan, гуру по безопасности Oracle RDBMS. • “... book is interesting, great job!” Michael Sikorski, автор книги Practical Malware Analysis: The Hands-On Guide 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 & Information Security 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 Training Center, Georgia, US.) 1 https://twitter.com/daniel_bilar/status/436578617221742593 2 https://twitter.com/petefinnigan/status/400551705797869568 3 http://www.reddit.com/r/IAmA/comments/24nb6f/i_was_a_professional_password_cracker_who_taught/

RE for Beginners-ru

  • 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.

    . twitter

    , .: @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)