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


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


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

 

#include <stdio.h>

#include <string.h>

 

struct XT{

char s0[20];

int x;

};

 

void MyFunc(double a, struct XT xt)

{

printf("%f,%x,%s\n",a,xt.x,&xt.s0[0]);

}

 

main()

{

struct XT xt;

strcpy(&xt.s0[0],"Hello,World!");

xt.x=0x777;

MyFunc(6.66,xt);

}

 

Листинг 56 Демонстрация механизма передачи аргументов

 

Результат его компиляции компилятором Microsoft Visual C++ с настройками по умолчанию выглядит так:

 

main   proc near           ; CODE XREF: start+AFp

 

var_18       = byte ptr -18h

var_4        = dword      ptr -4

 

push   ebp

mov    ebp, esp

sub    esp, 18h

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

 

push   esi

push   edi

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

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

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

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

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

 

push   offset aHelloWorld ; "Hello,World!"

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

; (строго говоря, предположительно

имеет место, - см. "Идентификация констант")

; Хотя теоретически возможно временное сохранение константы в стеке для ее

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

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

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

 

lea    eax, [ebp+var_18]

; в EAX заносится указатель на локальный буфер




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



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