Читаем Атака на Internet полностью

Для гарантированного отказа в обслуживании недостаточно подать на вход очень длинную строку, тем самым переполнив любой из потенциальных буферов. Дело в том, что начиная с некоторой длины такие строки могут не вызывать необходимого переполнения буфера, а приводить к другим ошибкам и иногда вообще никак не проявляться в работе программы. Иначе говоря, хакер, готовя переполнение буфера, ограничен максимальным размером кода, который он сможет выполнить. Тем не менее разумно подбирать длину буфера, начиная с больших величин.

Осталось подытожить, какие операционные системы могут подвергаться технологии переполнения буфера. Явно или неявно, но мы предполагали, что:

• параметры функций передаются через стек;

• адрес возврата также помещается в стек;

• локальные переменные располагаются в стеке;

• стек «растет» вниз;

• данные в стеке могут интерпретироваться как команды;

• должны существовать процессы или программы, имеющие уязвимый код, подобный функции process_data();

• некоторые процессы или функции должны иметь высокие привилегии.

Очевидно, что этим условиям удовлетворяет большинство ОС, в том числе UNIX и Windows NT.

И напоследок – переполнение буфера в стеке является тривиально используемой уязвимостью. Однако, если пытаться избавиться от таких уязвимостей простым переписыванием строк кода типа

char buf[FIXED];

на

static char buf[FIXED];

или

buf = (char *) malloc (FIXED);

Перейти на страницу:

Похожие книги