使用 gdbserver 调试 Android ARM 二进制文件的奇怪行为

逆向工程 安卓 手臂 数据库 奇木
2021-06-29 04:24:10

我正在尝试在我的 x86_64 机器上使用 Android Studio 的模拟器OWASP 的移动安全指南( validate)运行这个 armv5 二进制文件我看到了非常奇怪的行为,希望得到任何指导!

如果我运行程序

$ adb push validate /data/local/tmp
$ adb shell /data/local/tmp/validate AAAAAAAAAAAAAAAA
Entering base32_decode
Outlen = 10
Entering check_license
Incorrect serial.

它按预期工作。

当我将 gdbserver 附加到进程并尝试使用在我的 x86_64 机器(Ubuntu 18.04)上运行的 gdb 通过网络调试它时,就会出现问题。

在 GDBserver 下运行

$ adb root
$ adb forward tcp:8888 tcp:8888
$ adb push validate /data/local/tmp
$ adb shell gdbserver --version
GNU gdbserver (GDB) 7.11
$ adb shell gdbserver :8888 /data/local/tmp/validate

从主机连接 GDB (Ubuntu 18.04 x86_64)

$ ~/Android/Sdk/ndk/20.0.5594570/prebuilt/linux-x86_64/bin/gdb --version
GNU gdb (GDB) 7.11
$ ~/Android/Sdk/ndk/20.0.5594570/prebuilt/linux-x86_64/bin/gdb

gdb$ target remote :8888
gdb$ break *(0x2a000000 + 0x3bc) # Set breakpoint in main function
gdb$ c
Program received signal SIGSEGV, Segmentation fault.
0x2a0003c0 in ?? ()

进一步检查,它失败的原因似乎是因为GBD未能将断点处的指令在对其进行修改以方便断点后恢复到其原始值。

尝试使用硬件断点代替

gdb$ hbreak *(0x2a000000 + 0x3bc)

这次没有 SIGSEGV,但现在如果我们尝试使用

gdb$ nexti

它不会增加程序计数器

即使我们清除了断点,它仍然停留在那条指令上,并且似乎没有任何方法可以让 gdb 继续执行。

Android 图像详细信息(取自 Android Studio AVDManager)

  • 名称:Pixel_3_XL_API_25_armeab-v7a
  • CPU/ABI:Google API ARM (armeabi-v7a)

附加说明

  • gdb 将架构设置为 armv5te,因此它可能与 gdb 不支持该架构无关
  • 我尝试了一些其他版本的 gdb (7.11, 8.1, 8.3) 编译与 ARM 支持,没有工作,并且版本之间的行为不一致
  • 我试过 gdbserver 版本 7.11 和 8.3,都没有区别
  • 当 android 映像为 x86 时,上述步骤工作正常,只有在 ARM 时它们才会失败。
0个回答
没有发现任何回复~