我写了一些代码来执行以下操作:
在二进制文件中搜索并找到偏移量以添加代码(查找我可以覆盖的 00 序列)。
然后,我将ELF的入口点更改为上述地址。
然后,我将代码写入该地址并
jmp返回到原始入口点。
因此,当二进制文件启动时,它将在我将入口点更改为的地址处执行代码,我可以看到我的代码,gdb但除了nop会触发段错误之外的任何类型的指令。
谁能帮我理解为什么会这样?
为了记录,在我使用的二进制文件中,我写代码的地方是我发现一堆00s的地方。它在.eh_frame分区中。
我将可执行标志添加到该部分以防万一这是原因,但它没有帮助。
我正在尝试向用 C 编写的“hello world”程序添加代码。下一节中的偏移量位于将代码写入的位置:
在任何修改之前,二进制文件具有以下内容:
Section: [17] .eh_frame
Addr: 00000000004005d0 Offset: 0005d0 Size: 0000f4 Flags: A
Entry point address: 0x400400
我的代码运行后:
Section: [17] .eh_frame
Addr: 00000000004005d0 Offset: 0005d0 Size: 0000f4 Flags: A**WX**
Entry point address: **0x4006b6**
GDB内部:
Breakpoint 1, 0x00000000004006b6 in ?? ()
(gdb) x/10i $rip
=> 0x4006b6: nop
0x4006b7: nop
0x4006b8: nop
0x4006b9: add 0x1,%ebx
当我遇到add 0x1, %ebx程序段错误时。** 我也试过一个add 0x1, %rbx.
编辑
我很确定我发现了这个问题。
在编写汇编代码时,我使用 GCC,然后使用 eXamine 命令获取每条指令的字节,但我正在做这样的事情:
__asm__("movl 0x00, %rax") (trying to access 0x00 location..)
而不是__asm__("movl $0x00, %rax")(根据需要将0常量移入寄存器)。
所以,我是个白痴,但至少我自己意识到了 ;))
感谢所有看过并提供帮助的人。