使用 gdb 修改二进制文件

Posted

技术标签:

【中文标题】使用 gdb 修改二进制文件【英文标题】:Use gdb to Modify Binary 【发布时间】:2014-11-28 05:04:03 【问题描述】:

我试图修改gdb下的可执行文件。虽然内存变了,但是对应的可执行文件没有变,所以下次运行程序修改就没有了。

我使用 -write 选项启动 gdb。 我也尝试过设置写入然后重新加载执行文件 我用 set unsigned charaddr = 0xf;

改变了内存

但对应的文件没有改变。

【问题讨论】:

不,您正在更改内存而不是文件。如果你想编辑文件本身,你必须用'ofstream'之类的方法打开它。 你能说得更具体些吗? ? 【参考方案1】:

但对应的文件没有改变。

很难说您实际修改的是哪个地址,以及您的更改是否应该实际修改二进制文件。

以前我发现修改二进制后需要立即quit。如果我做quit 以外的任何事情(例如run),那么GDB 会丢弃我的更改,但如果我quit,那么更改将“接受”。

例子:

$ cat t.c
int main()

  return 42;


$ gcc t.c && ./a.out; echo $?
42

$ gdb --write -q  ./a.out
(gdb) disas/r main
Dump of assembler code for function main:
   0x00000000004004b4 <+0>:     55      push   %rbp
   0x00000000004004b5 <+1>:     48 89 e5        mov    %rsp,%rbp
   0x00000000004004b8 <+4>:     b8 2a 00 00 00  mov    $0x2a,%eax
   0x00000000004004bd <+9>:     5d      pop    %rbp
   0x00000000004004be <+10>:    c3      retq   
End of assembler dump.
(gdb) set unsigned char0x00000000004004b9 = 22
(gdb) disas/r main
Dump of assembler code for function main:
   0x00000000004004b4 <+0>:     55      push   %rbp
   0x00000000004004b5 <+1>:     48 89 e5        mov    %rsp,%rbp
   0x00000000004004b8 <+4>:     b8 16 00 00 00  mov    $0x16,%eax  <<< ---changed
   0x00000000004004bd <+9>:     5d      pop    %rbp
   0x00000000004004be <+10>:    c3      retq   
End of assembler dump.
(gdb) q

$ ./a.out; echo $?
22    <<<--- Just as desired

【讨论】:

“立即退出”的事情可能是诀窍。我不小心修改了一次二进制文件,可能是因为“立即退出”。 我刚刚验证了你的“立即退出”技巧。有用。所以在找出需要改变的地方之后,QUIT gdb,用选项“--write”重新启动gdb,直接立即给出命令“set some type0x..=0x..”,然后立即退出gdb,然后二进制是变了!。 问题。为什么是unsigned char 而不是int?我注意到我们操纵了一个字节。这是否取决于生成的机器代码?

以上是关于使用 gdb 修改二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

如果没有文件、objdump 或 gdb,如何知道二进制文件是不是包含调试符号?

“gdb”和“valgrind”以不同的方式执行二进制文件?

在核心转储文件上使用 gdb 获取变量的值

如何将多个输入从文件重定向到在gdb中调试的二进制文件?

如何调试需要在Ubuntu上使用GDB打开低端口的应用程序

gdb在读取核心文件后退出