You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

缓冲区溢出实验中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:15:06