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


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


Причем, если функция при своем нормальном завершении возвращает ноль (как часто и бывает) все может работать… Чтобы вывить такого жука, исследователю придется проанализировать алгоритм – действительно ли в EAX помещается код успешности завершения функции или же имеет место "наложение" переменных?

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

 

::практическое исследование механизма передачи аргументов через регистры. Для закрепления всего вышесказанного, давайте рассмотрим следующий пример. Обратите внимание на директивы условной компиляции, вставленные для совместимости с различными компиляторами:

 

#include <stdio.h>

#include <string>

 

#if defined(__BORLANDC__) || defined (_MSC_VER)

// Эта ветка компилируется только компиляторами Borland C++ и Microsoft C++,

// поддерживающими ключевое слово fastcall

__fastcall

#endif

 

// Функция MyFunc с различными типами аргументов для демонстрации механизма

// их

передачи

MyFunc(char a, int b, long int c, int d)

{

 

#if defined(__WATCOMC__)

// А эта ветка специально предназначена для WATCOM C.

// прагма aux принудительно задает порядок передачи аргументов через

// следующие регистры: EAX ESI EDI EBX

#pragma aux MyFunc parm [EAX] [ESI] [EDI] [EBX];

#endif

return a+b+c+d;

}

 

main()

{

 

printf("%x\n",MyFunc(0x1,0x2,0x3,0x4));

return 0;

}

Листинг 70

Результат компиляции этого примера компилятором Microsoft Visual C++ 6.0 должен выглядеть так:

 

main         proc near           ; CODE XREF: start+AFp

push   ebp

mov    ebp, esp

 

push   4

push   3

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

; туда справа налево и вычищает их оттуда вызываемая функция

; (т.е. все происходит как по stdcall

соглашению)

 

mov    edx, 2

; Через EDX передается второй слева аргумент.

; Легко определить его тип – это int.




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



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