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

Shell生成程序Segfault问题:movb $0,7(%ebx)指令报错原因排查

分析Shellcode中movb $0,7(%ebx)触发段错误的原因

首先得帮你理清一个关键误解:你这里的ebx根本不是栈基指针,它指向的是只读数据段里的字符串地址,这就是你触发段错误的核心原因!

咱们拆解下你的代码流程:

  • jmp payload+0x28 这行应该是跳转到你嵌入的字符串(比如/bin/sh这类)的位置,而这个字符串后面紧接着就是payload的代码。
  • 当执行到popl %ebx时,栈顶的内容正好是这个字符串的起始地址——但问题来了:如果这个字符串是你硬编码到程序里的,编译后它会被放到只读数据段(.rodata)或者文本段(.text),这些内存页是被操作系统标记为只读的。
  • 你执行movb $0,7(%ebx)时,本质是在尝试修改只读内存里的内容,操作系统自然会抛出段错误来阻止这种非法操作。

你之所以误以为ebx指向栈区域,应该是混淆了ebx和ebp的用途——ebp通常用作栈基指针,但你这里的ebx是通过pop指令获取的字符串地址,完全和栈区域无关。

怎么解决?

你需要把字符串放到可读写的栈内存里,而不是只读段。比如可以用push指令把字符串的字节逆序压栈(因为栈是向下生长的),然后让ebx指向栈顶的这个字符串:

push $0x68732f2f  ; 压入"//sh"
push $0x6e69622f  ; 压入"/bin"
movl %esp, %ebx   ; ebx指向栈上的"/bin//sh"字符串
movb $0,7(%ebx)   ; 现在修改就没问题了,因为栈是可读写的

这样修改后,ebx指向的是栈上的可读写区域,执行修改指令就不会触发段错误了。


内容的提问来源于stack exchange,提问作者user406955

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:33:15