无法远程追踪 MIPS 嵌入式设备

逆向工程 艾达 数据库 嵌入式 米普 罗普
2021-06-26 05:45:28

我正在尝试使用 gdbserver 和 IDA Pro 调试远程设备。我已连接到正确的 PID,并且我能够逐步执行指令,直到我重定向$pc到我的 ROP 链为止jalrI get aSIGTRAP并且进程崩溃。我的目标是能够在加载的二进制范围之外跟踪 shellcode。

是否可以使用 IDA Pro 或者我的客户端上是否需要适合 MIPS 的 gdb?如果是这样,我在哪里可以找到如何操作的教程/说明?

2个回答

您使用的是什么版本的 gdbserver?你制作这个 gdbserver 或在存储库中下载。请检查filemips 文件的输出(大端或小端)并检查输出gdbserver -v 尝试在您的 gdbserver 上连接 gdb 并跟踪,如果成功,则是 ida 中的问题。

您应该能够使用 IDA 来调试 MIPS 二进制文件。对我来说已经有一段时间了,但我似乎记得 IDA 有时会被分支延迟槽(跳转/分支之后的指令)弄糊涂。如果可能,将断点设置为跳转目标的任何位置,而不是尝试单步进入jalr.

或者,您可能会被数据/指令缓存不一致所困扰。在跳入 shellcode 之前,您是否触发了缓存刷新/失效?如果不是,并且这是在 Linux 用户空间中,则进入 sleep() 应该可以解决问题。这是因为您的 shellcode 以数据形式开始并位于数据缓存中,直到它刷新到主内存为止。只有当这种情况发生时,它才能作为指令从主内存中取出。sleep() 允许内核短暂地切换到另一个需要缓存刷新的进程。

为此,您需要:

  1. 进入一个小的睡眠期(1 或 2 秒就足够了) $a0
  2. 将返回地址暂存为 $ra
  3. sleep()暂存某个地方的地址,可能是$s0,您可以jr到达的地方
  4. jr 任何注册持有地址 sleep()