Figure 6-52 Before ImportantAndComplicatedFunction
Repeat the previous steps to check out MainBinary’s ASLR offset:
(lldb) image list -o -f
[ 0] 0x0000e000 /private/var/tmp/MainBinary(0x0000000000012000)
......
Because the address of “CMP R0, #0” in figure 6-52 is 0xBF46, the breakpoint should be set
at 0xbf46 + 0xe000 = 0x19F46. Trigger it with “c”, and print R0:
(lldb) br s -a 0x19F46
Breakpoint 1: where = MainBinary`main + 134, address = 0x00019f46
(lldb) c
Process 456316 resuming
Process 456316 stopped
* thread #1: tid = 0x6f67c, 0x00019f46 MainBinary`main + 134, queue = ‘com.apple.main-
thread, stop reason = breakpoint 1.1
frame #0: 0x00019f46 MainBinary`main + 134
MainBinary`main + 134:
0x19f46: cmp r0, #0
0x19f48: beq 0x19f4e ; main + 142
0x19f4a: bl 0x19ea4 ; ImportantAndComplicatedFunction
0x19f4e: movs r0, #0
(lldb) p $r0
(unsigned int) $0 = 0
R0 is 0, so ImportantAndComplicatedFunction will not be executed. If we change R0 to 1,
the situation changes all together:
(lldb) register write r0 1
(lldb) p $r0
(unsigned int) $1 = 1
(lldb) c
Process 456316 resuming
(lldb) 2014- 12 - 01 00:41:47.779 MainBinary[3482:457105] iOSRE: Suppose I’m a very
important and complicated function
Process 456316 exited with status = 0 (0x00000000)
As we can see, we’ve changed the process execution flow by modifying the value of a
register, thus achieved our goal.