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

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

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

改变了内存

但对应的文件没有改变。

【问题讨论】:

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

标签: gdb


【解决方案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 char}0x00000000004004b9 = 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 type}0x..=0x..”,然后立即退出gdb,然后二进制是变了!。
  • 问题。为什么是unsigned char 而不是int?我注意到我们操纵了一个字节。这是否取决于生成的机器代码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2016-03-19
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多