在理解二进制文件(虚拟内存布局、执行...等)的方式中,我写了一个C
声明一个全局字符串的代码,其中包含可执行代码的字节,然后我覆盖了返回地址main()
通过声明一个指针(PTR
) in main()
这是保留在堆栈上的本地内存区域,距离返回地址较远 2 个字main()
,所以我所做的就是将返回地址的地址分配给该指针(PTR=(int*)&PTR+2)
然后用可执行代码的地址(静态字符串)覆盖该地址的内容。
现在的困境是,每当我编译并执行时,我都会收到一个分段故障。
可执行代码不占用内存input/output
(它只是一堆NOPs
).
使用 GDB,我确保该过程完美运行:返回地址更改为字符串的地址,但返回从未发生。
我所知道的是可执行代码被映射到虚拟内存中标记的页面RW
(.data
& .bss
段)所以也许没有办法执行这样的代码,除非代码被注入到executable
内存区域(标记的页面RE
)。这就是我关于这个主题的理论,我邀请您提供更多细节。
char code[]="\x90\x90\x90\x90\x90\x90\x90\x90"; //a static string contains executable code
int main()
{
int *return_address; //Pointer to the return address - uninitialized
return_address = (int *)&return_address + 2; //Initializing the return address - according to stack layout
(*return_address) = (int)code; //Overwriting the return address with the code's address
}
我收到分段错误。
它是数据执行预防的硬件控制(https://en.wikipedia.org/wiki/Executable_space_protection#Linux https://en.wikipedia.org/wiki/Executable_space_protection#Linux) - 如果页表中没有设置“x”(执行)位,则不能直接跳转到数据页。所有位的内存映射都列在/proc/$pid/maps
/ /proc/$pid/smaps
文件为“rwx”表示可写代码,“rw-”表示不执行的数据,“r--”表示只读数据,“r-x”表示普通代码。
如果你想执行数据,你应该调用mprotect
系统调用与PROT_EXEC
标记想要成为代码的数据部分。
在 x86 世界中,这完全实现为“NX位”/“XD位”功能 https://en.wikipedia.org/wiki/NX_bitPentium 4 (Prescott) 及更新版本(Core、Core2、Core i*、core m)/Athlon 64 / Opteron 及更新版本。如果操作系统工作在32位模式,则必须打开PAE才能在页表中包含该位。在 x86_64 模式(64 位)中,始终支持 NX/XD 位。
第一个支持变体在 2004 年左右被添加到 Linux 中:http://linuxgazette.net/107/pramode.html http://linuxgazette.net/107/pramode.html
在 2007 年,您可能拥有过时的硬件、旧的内核或没有 PAE 的 32 位模式内核。
有关 NX/XD 钻头的信息:https://en.wikipedia.org/wiki/NX_bit https://en.wikipedia.org/wiki/NX_bit
有时'rwx'模式可能被禁止,检查https://en.wikipedia.org/wiki/W^X https://en.wikipedia.org/wiki/W%5EX.
对于 NX 之前的系统,有基于 x86 段寄存器的解决方案来部分禁用部分内存空间的执行。
我可以在没有分段错误的情况下执行上面的程序吗?
你可以:
- 通过调用使数据页可执行
mprotect
其上与PROT_READ|PROT_EXEC
- 将elf文件的数据段标记为可执行文件(需要深入内部
ld
脚本 - 默认位于ld --verbose
)
- 使所有页面包括
.data
和堆可执行文件(不仅仅是堆栈)
与 ld 或 gcc-z execstack
- 将 shellcode 移动到 elf 文件的文本数据中
- 尝试禁用内核中的 nx/xd 位(困难;可能需要重新编译)
- 使用未启用 PAE 选项(构建时间选项)的 32 位操作系统(内核)。
- 使用没有 NX/XD 的旧 CPU
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)