Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #84, ДЕКАБРЬ 2005 г.

SoftICE как логгер

крис касперски ака мыщъх

Хакер, номер #084, стр. 084-112-5


Чтобы осуществить задуманное, мы должны сделать следующее:

* поместить машинный код нашей функции выше вершины стека;

* сохранить текущее значение регистра EIP и регистра флагов (например, в том же стеке);

* сохранить все регистры, которые изменяет наша функция;

* установить EIP на начало нашей функции;

* тем или иным образом передать аргументы (например, через регистры);

* выполнить функцию, возвратив результат работы, например, через EAX;

* проанализировать возвращенное значение, выполнив те или иные операции;

* восстановить измененные регистры;

* восстановить регистр EIP и регистр флагов;

* продолжить нормальное выполнение программы.

Звучит устрашающе, но ничего сложного в этом нет. Давай для начала попытаемся выполнить функцию XOR EAX,EAX/RET. Как перевести ее в машинный код? Можно, конечно, воспользоваться HIEW'ом или даже FASM'ом, но зачем выходить из SoftICE? Достаточно переместиться в любое свободное место памяти и дать команду 'a' (assemble - то есть ассемблировать), только предварительно убедись, что ты находишься в контексте отлаживаемого приложения (его имя отображается в правом нижнем углу экрана), а не в ядре, иначе случится крах.

[ассемблирование нашей функции в SoftICE]

:a esp-10

0023:0012B0DC xor eax,eax

0023:0012B0DE ret

0023:0012B0DF

:d esp-10

0023:0012B0DC 33 C0 C3 00 DB 80 FB 77-88 AE F8 77 FF FF FF FF 3......w...w....

0023:0012B0EC 31 D8 43 00 E8 59 48 00-00 00 00 C0 03 00 00 00 1.C..YH.........

Теперь программа лежит на стеке, но вот как ее исполнить? Да очень просто! Сказать 'G esp-10' (перейти к адресу esp-10) и пусть процессор выкручивается как может. Только ведь хрен он выкрутится. Чтобы возвратить управление в текущее место отлаживаемой программы, необходимо предварительно сохранить регистр EIP, а сделать это не так-то просто. Команда 'E (esp-10) EIP' не работает, поскольку не допускает использования выражений (а имя регистра - это выражение) и обламывает нас по полной syntax error. Как быть? Кого мочить? Что делать?!

А давай воспользуемся командой 'M' (move), копирующей блоки памяти из одного адреса в другой. Тогда мы сможем сохранить кусочек оригинальной программы на стеке, а саму программу модифицировать по своему усмотрению. Мы должны будем записать PUSH EAX/MOV EAX,ESP/SUB EAX,10h/CALL EAX. Короче, нам нужна команда CALL ESP-N, поскольку такой команды в лексиконе x86 процессоров нет и никогда не существовало, нам приходится ее эмулировать через математические преобразования с любым дополнительным регистром, например, EAX. В машинном коде это выглядит так: "50h/8Bh C4h/83h E8h 10h/FFh D0h".

Копируем кусок отлаживаемой программы на стек: 'M EIP L 10 ESP-20', где 'ESP-20' - адрес-приемник, лежащий выше указателя вершины стека и не затирающий нашу машинную программу. Теперь модифицируем окрестности отлаживаемой программы: 'ED EIP 83C48B50; ED EIP+4 D0FF10E8'. Как видно, это тот же самый код, только набранный задом наперед, потому что в x86 процессорах младший байт располагается по меньшему адресу.

Назад на стр. 084-112-4  Содержание  Вперед на стр. 084-112-6