我正在尝试在我的 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 时它们才会失败。