缓冲区溢出实验中EIP指向正确NOP地址但出现SIGSEGV报错是什么原因
缓冲区溢出跳转到NOP地址触发段错误的原因排查
你遇到的报错如下:
Program received signal SIGSEGV, Segmentation fault. 0xffffcf7c in ?? ()
该报错且地址正好对应NOP sled的起始地址,通常是以下几类原因导致:
- NX/DEP栈不可执行保护开启:这是最高发的原因。当前主流操作系统默认开启NX(Linux)/DEP(Windows)保护机制,会将栈所在的内存页标记为仅可读写、不可执行。CPU尝试执行栈上的NOP指令时,会因为权限不匹配直接触发段错误。你可以在编译目标程序时添加
-z execstack参数关闭该程序的NX保护,再重新测试。 - 架构不匹配:如果目标程序是32位架构,但你使用了64位的shellcode,或者在64位环境下没有正确配置32位运行依赖,哪怕地址正确,也会因为指令集不兼容触发执行错误。测试前需要确认目标程序架构、shellcode架构、运行环境的依赖完全匹配。
- 溢出数据结构错误:如果你的Payload构造逻辑有误,比如填充的溢出字节长度计算错误,在覆写EIP之后的内容意外覆盖了已经写入栈中的NOP sled和shellcode本身,跳转后访问的内存实际已经被垃圾数据覆盖,也会触发段错误。你可以在gdb中跳转前打印对应地址的内存内容,确认NOP和shellcode是否完整。
- 系统ASLR未完全关闭:部分版本的gdb不会完全禁用系统级ASLR,哪怕你填写的是静态计算的地址,实际运行时栈的基地址也可能发生小范围偏移,导致跳转地址指向无权限的内存页。Linux环境下可以执行
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space临时关闭全局ASLR后再测试。
内容的提问来源于stack exchange,提问作者Sara Bean
相关产品推荐
相关产品推荐

