2016-09-16 40 views
2

我从一个简单的混淆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,程序将结束执行并为我提供所需的输出。

我想要的是永久修改的可执行二进制文件副本,它总是跳过而不使用调试器。

+0

有没有办法跳过它或跳过,当我执行程序没有GDB –

+0

在GDB跳过它不算作解决你的任务,但是,是的,GDB可以跳到任何你想要的。检查gdb手册。您甚至可以在调试会话期间用NOP覆盖“调用”指令。如果这是一个二进制的炸弹实验室任务,你应该给它不同的输入,所以执行永远不会到达该块。 –

+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

+1

你也许可以做'set {unsigned short *} 0x4006aa = 0x0CEB' –

+1

因为这是我第一次做这样的事情,所以我一步一步做了。 –