我想为/ bin / ls添加一些额外的功能。
所以我在gdb上启动它,并在开头添加了一个断点。
现在的问题是:如何在内存中更改正在运行的程序的代码?我可以看到汇编代码,但我无法修改。我该怎么办?
在Windows上,我可以使用olldbg轻松完成此操作。在Linux上怎么样?
(我知道这样做我只会更改内存中进程的代码。所以我可以将内存转储到文件中,然后我将更改保存在二进制文件中。)
谢谢。
答案 0 :(得分:15)
您可以直接将二进制文件写入内存,但GDB默认情况下没有汇编程序内置,但您可以执行set *(unsigned char*)0x80FFDDEE = 0x90
之类的操作来将该地址的助记符更改为NOP。但是,您可以使用NASM编写shellcode并使用perl或python将其注入程序:)
你可能也喜欢这个小的.gdbinit文件来简化调试:https://gist.github.com/985474
答案 1 :(得分:7)
我建议使用其他方法:下载coreutils包并修改ls
的源代码。如果可能,您应该从发行版的源代码库获取软件包并应用任何修补程序。
答案 2 :(得分:3)
Here is a blog post解释了如何在运行时为gdb和Visual Studio更改代码。
答案 3 :(得分:2)
compile code
命令
在7.9左右引入,它允许代码编译和注入。文档:https://sourceware.org/gdb/onlinedocs/gdb/Compiling-and-Injecting-Code.html
我给出了一个最小的例子in this answer。
虽然它不是实际的代码修改,但它确实允许你动态编译一些代码并立即运行一次,这可能就足够了。
GNU cauldron presentation建议稍后可以添加实际代码修改作为此功能的扩展,请参阅幻灯片30"修复并继续"。
有一些结构不像我预期的那样有效return
,所以我在In the GDB compile code command, what language constructs behave exactly as if they were present in the original source?
答案 4 :(得分:0)
在编译过程中,您可以使用gcc-plugin编写扩展名来修改coed并添加任何其他功能。如果您使用机器级别的代码,则应使用Pin和Dyninst之类的二进制检测工具来检测磁盘上的二进制文件。但是,如果开销是重要的问题,则应谨慎使用此类工具。