我从一个简单的混淆C程序中获得了以下ASM代码作为赋值给我。
0x00000000004006a0 <+147>: lea -0x20(%rbp),%rax
0x00000000004006a4 <+151>: mov %rdx,%rsi
0x00000000004006a7 <+154>: mov %rax,%rdi
0x00000000004006aa <+157>: callq 0x400713 <SECRET> <======
0x00000000004006af <+162>: movl $0x0,-0x24(%rbp)
0x00000000004006b6 <+169>: jmp 0x4006d8 <main+203>
0x00000000004006b8 <+171>: mov -0x24(%rbp),%eax
目标是查找并删除导致分段错误的函数(修补程序二进制文件)。我发现了导致段错误的功能,但我不知道如何修补二进制文件。
我的问题是如何修补
0x00000000004006aa <+157>: callq 0x400713 <SECRET>
所以我不会调用SECRET函数。
如果我通过在运行时单步执行时修改程序计数器来使用gdb
跳过/跳过SECRET,程序将完成执行并为我提供我想要的输出。
我想要的是可执行二进制文件的永久修改副本,它总是在不使用调试器的情况下跳过。
答案 0 :(得分:1)
我很想知道我还能用GDB做些什么。我设法用GDB更改程序集,修补程序正常运行。
我尝试使用nop但是它不起作用然后我看起来跳转功能。我的补丁如何运作:
(gdb) set {unsigned char *}0x4006aa = 0xEB
(gdb) set {unsigned char *}0x4006ab = 0x0C
我正在做的是一个短暂的跳跃。 短跳操作码是EB XX,其中XX是来自IP / PC的相对跳跃。 所以在这种情况下我必须跳过12个字节,指令也是2个字节,所以我把它写在连续的内存位置。我将新修改的二进制文件写入硬盘并且一切都很棒。
我花了一天时间进行实验,但最后我学到了很多东西。 :D