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
相关产品推荐
相关产品推荐

