【问题标题】:Modify asm instructions in an ELF binary修改 ELF 二进制文件中的 asm 指令
【发布时间】:2017-01-25 04:29:41
【问题描述】:

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

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

【问题讨论】:

  • 当我在没有 gdb 的情况下执行程序时,有没有办法跳过或跳转
  • 在 GDB 中跳过它并不能算作解决了你的任务,但是是的,gdb 可以跳转到任何你想要的地方。检查 gdb 手册。您甚至可以在该调试会话期间使用 NOP 覆盖 call 指令。如果这类似于二进制炸弹实验室任务,则应该给它不同的输入,以便执行永远不会到达该块。
  • 不要删除,直接覆盖地址即可。
  • @JoseManuelAbarcaRodríguez:如果你覆盖了地址而不是操作码,它仍然会在某个地方调用。 NOP-out 整个通话要容易得多。
  • GDB 无法编辑磁盘上二进制文件的永久副本。你只是想为这个程序的运行修改内存中的机器代码吗?否则,这听起来像an X-Y problem,而您实际上需要一个十六进制编辑器。发布更多关于你的作业的确切措辞,因为你没有明确说明你应该做什么。

标签: assembly x86 gdb elf hex-editors


【解决方案1】:

我很好奇我还能用 GDB 做什么。我设法用 GDB 更改了程序集,并且修补程序正在正常工作。

我尝试使用 nop 但它不起作用然后我寻找跳转功能。我的补丁是如何工作的:

(gdb) set {unsigned char *}0x4006aa = 0xEB
(gdb) set {unsigned char *}0x4006ab = 0x0C

我正在做的是一个短跳。 短跳转操作码是 EB XX,其中 XX 是从 IP / PC 的相对跳转。 所以在这种情况下,我必须向前跳转 12 个字节,指令也是 2 个字节,所以我将它写入连续的内存位置。我将新修改的二进制文件写入硬盘驱动器,一切都很好。

我花了一天的时间进行实验,但最后我学到了很多东西。 :D

【讨论】:

  • 你也可以使用set {unsigned short *}0x4006aa = 0x0CEB
  • 因为我是第一次做这样的事情,所以我一步一步做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多