Фундаментальные основы хакерства


Идентификация аргументов функций - часть 14


На что он указывает?

; Вспомним, что тип int находится в структуре по смещению 0x14 байт от начала,

; а ARG_8 – и есть ее начало. Тогда, 0x8+0x14 == 0x1C.

; Т.е. в ECX заносится значение переменной типа int, члена структуры

 

push   ecx

; Заносим полученную переменную в стек, передавая ее по значению

; (по значению – потому что ECX хранит значение, а не указатель)

 

mov    edx, [ebp+arg_4]

; Берем один их тех двух непонятных аргументов, занесенных последними в стек

 

push   edx

; ...и, вновь заталкиваем в стек, передавая его очередной функции.

 

mov    eax, [ebp+arg_0]

push   eax

; Берем второй непонятный аргумент и пихаем его в стек.

 

push   offset aFXS  ; "%f,%x,%s\n"

call   _printf

; Опа! Вызов printf с передачей строкой спецификаторов! Функция, printf,

; как известно, имеет переменное число аргументов, тип и количество которых

; как раз и задают спецификаторы.

; Вспомним, – сперва в стек мы заносили указатель на строку, и действительно,

; крайний правый спецификатор "%s" обозначает вывод строки.

; Затем в стек заносилась переменная типа int

и второй справа спецификатор

; есть %x – вывод целого в шестнадцатеричной форме.

; А вот затем... затем идет последний спецификатор %f, в то время как в стек

; заносились два аргумента.

; Заглянув в руководство программиста по Microsoft Visual C++, мы прочтем,

; что спецификатор %f выводит вещественное значение, которое в зависимости от

; типа может занимать и четыре байта (float), и восемь (double).

; В нашем случае оно явно занимает восемь байт, следовательно, это double

; Таким образом, мы восстановили прототип нашей функции, вот он:

; cdecl MyFunc(double a, struct B b)

; Тип вызова cdecl – т.е. стек вычищала вызывающая функция. Вот только, увы,

; подлинный порядок передачи аргументов восстановить невозможно. Вспомним,

; Borland C++ так же вычищал стек вызывающей функцией, но самвовольно изменил

; порядок передачи параметров.

; Кажется, если программа компилилась Borland C++, то мы просто изменяем




- Начало -  - Назад -  - Вперед -



Книжный магазин