面向返回编程是一种用于规避DEP或NX堆栈保护的技术。我正在使用x86_64 Linux中的ROP shellcoding。
问题是我的程序和共享库的内存空间似乎一直放在较低的内存地址中。
cat /proc/26327/maps
7fdc62ff9000-7fdc63196000 r-xp 00000000 08:03 5317651 /lib64/libc-2.19.so
12字节的内存地址搞砸了我加载ROP shellcode的能力,因为内存地址中的0会终止我溢出的strcpy函数。
我完全可以控制系统和可执行文件。有没有办法强制在更高的内存地址加载共享库,以便我可以避免地址空间中的0?
答案 0 :(得分:0)
比这更基本:
当AMD发明x86-64时,他们强制要求规范地址。虽然理论上具有64位地址空间,但当前的x86-64处理器不会公开所有地址空间。例如,我的cpu告诉我它有cat /proc/cpuinfo
:address sizes : 39 bits physical, 48 bits virtual
。由于虚拟地址的上半部分是为内核保留的,因此无法摆脱用户空间中的顶部空字节。