我在网络中,我对低级编程完全不熟悉。我写了一个非常简单的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
谢谢!
答案 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