我从一个简单的混淆C程序中获得了以下ASM代码作为一个赋值。在ELF二进制文件中修改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>
,这样我不会称之为保密功能。
如果我使用gdb
通过在运行时单步调试程序计数器来跳过/跳转SECRET,程序将结束执行并为我提供所需的输出。
我想要的是永久修改的可执行二进制文件副本,它总是跳过而不使用调试器。
有没有办法跳过它或跳过,当我执行程序没有GDB –
在GDB跳过它不算作解决你的任务,但是,是的,GDB可以跳到任何你想要的。检查gdb手册。您甚至可以在调试会话期间用NOP覆盖“调用”指令。如果这是一个二进制的炸弹实验室任务,你应该给它不同的输入,所以执行永远不会到达该块。 –
是的,我可以用程序计数器做到这一点,但我正在寻找一种方法来编辑二进制文件,并删除该函数调用并保存修补文件。 –