我从一个简单的混淆 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,则程序将完成执行并为我提供我想要的输出。
我想要的是可执行二进制文件的永久修改副本,它总是在不使用调试器的情况下跳过。