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


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


 

main   proc near           ; CODE XREF: start+AFp

push   ebp

mov    ebp, esp

 

push   offset aHelloWorld ; const char *

; Заносим в стек указатель на строку aHelloWorld.

; Заглянув в исходные тексты (благо они у нас есть), мы обнаружим, что

; это – самый правый аргумент, передаваемый функции. Следовательно,

; перед нами вызов типа stdcall или cdecl, но не PASCAL.

; Обратите внимание – строка передается по ссылке, но не по знаниючению.

 

push   777h         ; int

; Заносим в стек еще один аргумент - константу типа int.

; (IDA начиная с версии 4.17 автоматически определяет ее тип).

 

push   666h         ; int

; Передаем функции последний, самый левый аргумент, – константу типа int

 

call   MyFunc

; Обратите внимание – после вызова функции отсутствуют команды очистки стека

; от занесенных в него аргументов. Если компилятор не схитрил и не прибегнул

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

; значит, тип вызова – stdcall (что, собственно, и требовалось доказать)

 

push   eax

; Передаем возвращенное функцией значение следующей функции как аргумент

 

push   offset asc_406040 ; "%x\n"

call   _printf

; ОК, эта следующая функция printf, и строка спецификаторов показывает,

; что переданный аргумент имеет тип int

 

add    esp, 8

; Выталкивание восьми байт из стека – четыре приходятся на аргумент типа int

; остальные четыре – на указатель на строку спецификаторов

 

pop    ebp

retn

main   endp

 

; int __cdecl MyFunc(int,int,const char *)

MyFunc       proc near           ; CODE XREF: sub_40101D+12p

; С версии 4.17 IDA автоматически восстанавливает прототипы функций, но делает это

; не всегда правильно. В данном случае она допустила грубую ошибку – тип вызова

; никак не может иметь тип cdecl, т.к. стек вычищает вызываемая функция! Сдается, что

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

; распознанного компилятора по умолчанию.




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