移动x86_64 linux程序的虚拟内存空间以促进ROP探索

移动x86_64 linux程序的虚拟内存空间以促进ROP探索,linux,assembly,linux-kernel,shellcode,Linux,Assembly,Linux Kernel,Shellcode,面向返回的编程是一种逃避DEP或NX堆栈保护的技术。我正在x86_64 Linux中使用ROP外壳编码 问题是,我的程序和共享库的内存空间似乎总是放在较低的内存地址中 cat /proc/26327/maps 7fdc62ff9000-7fdc63196000 r-xp 00000000 08:03 5317651 /lib64/libc-2.19.so 12字节的内存地址破坏了我加载ROP外壳代码的能力,因为内存地址中的0终止了我溢出的strcpy函数

面向返回的编程是一种逃避DEP或NX堆栈保护的技术。我正在x86_64 Linux中使用ROP外壳编码

问题是,我的程序和共享库的内存空间似乎总是放在较低的内存地址中

cat /proc/26327/maps
7fdc62ff9000-7fdc63196000 r-xp 00000000 08:03 5317651                    /lib64/libc-2.19.so
12字节的内存地址破坏了我加载ROP外壳代码的能力,因为内存地址中的0终止了我溢出的strcpy函数


我完全控制系统和可执行文件。有没有办法强制以更高的内存地址加载共享库,这样我就可以避免地址空间中的0?

它比这更基本:
当AMD发明x86-64时,他们强制使用规范地址。虽然理论上有64位的地址空间,但当前的x86-64处理器并没有公开所有的地址空间。例如,我的cpu告诉我它有cat/proc/cpuinfo:地址大小:39位物理,48位虚拟。由于虚拟地址的上半部分是为内核保留的,因此无法删除用户空间中最上面的空字节。

程序及其共享库的地址将与页面对齐。他们地址中的一些最低有效位将为零。@JohnBollinger:ROP小工具可能不会对齐…@EOF,也许是这样,但问题是关于共享库的加载地址。但是,如果有办法做到这一点,那就是通过一个修改过的动态链接器。@JohnBollinger:不,这是关于外壳代码中编码的ROP小工具的地址,不包含'\0'-字节。@EOF,也许这是他真正想要的,但他要求有一种方法来强制以更高的内存地址加载共享库。我不知道如何解释,除了作为一个问题的加载地址的图书馆。这是令人失望的,但感谢你的信息!我现在只需要更改它并使用memcpy。