我正在尝试使用 gdbserver 和 IDA Pro 调试远程设备。我已连接到正确的 PID,并且我能够逐步执行指令,直到我重定向$pc到我的 ROP 链为止。在jalrI get aSIGTRAP并且进程崩溃。我的目标是能够在加载的二进制范围之外跟踪 shellcode。
是否可以使用 IDA Pro 或者我的客户端上是否需要适合 MIPS 的 gdb?如果是这样,我在哪里可以找到如何操作的教程/说明?
我正在尝试使用 gdbserver 和 IDA Pro 调试远程设备。我已连接到正确的 PID,并且我能够逐步执行指令,直到我重定向$pc到我的 ROP 链为止。在jalrI get aSIGTRAP并且进程崩溃。我的目标是能够在加载的二进制范围之外跟踪 shellcode。
是否可以使用 IDA Pro 或者我的客户端上是否需要适合 MIPS 的 gdb?如果是这样,我在哪里可以找到如何操作的教程/说明?
您使用的是什么版本的 gdbserver?你制作这个 gdbserver 或在存储库中下载。请检查filemips 文件的输出(大端或小端)并检查输出gdbserver -v
尝试在您的 gdbserver 上连接 gdb 并跟踪,如果成功,则是 ida 中的问题。
您应该能够使用 IDA 来调试 MIPS 二进制文件。对我来说已经有一段时间了,但我似乎记得 IDA 有时会被分支延迟槽(跳转/分支之后的指令)弄糊涂。如果可能,将断点设置为跳转目标的任何位置,而不是尝试单步进入jalr.
或者,您可能会被数据/指令缓存不一致所困扰。在跳入 shellcode 之前,您是否触发了缓存刷新/失效?如果不是,并且这是在 Linux 用户空间中,则进入 sleep() 应该可以解决问题。这是因为您的 shellcode 以数据形式开始并位于数据缓存中,直到它刷新到主内存为止。只有当这种情况发生时,它才能作为指令从主内存中取出。sleep() 允许内核短暂地切换到另一个需要缓存刷新的进程。
为此,您需要:
$a0$rasleep()暂存某个地方的地址,可能是$s0,您可以jr到达的地方jr 任何注册持有地址 sleep()