SlideShare a Scribd company logo
1 of 42
Download to read offline
Let your Mach-O fly

    Vincenzo Iozzo
 snagg@sikurezza.org
03/08/2010




             Who am I?
• Student at Politecnico di Milano.
• Security Consultant at Secure Network
  srl.
• Reverse Engineer at Zynamics GmbH.




                                            2
03/08/2010




          Goal of the talk


In-memory execution of arbitrary binaries
  on a Mac OS X machine.




                                             3
03/08/2010




              Talk outline
•   Mach-O file structure
•   XNU binary execution
•   Attack technique
•   Defeat ASLR on libraries to enhance
    the attack



                                              4
03/08/2010




              Talk outline
•   Mach-O file structure
•   XNU binary execution
•   Attack technique
•   Defeat ASLR on libraries to enhance
    the attack



                                              5
03/08/2010




               Mach-O file
• Header structure: information on the target
  architecture and options to interpret the file.
• Load commands: symbol table location,
  registers state.
• Segments: define region of the virtual
  memory, contain sections with code or data.




                                                     6
03/08/2010




Segment and Sections
    segment         section

        Virtual         Virtual
       address         Address
       0x1000          0x1d54


       Virtual         Virtual
     memory size     memory size
       0x1000          0x275


      File Offset     File Offset
          0x0           0xd54


      File Size
      0x1000



                                            7
03/08/2010




       Important segments
• __PAGEZERO, if a piece of code accesses
  NULL it lands here. no protection flags.
• __TEXT, holds code and read-only data. RX
  protection.
• __DATA, holds data. RW protection.
• __LINKEDIT, holds information for the
  dynamic linker including symbol and string
  tables. RW protection.

                                                8
03/08/2010




Mach-O representation




                                9
03/08/2010




              Talk outline
•   Mach-O file structure
•   XNU binary execution
•   Attack technique
•   Defeat ASLR on libraries to enhance
    the attack



                                             10
03/08/2010




         Binary execution
• Conducted by the kernel and the
  dynamic linker.
• The kernel, when finishes his part,
  jumps to the dynamic linker entry point.
• The dynamic linker is not randomized.



                                             11
03/08/2010



              Execution steps
Kernel                      Dynamic linker
• Maps the dynamic linker   • Retrieves base address
  in the process address      of the binary.
  space.                    • Resolves symbols.
• Parses the header         • Resolves library
  structure and loads all     dependencies.
  segments.                 • Jumps to the binary entry
• Creates a new stack.        point.




                                                       12
03/08/2010




                  Stack
•   Mach-O file base address.
•   Command line arguments.
•   Environment variables.
•   Execution path.
•   All padded.



                                       13
03/08/2010




Stack representation




                              14
03/08/2010




              Talk outline
•   Mach-O file structure
•   XNU binary execution
•   Attack technique
•   Defeat ASLR on libraries to enhance
    the attack



                                             15
03/08/2010




         Proposed attack
• Userland-exec attack.
• Encapsulate a shellcode, aka auto-
  loader, and a crafted stack in the
  injected binary.
• Execute the auto-loader in the address
  space of the attacked process.


                                            16
03/08/2010




                 WWW
• Who: an attacker with a remote code
  execution in his pocket.
• Where: the attack is two-staged. First
  run a shellcode to receive the binary,
  then run the auto-loader contained in
  the binary.
• Why: later in this talk.

                                             17
03/08/2010




 What kind of binaries?

Any Mach-O file, from ls to Safari




                                            18
03/08/2010




A nice picture




                        19
03/08/2010




           Infected binary
• We need to find a place to store the
  auto-loader and the crafted stack.
• __PAGEZERO infection technique.
• Cavity infector technique.




                                                20
03/08/2010




  __PAGEZERO INFECTION
• Change __PAGEZERO protection flags
  with a custom value.
• Store the crafted stack and the auto-
  loader code at the end of the binary.
• Point __PAGEZERO to the crafted
  stack.
• Overwrite the first bytes of the file with
  the auto-loader address.
                                              21
03/08/2010




Binary layout




                       22
03/08/2010




            Auto-loader
• Impersonates the kernel.
• Un-maps the old binary.
• Maps the new one.




                                    23
03/08/2010




    Auto-loader description
• Parses the binary.
• Reads the virtual addresses of the
  injected binary segments.
• Unloads the attacked binary segments
  pointed by the virtual addresses.
• Loads the injected binary segments.


                                          24
03/08/2010




   Auto-loader description(2)
• Maps the crafted stack referenced by
  __PAGEZERO.
• Cleans registers.
• Cleans some libSystem variables.
• Jumps to dynamic linker entry point.



                                           25
03/08/2010




We do like pictures, don’t we?
 Victim’s process address space
   TEXT          DATA         LINKEDIT       SEGMENT
                                             -N




   TEXT           DATA            LINKEDIT     SEGMENT-N




                                                              26
03/08/2010




         libSystem variables
•   _malloc_def_zone_state
•   _NXArgv_pointer
•   _malloc_num_zones
•   __keymgr_global




                                      27
03/08/2010



    Why are those variables
          important?
• They are used in the initialization of
  malloc.
• Two of them are used for command line
  arguments parsing.
• Not cleaning them will result in a crash.



                                             28
03/08/2010




       Hunts the variables
• Mac OS X Leopard has ASLR for
  libraries.
• Those variables are not exported.
• Cannot use dlopen()/dlsym() combo.




                                          29
03/08/2010




              Talk outline
•   Mach-O file structure
•   XNU binary execution
•   Attack technique
•   Defeat ASLR on libraries to enhance
    the attack



                                           30
03/08/2010




           Defeat ASLR
• Retrieve libSystem in-memory base
  address.
• Read symbols from the libSystem
  binary.
• Adjust symbols to the new address.



                                              31
03/08/2010




 How ASLR works in Leopard
• Only libraries are randomized.
• The randomization is performed
  whenever the system or the libraries are
  updated.
• Library segments addresses are saved
  in dyld_shared_cache_arch.map.


                                            32
03/08/2010




  Retrieve libSystem address
• Parse                  • Adopt functions
  dyld_shared_cache        exported by the
  _i386.map and            dynamic linker and
  search for libSystem     perform the whole
  entry.                   task in-memory.




                                                33
03/08/2010




           Dyld functions
• _dyld_image_count() used to retrieve the
  number of linked libraries of a process.
• _dyld_get_image_header() used to retrieve
  the base address of each library.
• _dyld_get_image_name() used to retrieve
  the name of a given library.



                                              34
03/08/2010




               Find ‘em
• Parse dyld load commands.
• Retrieve __LINKEDIT address.
• Iterate dyld symbol table and search for
  the functions name in __LINKEDIT.




                                             35
03/08/2010




        Back to libSystem
• Non-exported symbols are taken out
  from the symbol table when loaded.
• Open libSystem binary, find the
  variables in the symbol table.
• Adjust variables to the base address of
  the in-memory __DATA segment.


                                            36
03/08/2010




       Put pieces together
• Iterate the header structure of libSystem
  in-memory and find the __DATA base
  address.
  – __DATA base address 0x2000
  – Symbol at 0x2054
  – In-memory __DATA base address 0x4000
  – Symbol in-memory at 0x4054

                                             37
03/08/2010




                 Results
• Run a binary into an arbitrary machine.
• No traces on the hard-disk.
• No execve(), the kernel doesn’t know
  about us.
• It works with every binary.
• It is possible to write payloads in a high
  level language.
                                               38
03/08/2010




         Demo description
• Run a simple piece of code which acts
  like a shellcode and retrieve the binary.
• Execute the attack with nmap and
  Safari.
• Show network dump.
• Show memory layout before and after
  the attack.

                                              39
03/08/2010




DEMO




              40
03/08/2010




      Future developments
• Employ encryption to avoid NIDS
  detection.
• Using cavity infector technique.
• Port the code to iPhone to evade code
  signing protection ( Catch you at BH
  Europe).


                                           41
03/08/2010




Thanks, questions?




                            42

More Related Content

Similar to Bh dc09

Cassandra - An Introduction
Cassandra - An IntroductionCassandra - An Introduction
Cassandra - An IntroductionMikio L. Braun
 
Pyramid: A large-scale array-oriented active storage system
Pyramid: A large-scale array-oriented active storage systemPyramid: A large-scale array-oriented active storage system
Pyramid: A large-scale array-oriented active storage systemViet-Trung TRAN
 
Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009
Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009
Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009Vincenzo Iozzo
 
Parallel Computing - Lec 3
Parallel Computing - Lec 3Parallel Computing - Lec 3
Parallel Computing - Lec 3Shah Zaib
 
Open Stack Cheng Du Swift Alex Yang
Open Stack Cheng Du Swift Alex YangOpen Stack Cheng Du Swift Alex Yang
Open Stack Cheng Du Swift Alex YangOpenCity Community
 
Roeder posterismb2010
Roeder posterismb2010Roeder posterismb2010
Roeder posterismb2010Chris Roeder
 
Swift Architecture and Practice, by Alex Yang
Swift Architecture and Practice, by Alex YangSwift Architecture and Practice, by Alex Yang
Swift Architecture and Practice, by Alex YangHui Cheng
 
Variables: names, bindings, type, scope
Variables: names, bindings, type, scopeVariables: names, bindings, type, scope
Variables: names, bindings, type, scopesuthi
 
Dynamo 100107092845-phpapp02
Dynamo 100107092845-phpapp02Dynamo 100107092845-phpapp02
Dynamo 100107092845-phpapp02Takefumi MIYOSHI
 
Millions quotes per second in pure java
Millions quotes per second in pure javaMillions quotes per second in pure java
Millions quotes per second in pure javaRoman Elizarov
 
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft..."Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...Dataconomy Media
 
Xavier Lacot: Abstracting Databases Access in Titanium Mobile
Xavier Lacot: Abstracting Databases Access in Titanium MobileXavier Lacot: Abstracting Databases Access in Titanium Mobile
Xavier Lacot: Abstracting Databases Access in Titanium MobileAxway Appcelerator
 
2011 codestrong-abstracting-databases-access-in-titanium-mobile
2011 codestrong-abstracting-databases-access-in-titanium-mobile2011 codestrong-abstracting-databases-access-in-titanium-mobile
2011 codestrong-abstracting-databases-access-in-titanium-mobileAxway Appcelerator
 
Abstracting databases access in Titanium Mobile
Abstracting databases access in Titanium MobileAbstracting databases access in Titanium Mobile
Abstracting databases access in Titanium MobileXavier Lacot
 
Linux one vs x86 18 july
Linux one vs x86 18 julyLinux one vs x86 18 july
Linux one vs x86 18 julyDiego Rodriguez
 

Similar to Bh dc09 (20)

Cassandra - An Introduction
Cassandra - An IntroductionCassandra - An Introduction
Cassandra - An Introduction
 
Pyramid: A large-scale array-oriented active storage system
Pyramid: A large-scale array-oriented active storage systemPyramid: A large-scale array-oriented active storage system
Pyramid: A large-scale array-oriented active storage system
 
Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009
Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009
Fun and Games with Mac OS X and iPhone Payloads White Paper, Black Hat EU 2009
 
Parallel Computing - Lec 3
Parallel Computing - Lec 3Parallel Computing - Lec 3
Parallel Computing - Lec 3
 
Open Stack Cheng Du Swift Alex Yang
Open Stack Cheng Du Swift Alex YangOpen Stack Cheng Du Swift Alex Yang
Open Stack Cheng Du Swift Alex Yang
 
Roeder posterismb2010
Roeder posterismb2010Roeder posterismb2010
Roeder posterismb2010
 
C++0x
C++0xC++0x
C++0x
 
Open stackapac swift_alexyang
Open stackapac swift_alexyangOpen stackapac swift_alexyang
Open stackapac swift_alexyang
 
Swift Architecture and Practice, by Alex Yang
Swift Architecture and Practice, by Alex YangSwift Architecture and Practice, by Alex Yang
Swift Architecture and Practice, by Alex Yang
 
Variables: names, bindings, type, scope
Variables: names, bindings, type, scopeVariables: names, bindings, type, scope
Variables: names, bindings, type, scope
 
Dynamo 100107092845-phpapp02
Dynamo 100107092845-phpapp02Dynamo 100107092845-phpapp02
Dynamo 100107092845-phpapp02
 
Millions quotes per second in pure java
Millions quotes per second in pure javaMillions quotes per second in pure java
Millions quotes per second in pure java
 
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft..."Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
"Source Code Abstracts Classification Using CNN", Vadim Markovtsev, Lead Soft...
 
Hot sec10 slide-suzaki
Hot sec10 slide-suzakiHot sec10 slide-suzaki
Hot sec10 slide-suzaki
 
Rails Security
Rails SecurityRails Security
Rails Security
 
Xavier Lacot: Abstracting Databases Access in Titanium Mobile
Xavier Lacot: Abstracting Databases Access in Titanium MobileXavier Lacot: Abstracting Databases Access in Titanium Mobile
Xavier Lacot: Abstracting Databases Access in Titanium Mobile
 
2011 codestrong-abstracting-databases-access-in-titanium-mobile
2011 codestrong-abstracting-databases-access-in-titanium-mobile2011 codestrong-abstracting-databases-access-in-titanium-mobile
2011 codestrong-abstracting-databases-access-in-titanium-mobile
 
Abstracting databases access in Titanium Mobile
Abstracting databases access in Titanium MobileAbstracting databases access in Titanium Mobile
Abstracting databases access in Titanium Mobile
 
Linux one vs x86
Linux one vs x86 Linux one vs x86
Linux one vs x86
 
Linux one vs x86 18 july
Linux one vs x86 18 julyLinux one vs x86 18 july
Linux one vs x86 18 july
 

More from zynamics GmbH

Everybody be cool, this is a roppery!
Everybody be cool, this is a roppery!Everybody be cool, this is a roppery!
Everybody be cool, this is a roppery!zynamics GmbH
 
Automated Mobile Malware Classification
Automated Mobile Malware ClassificationAutomated Mobile Malware Classification
Automated Mobile Malware Classificationzynamics GmbH
 
Applications of the Reverse Engineering Language REIL
Applications of the Reverse Engineering Language REILApplications of the Reverse Engineering Language REIL
Applications of the Reverse Engineering Language REILzynamics GmbH
 
VxClass for Incident Response
VxClass for Incident ResponseVxClass for Incident Response
VxClass for Incident Responsezynamics GmbH
 
Malware classification
Malware classificationMalware classification
Malware classificationzynamics GmbH
 
Platform-independent static binary code analysis using a meta-assembly language
Platform-independent static binary code analysis using a meta-assembly languagePlatform-independent static binary code analysis using a meta-assembly language
Platform-independent static binary code analysis using a meta-assembly languagezynamics GmbH
 
Automated static deobfuscation in the context of Reverse Engineering
Automated static deobfuscation in the context of Reverse EngineeringAutomated static deobfuscation in the context of Reverse Engineering
Automated static deobfuscation in the context of Reverse Engineeringzynamics GmbH
 

More from zynamics GmbH (8)

Everybody be cool, this is a roppery!
Everybody be cool, this is a roppery!Everybody be cool, this is a roppery!
Everybody be cool, this is a roppery!
 
Automated Mobile Malware Classification
Automated Mobile Malware ClassificationAutomated Mobile Malware Classification
Automated Mobile Malware Classification
 
Applications of the Reverse Engineering Language REIL
Applications of the Reverse Engineering Language REILApplications of the Reverse Engineering Language REIL
Applications of the Reverse Engineering Language REIL
 
VxClass for Incident Response
VxClass for Incident ResponseVxClass for Incident Response
VxClass for Incident Response
 
Malware classification
Malware classificationMalware classification
Malware classification
 
Hitb
HitbHitb
Hitb
 
Platform-independent static binary code analysis using a meta-assembly language
Platform-independent static binary code analysis using a meta-assembly languagePlatform-independent static binary code analysis using a meta-assembly language
Platform-independent static binary code analysis using a meta-assembly language
 
Automated static deobfuscation in the context of Reverse Engineering
Automated static deobfuscation in the context of Reverse EngineeringAutomated static deobfuscation in the context of Reverse Engineering
Automated static deobfuscation in the context of Reverse Engineering
 

Bh dc09

  • 1. Let your Mach-O fly Vincenzo Iozzo snagg@sikurezza.org
  • 2. 03/08/2010 Who am I? • Student at Politecnico di Milano. • Security Consultant at Secure Network srl. • Reverse Engineer at Zynamics GmbH. 2
  • 3. 03/08/2010 Goal of the talk In-memory execution of arbitrary binaries on a Mac OS X machine. 3
  • 4. 03/08/2010 Talk outline • Mach-O file structure • XNU binary execution • Attack technique • Defeat ASLR on libraries to enhance the attack 4
  • 5. 03/08/2010 Talk outline • Mach-O file structure • XNU binary execution • Attack technique • Defeat ASLR on libraries to enhance the attack 5
  • 6. 03/08/2010 Mach-O file • Header structure: information on the target architecture and options to interpret the file. • Load commands: symbol table location, registers state. • Segments: define region of the virtual memory, contain sections with code or data. 6
  • 7. 03/08/2010 Segment and Sections segment section Virtual Virtual address Address 0x1000 0x1d54 Virtual Virtual memory size memory size 0x1000 0x275 File Offset File Offset 0x0 0xd54 File Size 0x1000 7
  • 8. 03/08/2010 Important segments • __PAGEZERO, if a piece of code accesses NULL it lands here. no protection flags. • __TEXT, holds code and read-only data. RX protection. • __DATA, holds data. RW protection. • __LINKEDIT, holds information for the dynamic linker including symbol and string tables. RW protection. 8
  • 10. 03/08/2010 Talk outline • Mach-O file structure • XNU binary execution • Attack technique • Defeat ASLR on libraries to enhance the attack 10
  • 11. 03/08/2010 Binary execution • Conducted by the kernel and the dynamic linker. • The kernel, when finishes his part, jumps to the dynamic linker entry point. • The dynamic linker is not randomized. 11
  • 12. 03/08/2010 Execution steps Kernel Dynamic linker • Maps the dynamic linker • Retrieves base address in the process address of the binary. space. • Resolves symbols. • Parses the header • Resolves library structure and loads all dependencies. segments. • Jumps to the binary entry • Creates a new stack. point. 12
  • 13. 03/08/2010 Stack • Mach-O file base address. • Command line arguments. • Environment variables. • Execution path. • All padded. 13
  • 15. 03/08/2010 Talk outline • Mach-O file structure • XNU binary execution • Attack technique • Defeat ASLR on libraries to enhance the attack 15
  • 16. 03/08/2010 Proposed attack • Userland-exec attack. • Encapsulate a shellcode, aka auto- loader, and a crafted stack in the injected binary. • Execute the auto-loader in the address space of the attacked process. 16
  • 17. 03/08/2010 WWW • Who: an attacker with a remote code execution in his pocket. • Where: the attack is two-staged. First run a shellcode to receive the binary, then run the auto-loader contained in the binary. • Why: later in this talk. 17
  • 18. 03/08/2010 What kind of binaries? Any Mach-O file, from ls to Safari 18
  • 20. 03/08/2010 Infected binary • We need to find a place to store the auto-loader and the crafted stack. • __PAGEZERO infection technique. • Cavity infector technique. 20
  • 21. 03/08/2010 __PAGEZERO INFECTION • Change __PAGEZERO protection flags with a custom value. • Store the crafted stack and the auto- loader code at the end of the binary. • Point __PAGEZERO to the crafted stack. • Overwrite the first bytes of the file with the auto-loader address. 21
  • 23. 03/08/2010 Auto-loader • Impersonates the kernel. • Un-maps the old binary. • Maps the new one. 23
  • 24. 03/08/2010 Auto-loader description • Parses the binary. • Reads the virtual addresses of the injected binary segments. • Unloads the attacked binary segments pointed by the virtual addresses. • Loads the injected binary segments. 24
  • 25. 03/08/2010 Auto-loader description(2) • Maps the crafted stack referenced by __PAGEZERO. • Cleans registers. • Cleans some libSystem variables. • Jumps to dynamic linker entry point. 25
  • 26. 03/08/2010 We do like pictures, don’t we? Victim’s process address space TEXT DATA LINKEDIT SEGMENT -N TEXT DATA LINKEDIT SEGMENT-N 26
  • 27. 03/08/2010 libSystem variables • _malloc_def_zone_state • _NXArgv_pointer • _malloc_num_zones • __keymgr_global 27
  • 28. 03/08/2010 Why are those variables important? • They are used in the initialization of malloc. • Two of them are used for command line arguments parsing. • Not cleaning them will result in a crash. 28
  • 29. 03/08/2010 Hunts the variables • Mac OS X Leopard has ASLR for libraries. • Those variables are not exported. • Cannot use dlopen()/dlsym() combo. 29
  • 30. 03/08/2010 Talk outline • Mach-O file structure • XNU binary execution • Attack technique • Defeat ASLR on libraries to enhance the attack 30
  • 31. 03/08/2010 Defeat ASLR • Retrieve libSystem in-memory base address. • Read symbols from the libSystem binary. • Adjust symbols to the new address. 31
  • 32. 03/08/2010 How ASLR works in Leopard • Only libraries are randomized. • The randomization is performed whenever the system or the libraries are updated. • Library segments addresses are saved in dyld_shared_cache_arch.map. 32
  • 33. 03/08/2010 Retrieve libSystem address • Parse • Adopt functions dyld_shared_cache exported by the _i386.map and dynamic linker and search for libSystem perform the whole entry. task in-memory. 33
  • 34. 03/08/2010 Dyld functions • _dyld_image_count() used to retrieve the number of linked libraries of a process. • _dyld_get_image_header() used to retrieve the base address of each library. • _dyld_get_image_name() used to retrieve the name of a given library. 34
  • 35. 03/08/2010 Find ‘em • Parse dyld load commands. • Retrieve __LINKEDIT address. • Iterate dyld symbol table and search for the functions name in __LINKEDIT. 35
  • 36. 03/08/2010 Back to libSystem • Non-exported symbols are taken out from the symbol table when loaded. • Open libSystem binary, find the variables in the symbol table. • Adjust variables to the base address of the in-memory __DATA segment. 36
  • 37. 03/08/2010 Put pieces together • Iterate the header structure of libSystem in-memory and find the __DATA base address. – __DATA base address 0x2000 – Symbol at 0x2054 – In-memory __DATA base address 0x4000 – Symbol in-memory at 0x4054 37
  • 38. 03/08/2010 Results • Run a binary into an arbitrary machine. • No traces on the hard-disk. • No execve(), the kernel doesn’t know about us. • It works with every binary. • It is possible to write payloads in a high level language. 38
  • 39. 03/08/2010 Demo description • Run a simple piece of code which acts like a shellcode and retrieve the binary. • Execute the attack with nmap and Safari. • Show network dump. • Show memory layout before and after the attack. 39
  • 41. 03/08/2010 Future developments • Employ encryption to avoid NIDS detection. • Using cavity infector technique. • Port the code to iPhone to evade code signing protection ( Catch you at BH Europe). 41