Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #32, ИЮЛЬ 2003 г.

КОГДА В МАЛЕНЬКОЕ ПЫТАЮТСЯ ЗАПИХАТЬ БОЛЬШОЕ...

Vint(vint@townnet.ru)

Спецвыпуск Xakep, номер #032, стр. 032-052-2


А делается вся эта замутка с одной хитрой целью: NT'шные винды, как и юнихи, используют политику учетных записей, то есть у каждого юзера есть учетная запись, в которой прописаны права юзера на эту систему. У кого они выше, тот и крут. Так, в виндах самый крутой - Администратор, а у юнихов - Root. У всех остальных юзеров права на систему гораздо меньше. Так вот, эти обездоленные, чтобы получить права администратора, используют атаку на переполнение буфера. То есть перцу необходимо переполнить буфер в каком-либо из процессов, запущенном с правами администратора или на системном уровне, перезаписать буфер своим кодом и выполнить его, тогда код простого юзера выполнится с правами root'а, так как процесс запущен с админскими правами.

В NT'ях через овердоз буфера можно запустить командную строку с наивысшими правами "SYSTEM". Если процесс в Виндовс NT создает дочерний процесс, то обычно ему даются права родителя. Однако некоторые процессы могут создаваться с использованием Win32 функции CreateProcessAsUser (), которая создает процесс-дочку от имени другого чела, а значит, это дите будет иметь такие же права, как и юзер, от имени которого его создали. Все это возможности для получения админских прав через переполнение буфера.

ТРАБЛЫ ОВЕРДОЗА

После теории топаем к практике. Основные моменты создания ЛЮБОГО эксплоита, юзающего дыру переполнения буфера, выглядят примерно так:

1. Необходимо найти узкое место в программе или ОС. Это достигается либо анализом кода, либо банальным методом научного тыка: "А что будет, если послать переменной не 5, а 50 байт?"

2. Дизассемблирование дырявого участка кода - необходимо для разведки места дислокации баги.

3. Небольшой анализ, куда лучше закинуть злостный код.

4. Написание сего кода на асме. Соображение строки, переполняющей буфер, с учетом злостного кода, то бишь надо включить ссылку или сам код в строку переполнения.

5. Написание софтины, которая автоматически переполняет буфер и передает управление твоему коду.

И все! Сейчас у нас в руках готовый эксплоит, который работает очень просто: при запуске находит дырявое приложение, некими манипуляциями переполняет буфер (стек), а затем твой вредный кусочек в буфере получает управление.

Немного расскажу о написании самого хитрого кусочка. Для создания машинного кода, на который передаст управление переполнившийся буфер, надо:

Во-первых, выяснить примерный адрес верхушки стека на данном компе при вызове функций, чтобы корректно сформировать адрес возврата, который попадет в поле RETADR. Обычно эксплоиты выполняют это с помощью вызова пустой функции, возвращающей в качестве параметра значение верхушки стека.

Назад на стр. 032-052-1  Содержание  Вперед на стр. 032-052-3