GDB可以更改正在运行的程序的汇编代码吗?

jyz*_*jyz 9 linux debugging x86 gdb

我想为/ bin/ls添加一些额外的功能.
所以我在gdb上启动它并在开头添加了一个断点.

现在的问题是:如何在内存中更改正在运行的程序的代码?我可以看到汇编代码,但我无法修改.我该怎么做?

在Windows上,我可以使用olldbg轻松完成此操作.在Linux上怎么样?

(我知道这样做我只会更改内存中进程的代码.那么我可以将内存转储到文件中,然后我将更改保存在二进制文件中).

谢谢.

Dip*_*tch 15

您可以直接将二进制文件写入内存,但GDB默认情况下没有汇编程序内置,但您可以执行类似的操作set *(unsigned char*)0x80FFDDEE = 0x90,例如将该地址的助记符更改为NOP.然而,您可以使用NASM编写shellcode并使用perl或python将其注入程序:)

您可能也喜欢这个小.gdbinit文件,以便更轻松地调试:https://gist.github.com/985474


Dar*_*con 7

我建议采用不同的方法:下载coreutils包并修改源代码ls.如果可能,您应该从发行版的源存储库获取包并应用任何修补程序.


Cir*_*四事件 5

compile code命令

7.9左右引入,它允许代码编译和注入。文档:https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html

我在这个答案中给出了一个最小的例子。

虽然它不是实际的代码修改,但它确实允许您即时编译一些代码并立即运行一次,这可能就足够了。

GNU cauldron 演示表明,稍后可能会添加实际的代码修改作为此功能的扩展,请参阅幻灯片 30“修复并继续”。

有一些结构没有像我预期的那样工作return,所以我在以下位置询问了原因:在 GDB 编译代码命令中,哪些语言结构的行为与原始源中存在的完全相同?