我用Hopper分解了一个剥离的ARM二进制文件,找到了我感兴趣的方法0x00065414的地址。然而,当使用gdb连接到正在运行的应用程序时,所有地址都从一个我无法确定的基地址开始。如何在gdb中确定正在运行的应用程序的基本地址(入口点?)?
备注
- 二进制文件的FairPlay DRM已使用Clutch删除
- ASLR是通过使用python脚本清除PIE头标志而删除的
- 使用otool验证更改
GDB设置
$ gdb ./MyApplication
(gdb) attach -waitfor MyApplication
启动应用程序,它会在启动时立即暂停。
(gdb) where
#0 0x3bbcdb88 in <redacted> ()
#1 0x3bbbc8fc in <redacted> ()
#2 0x3bbc4130 in <redacted> ()
#3 0x3bbc4014 in ccpbkdf2_hmac ()
#4 0x3bb9f9d0 in CCKeyDerivationPBKDF ()
#5 0x0015b750 in dyld_stub_pthread_key_create ()
#6 0x0015ca46 in dyld_stub_pthread_key_create ()
#7 0x0015c69c in dyld_stub_pthread_key_create ()
#8 0x0015b4d0 in dyld_stub_pthread_key_create ()
#9 0x0015c110 in dyld_stub_pthread_key_create ()
#10 0x0001695a in dyld_stub_pthread_key_create ()
#11 0x000ba256 in dyld_stub_pthread_key_create ()
#12 0x00017bde in dyld_stub_pthread_key_create ()
#13 0x33b9eaac in <redacted> ()
#14 0x33b9e4f2 in <redacted> ()
#15 0x33b98b40 in <redacted> ()
#16 0x33b33a06 in <redacted> ()
#17 0x33b32cfc in <redacted> ()
#18 0x33b98320 in <redacted> ()
#19 0x3601876c in <redacted> ()
#20 0x36018356 in <redacted> ()
#21 0x31374776 in <redacted> ()
#22 0x31374712 in <redacted> ()
#23 0x31372ede in <redacted> ()
#24 0x312dd470 in CFRunLoopRunSpecific ()
#25 0x312dd252 in CFRunLoopRunInMode ()
#26 0x33b975c2 in <redacted> ()
#27 0x33b92844 in UIApplicationMain ()
#28 0x0001aaf2 in dyld_stub_pthread_key_create ()
#29 0x00009028 in dyld_stub_pthread_key_create ()
检查不同位置的预期指令,以便我可以设置断点:
(gdb) disas 0x65414
No function contains specified address.
我认为正确的位置是+0x65414。所以我尝试了0x33b92844,它是UIApplicationMain作为基础。
(gdb) disas 0x33BF7C58
Dump of assembler code for function <redacted>:
0x33bf7934 <<redacted>+0>: f0 b5 push {r4, r5, r6, r7, lr}
这个地址肯定是在经过编辑或符号剥离的代码的土地上,但这个地址不会让你进入程序边界。所以这不是一个合适的地方。
您可以尝试一个:
starti
它允许您在动态链接器中输入(如果您的二进制id是动态链接的),该链接器将调用__libc_start_main函数,并且作为该函数的参数,它提供一个指向主函数的指针。因此,您必须在此地址(b*<addr_of_main>
)上设置一个断点,并使用continue
命令继续执行。现在你在主函数中,等待你的程序调用你的方法,如果你不能进入这个函数,你可以用修改你的寄存器
set $<register>=<value>
您的二进制文件可能加载了ASLR,这是一种安全功能,可以使代码和数据的地址不可预测。
在加载可执行文件之前,请尝试在GDB中禁用ASLR。
(gdb) set disable-randomization off
(gdb) start
使用info file
和/或info shared
来计算可执行文件的加载地址或实际入口点地址。
(gdb) info file
Mac OS X executable:
<...>/test, file type mach-o-le.
Entry point: 0x00002104
0x00001000 - 0x0002b000 is <...>/test
<...>