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



         

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


; Т.е. это явно не char, но и не указатель (2-странное значение для указателя)

mov    cl, 1

; Через cl передается первый слева аргумент типа char

;(лишь у переменных типа char размер 8 бит)

;

call   MyFunc

; Уже можно восстановить прототип функции MyFunc(char, int, int, int)

; Да, мы ошиблись и тип long int приняли за int, но, поскольку в компиляторе

; Microsoft Visual C++ эти типы идентичны, такой ошибкой можно пренебречь

push   eax

; Передаем полученный результат функции printf

push   offset asc_406030 ; "%x\n"

call   _printf

add    esp, 8

xor    eax, eax

pop    ebp

retn

main         endp

MyFunc       proc near           ; CODE XREF: main+Ep

var_8        = dword      ptr -8

var_4        = byte ptr –4

arg_0        = dword      ptr  8

arg_4        = dword      ptr  0Ch

; Через стек функции передавались лишь два аргумента и их успешно распознала IDA

push   ebp

mov    ebp, esp

sub    esp, 8

; Резервируем 8 байт для локальных переменных

mov    [ebp+var_8], edx

; Регистр EDX не был явно инициализирован до того загрузки в

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

; Поскольку эта программа была скомпилирована компилятором Microsoft Visual C,

; а он, как известно, передает аргументы в регистрах ECX:EDX можно сделать

; вывод, что мы имеем дело со вторым, считая слева, аргументом функции

; и где-то ниже по тексту нам должно встретиться обращение к ECX

– первому

; слева аргументу функции.

; (хотя не обязательно – первый аргумент функцией может и не использоваться)

mov    [ebp+var_4], cl

; Действительно, обращение к CL не заставило должно себя ждать. Поскольку,

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

; Некоторая неуверенность вызвана тем, что функция может просто обращаться

; к младшему байту аргумента типа int, скажем.

; Однако, посмотрев на код вызывающей функции, мы можем убедиться, что




Содержание  Назад  Вперед