Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Станислав Гошко
Атаки на переполнение буфера за последние 10 лет получили громадное распространение. Практически во всех современных операционных системах предусматривается защита от данных атак (Black Cat, Sun...). Поэтому не за горами то время, когда данная защита появится и у Windows-систем. В данной статье будет рассматриваться атака на переполнение буфера через неисполнимый стек.
Рассмотрим, чем отличается обычное переполнение буфера от переполнения буфера через неисполнимый стек.
Большинство атак на переполнение буфера строятся по следующей схеме:
n Подготавливается мусор и вычисляются номера байтов, которые перетирают адрес возврата.
n Подготавливается исполнимый код в качестве буфера.
n Вычисляется адрес возврата при помощи отладчика, так, чтобы он указывал на исполнимый код в стеке.
n Затем подготовленный буфер, содержащий мусорные байты, новый адрес возврата и исполнимый код передаются уязвимой программе.
Рассмотрим на схеме, как выглядит стек уязвимой программы в момент проведения обычной атаки на срыв стека:
Как вы могли заметить, исполнение shell-кода происходит прямо в стеке. Большинство защит ориентировано на то, чтобы воспрепятствовать выполнению кода в стеке, и данная защита очень хорошо работает против большинства эксплоитов.
Теперь для понимания функционирования эксплоитов, использующих атаку через неисполнимый стек, рассмотрим простую программу, которая вызывает через WinExec программу – «cmd.exe».
На языке С++ она бы выглядела так:
#include <windows.h>
void main ()
{
WinExec("cmd",1);
}
В данной программе не видно вызова функции ExitProcess, так как компилятор C++ сам заботится о корректном завершении программы.
Рассмотрим аналогичную программу на языке ассемблера:
.386
.model flat, stdcall
extrn ExitProcess:proc
extrn WinExec:proc
.data
dd 0
.code