Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
start:
push 1
push offset comm1
call WinExec ; !!!!!
push 0
call ExitProcess
comm1 db 'cmd',0
end start
end
Теперь нам необходимо разобраться, как выглядит стек внутри функции WinExec. Рассмотрим схему стека внутри WinExec (вызов данной функции отмечен восклицательными знаками).
Для построения нашей атаки нам наиболее важны значения, отмеченные восклицательными знаками. Первый же параметр можно упустить.
Перейдём к конструированию нашей атаки. Мы должны так переполнить буфер, чтобы при возвращении из функции мы попали прямиком в WIN API-функцию с заполненным стеком. И самое главное, что стек должен быть заполнен корректно для вызова cmd.exe.
Разберём схему построения данной атаки:
n Подготавливается имя программы («cmd»), мусор и вычисляются номера байтов, которые перетирают адрес возврата.
n Вычисляется адрес строки при помощи отладчика так, чтобы он указывал на строку «cmd» в стеке.
n Вычисляются адреса функций: WinExec, ExitProcess.
n Затем подготовленный буфер, содержащий имя программы («cmd»), мусорные байты, новый адрес строки и адреса функций, передаётся уязвимой программе.
Рассмотрим схему стека при реализации данной атаки:
Как вы можете видеть по схеме стека, в момент атаки мы упустили первый параметр функции WinExec. А также мы поставили адрес функции ExitProcess в качестве адреса возврата из функции WinExec. После того, как консоль будет запущена, управление будет передано на функцию ExitProcess, которая корректно завершит процесс.
Теперь рассмотрим простую уязвимую программу и построим для неё эксплоит, работающий через неисполнимый стек.
Рассмотрим листинг:
#include <stdio.h>
#include <windows.h>
void vuln_func(char *stroka)