Slide 1

Slide 1 text

iOS applications reverse engineering Julien Bachmann – [email protected] 1

Slide 2

Slide 2 text

2 Agenda › Motivations › The architecture › Mach-O › Objective-C › ARM › AppStore binaries › Find'em › Decrypt'em › Reverse'em › What to look for › Where to start › Remote connections › Data protection › Conclusion

Slide 3

Slide 3 text

3 Preamble ● Security engineer @ SCRT ● Areas of interest focused on reverse engineering, software vulnerabilities and OS internals ● Not an Apple fanboy but like all the cool kids... ;) ● Goals of this presentation is to give a state of the art, in 45minutes, of my knowledge about iOS applications reverse engineering ● Motivate people to do more research in user/kernel-land iOS reverse engineering

Slide 4

Slide 4 text

4 Motivations

Slide 5

Slide 5 text

5 A few numbers › +160 millions iOS users › +400 000 applications available › +10 billion downloads → (modestly) large user base

Slide 6

Slide 6 text

6 e-banking applications

Slide 7

Slide 7 text

7 Applications review › Apple defined a review process › 10% of the applications are classified as dangereous › Cases of applications not « compliant » with their description

Slide 8

Slide 8 text

8 Storm8 case

Slide 9

Slide 9 text

9 Now, what if you want to... › check an external app ? › verify that your application is secure ? › check what kind of information an attacker can get from your application ?

Slide 10

Slide 10 text

10 Best reason ever... › Because it's fun to learn how to reverse new things !

Slide 11

Slide 11 text

11 The architecture

Slide 12

Slide 12 text

12 Mach-O › File format for › Executables › Libraries › Core dumps

Slide 13

Slide 13 text

13 Mach-O › Contains three parts › Header › Load commands › Data

Slide 14

Slide 14 text

14 Mach-O › Header

Slide 15

Slide 15 text

15 Mach-O

Slide 16

Slide 16 text

16 Mach-O › Load commands › Indicates memory layout › Locates symbols table › Main thread context › Shared libraries

Slide 17

Slide 17 text

17 Mach-O › Data › Segments containing sections › __PAGEZERO › __TEXT › Executable code and r-- › __DATA › rw- › __OBJC › ...

Slide 18

Slide 18 text

18 Mach-O › objdump ? › Forget about it › Introducing : otool !

Slide 19

Slide 19 text

19 Mach-O › Universal / FAT files › Supports multiples architectures › For OSX › Universal › PowerPC, x86 and x86_64 › For iOS › FAT › armv6, armv7

Slide 20

Slide 20 text

20 Objective-C › Programming language › Superset of the C language › Object oriented › Class method calls differ from C++

Slide 21

Slide 21 text

21 Calling methods › C++ › ObjectPointer->Method(param1, param2) › Obj-C › [ObjectPointer Method:param1 param2Name:param2]

Slide 22

Slide 22 text

22 Looking more closely › [ObjectPointer Method] › objc_msgSend(ObjectPointer, @selector(Method)) › Selector › C string › objc_msgSend(ObjectPointer, "Method")

Slide 23

Slide 23 text

23 ARM › RISC › load-store architecture › Fixed-length 32-bit instructions › 3-address instruction formats

Slide 24

Slide 24 text

24 Registers › User-level programs › 15 general-purpose 32-bit registers : r0 → r14 › PC = r15 › Current program status register (N, Z, C, V flags, etc.)

Slide 25

Slide 25 text

25 Load-store architecture › Instructions can be classified into 3 groups › Data transfer (load-store) › Data processing › Control flow

Slide 26

Slide 26 text

26 Data transfer instructions › Load from memory › LDR r0, [r1] → r0 = mem[r1] › Store to memory › STR r0, [r1] → mem[r1] = r0

Slide 27

Slide 27 text

27 Data processing instructions › Simple › ADD r0, r1, r2 → r0 = r1 + r2 › Immediate operands › ADD r1, r1, #1 → r1 = r1 + 1 › Shifted register operands › ADD r3, r2, r1, LSL #3 → r3 = r2 + (r1 << 3)

Slide 28

Slide 28 text

28 Control flow instructions › Branch instructions › B LABEL › BAL LABEL › Conditional branches › BXX LABEL › BEQ, BNE, BPL, BMI, … › Conditional execution › CMP r0, #5 → if (r0!= 5) › ADDNE r1, r1, r0 r1 = r1 + r0

Slide 29

Slide 29 text

29 Control flow instructions › Branch and link instructions › BL SUBROUTINE → r14 = @next instr + jmp SUBR › PUSH {r0-r5, LR} › … › POP {r0-r5, PC}

Slide 30

Slide 30 text

30 Calling convention › Arguments values › r0 → r3 › Local variables › r4 → r11 › Return value › r0

Slide 31

Slide 31 text

31 Summing it up › Objective-C › [ObjectPointer Method:42] › C++ › ObjectPointer->Method(42) › Pseudo C › objc_msgSend(ObjectPointer, "Method", 42) › ARM assembly ›

Slide 32

Slide 32 text

32 AppStore binaries

Slide 33

Slide 33 text

33 First of all › Forget about the simulator › Binaries compiled for x86 not ARM › Need to use a jailbroken iOS device › Tools to install › SSH › GDB › ...

Slide 34

Slide 34 text

34 Find'em › Downloaded from the AppStore as .ipa › ZIP file › ~/Music/iTunes/iTunes Music/Mobile Applications/ › On iOS devices › /var/mobile/Applications//.app/

Slide 35

Slide 35 text

35 Content of .app* *after download from the device to workstation. Owner set to mobile:mobile on iOS

Slide 36

Slide 36 text

36 FAT binaries › Binary might contain multiple versions › Need to extract the one corresponding to our device

Slide 37

Slide 37 text

37 Decrypt'em › Encrypted using "FairPlay like" method › Each executable page is encrypted with AES and a MD5 checksum is computed › How to know if a binary is encrypted ? › LC_ENCRYPTION_INFO › cryptid → 1 if the binary is encrypted › cryptoffset → offset of the encrypted data › cryptsize → size of the encrypted data

Slide 38

Slide 38 text

38 LC_ENCRYPTION_INFO

Slide 39

Slide 39 text

39 Unpack the binary › Use a script that automates the process › crackulous › Not leet enough;) › "unpack your app in 5 steps and achieve peace" › Launch GDB › Set a breakpoint › Run the application › Extract the unencrypted executable code › Patch the architecture specific binary

Slide 40

Slide 40 text

40 Where do I set the breakpoint ? › Execution steps › FAT binary is run › Architecture specific binary is mapped in memory › Executable code is decrypted › Branch to start symbol › Get start's address

Slide 41

Slide 41 text

41 GDB, set, run

Slide 42

Slide 42 text

42 « Breakpoint reached capt'ain »

Slide 43

Slide 43 text

43 Extract the executable code › Useful information › start › cryptsize ›

Slide 44

Slide 44 text

44 Patch the architecture specific binary › Locate LC_ENCRYPTION_INFO › Mach-O header parser › Hexadecimal editor › Replace cryptid › 1 → 0 › Replace encrypted code with unpacked one

Slide 45

Slide 45 text

45 Locate LC_ENCRYPTION_INFO › Mach-O header parser › Search for the load command in the binary

Slide 46

Slide 46 text

46 Locate LC_ENCRYPTION_INFO

Slide 47

Slide 47 text

47 Modified LC_ENCRYPTION_INFO

Slide 48

Slide 48 text

48 Replace encrypted code

Slide 49

Slide 49 text

49 Reverse'em › Retrieve classes declarations › class-dump › Resolve objc_msgSend calls › Useless call graph › Need to patch the disassembly

Slide 50

Slide 50 text

50 class-dump

Slide 51

Slide 51 text

51 First look at the disassembly

Slide 52

Slide 52 text

52 objc_msgSend › As stated before › objc_msgSend(, @selector(method), …) › ARM calling convention › arg1 → r0 › arg2 → r1 › Backtrace calls to objc_msgSend › By hand › Using Zynamics IDAPython scripts

Slide 53

Slide 53 text

53 objc_helper.py

Slide 54

Slide 54 text

54 What to look for

Slide 55

Slide 55 text

55 Where to start › Locate the main class › UIApplicationDelegate › applicationDidFinishLaunching › ApplicationDidFinishLaunchingWithOptions › Views › UI*ViewController › viewDidLoad

Slide 56

Slide 56 text

56 applicationDidFinishLaunching

Slide 57

Slide 57 text

57 Remote connections › HTTP(S) › NSURL › ... › Sockets › CFSocketCreate › ...

Slide 58

Slide 58 text

58 Data protection › Accessing the KeyChain using JB tools › Lost iPhone ? Lost Passwords ! * › Protect KeyChain content › Using passcode › setAttributes ofItemAtPath → NSFileProtectionComplete › SecItemAdd → kSecAttrAccessibleWhenUnlocked * http://www.sit.fraunhofer.de/forschungsbereiche/projekte/Lost_iPhone.jsp

Slide 59

Slide 59 text

59 Data protection

Slide 60

Slide 60 text

60 Conclusion

Slide 61

Slide 61 text

61 Conclusion › This is a revolution ! › This presentation was only an introduction › Lot of work/ideas around iOS › Grab your debugger and disassembler and work on it › I'm open to discuss it around a few beers › @milkmix_