GDB编辑程序集(英特尔)永久和临时

时间:2014-01-02 03:21:23

标签: linux assembly gdb disassembly

我在网络中,我对低级编程完全不熟悉。我写了一个非常简单的C程序来反汇编,读取和破解。

我想做什么: 永久编辑GDB中文件的ASM,但我相信只有这种方法可以用于该运行。

0x00000000004005f8 <+75>: call 0x4004b0 <__isoc99_scanf@plt>
   0x00000000004005fd <+80>: mov eax,DWORD PTR [rbp-0x18]
   0x0000000000400600 <+83>: cmp eax,DWORD PTR [rbp-0x4]

我想成为:

0x00000000004005f8 <+75>: call 0x4004b0 <__isoc99_scanf@plt>
   0x00000000004005fd <+80>: mov eax,DWORD PTR [rbp-0x18]
   0x0000000000400600 <+83>: cmp eax,eax

谢谢!

1 个答案:

答案 0 :(得分:1)

在这种情况下,您很幸运,因为cmp eax, eax的编码比cmp eax,DWORD PTR [rbp-0x4]短。只需用新指令和单个字节0x400600替换nop处的字节。

在:

Instruction                    Encoding
cmp eax,DWORD PTR [rbp-0x4]    3b 45 fc

后:

Instruction                    Encoding
cmp eax, eax                   39 c0
nop                            90

在GDB中,您可以通过使自己成为一个简单的指针然后覆盖这些字节来实现:

(gdb) set $p = (unsigned char *)0x400600
(gdb) set $p[0] = 0x39
(gdb) set $p[1] = 0xc0
(gdb) set $p[2] = 0x90