调试剥离的ARM二进制文件

问题描述 投票:4回答:3

我用Hopper反汇编了剥离的ARM二进制文件,找到了我感兴趣的方法的地址,0x00065414。但是,当使用gdb连接到正在运行的应用程序时,所有地址都从我无法弄清楚的基地址开始。如何在gdb中确定正在运行的应用程序基址(入口点?)?

Notes

  • 使用Clutch删除了二进制文件的FairPlay DRM
  • 通过使用a python script清除PIE标头标志来删除ASLR
  • 使用otool验证的更改

GDB setup

$ 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。所以我尝试了以UIApplicationMain为基础的0x33b92844。

(gdb) disas 0x33BF7C58
Dump of assembler code for function <redacted>:
0x33bf7934 <<redacted>+0>:  f0 b5                         push  {r4, r5, r6, r7, lr}

这个地址肯定在编辑或符号剥离代码的土地上,但地址不会落在程序边界上。所以它不是正确的地方。

objective-c gdb arm reverse-engineering
3个回答
3
投票

您的二进制文件可能加载了ASLR,这是一种安全功能,可以使代码和数据的地址不可预测。

在加载可执行文件之前,在GDB中尝试使用disabling ASLR

(gdb) set disable-randomization off
(gdb) start

1
投票

使用info file和/或info shared来计算可执行文件的加载地址或实际的入口点地址。

(gdb) info file
Mac OS X executable:
        <...>/test, file type mach-o-le.
        Entry point: 0x00002104
        0x00001000 - 0x0002b000 is <...>/test
        <...>

1
投票

你可以试试:

starti

接下来你必须转到main函数并等待你的程序调用你的方法,如果你不能输入这个函数,你可以修改你的寄存器:

set $<register>=<value>
© www.soinside.com 2019 - 2024. All rights reserved.