实际上,我正在尝试在 Ubuntu 12.10 32 位和 Intel x86 架构中编写和执行面向跳转的编程示例。我希望它在目标系统上执行的第一个小工具以 POPA 指令开始。我通过使用 Cdump.txt 文件中的 objdump -D /lib/libc.so.6 > Cdump.txt 找到了它的偏移地址。然后我用 gdb 运行了我的易受攻击的程序,并使用这些命令找到了我的程序的可执行段的范围:
ps ax|grep vul
21193 pts/2 S+ 0:00 gdb vul
==>查找“gdb vul”的进程号。
grep libc /proc/21193/maps
b7a4a000-b7bed000 r-xp 00000000 08:01 656054 /lib/i386-linux-gnu/libc-2.15.so
==>找出可执行程序在内存中的加载位置。
我写了我的任意指令地址序列,并关闭了 ASLR 和 Canary 保护。这是我的简单代码溢出堆栈并更改堆栈中“返回”的内容以触发我的 JOP 序列。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
char Buff[4];
memcpy(Buff, "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\xd5\x7a\xbb\xb7\xd6\x7a\xbb\xb7\xd8\x7a\xbb\xb7\xdb\x7a\xbb\xb7\x9c\xf6\xff\xbf\x00\x60\xfc\xb7\xcc\xf6\xff\xbf\x24\xf7\xff\xbf\xb4\xf6\xff\xbf", 52);
return;
}
我调试程序并监视堆栈内容并注册信息。一切正常,直到 esp 到达 (%ebp)+8 地址,即返回后的地址。这 4 个字节应该根据 POPA 指令加载 edi,该指令按 edi、esi、ebp、esp、ebx、edx、ecx、eax 的顺序加载。
所以edi应该通过这个地址加载= 0xB7BB7AD6返回堆栈中的内容是= 0xB7BB7AD5(POPA地址)
但是在 memcpy() 并且它想离开之后,我收到以下消息:
Warning:
Cannot insert breakpoint 0.
Error accessing memory address 0xb7bb7ad6: Input/output error.
0xb7bb7ad5 in ?? ()
这是什么错误?为什么我不能将程序的控制流更改为进程可执行内存中的另一条指令?
请在下面查看更多详细信息:
这是堆栈上的 12 个顶部单词:
(gdb) x /12wx $esp-20
0xbffff67c: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffff68c: 0xb7bb7ad5 0xb7bb7ad6 0xb7bb7ad8 0xb7bb7adb
0xbffff69c: 0xbffff69c 0xb7fc6000 0xbffff6cc 0xbffff724
并注册:
(gdb) info registers
eax 0xbffff67c -1073744260
ecx 0xbffff6b4 -1073744204
edx 0xbffff6b0 -1073744208
ebx 0xb7fc6000 -1208197120
esp 0xbffff690 0xbffff690
ebp 0x90909090 0x90909090
esi 0x0 0
edi 0x0 0
eip 0xb7bb7ad5 0xb7bb7ad5
eflags 0x200283 [ CF SF IF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51