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


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


; [ESP], т.е. вещественная переменная стягивается прямо на вершину стека.

; А что у нас на вершине? Два аргумента, переданных MyFunc

и так и не

; вытолкнутых из стека. Какой хитрый компилятор! Он не стал создавать локальную

; переменную, а использовал аргументы функции для временного хранилища данных!

 

call   _printf

add    esp, 0Ch

; Выталкиваем со стека три машинных слова

 

pop    ebp

retn

main   endp

 

 

MyFunc       proc near           ; CODE XREF: sub_401011+12p

 

var_4        = dword      ptr -4

arg_0        = dword      ptr  8

arg_4        = qword      ptr  0Ch

; Смотрим – IDA обнаружила только два аргумента, в то время как функции передавалось

; три машинных слова! Очень похоже, что один из аргументов занимает 8 байт...

 

push   ebp

mov    ebp, esp

; Открываем кадр стека

 

push   ecx

; Нет, это не сохранение ECX – это резервирование памяти под локальную

; переменную. Т.к. на том месте, где лежит сохраненный ECX

находится

; переменная var_4.

 

fld    [ebp+arg_0]

; Затягиваем на стек сопроцессора вещественную переменную, лежащую по адресу

; [ebp+8] (первый слева аргумент). Чтобы узнать тип этой переменной, смотрим

; опкод инструкции FLD - D9 45 08. Ага, D9 – значит, float

; Выходит, первый слева аргумент – float.

 

fadd   [ebp+arg_4]

; Складываем arg_0 типа float со вторым слева аргументом типа... Вы думаете,

; раз первый был float, то и второй так же будет float-ом?

; А вот и не обязательно! Лезем в опкод - DC 45 0C, значит, второй аргумент

; double, а

не float!

 

fst    [ebp+var_4]

; Копируем значение с верхушки стека сопроцессора

;(там лежит результат сложения) в локальную переменную var_4.

; Зачем? Ну... мало ли, вдруг бы она потребовалась?

; Обратите внимание – значение не стягивается, а копируется! Т.е. оно все еще

; остается в стеке. Таким образом, прототип функции MyFunc

выглядел так:

; double MyFunc(float a, double b);

 

mov    esp, ebp

pop    ebp   




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