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



         

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


; загружаем переданный функции аргумент в EAX

fld    dword ptr [eax+14h]

; загружаем в стек FPU вещественное значение, находящееся по смещению

; 0x14 относительно указателя EAX

; Таким образом, во-первых, EAX (аргумент, переданный функции) – это указатель

; во-вторых, это не просто указатель, а базовый указатель, использующийся

; для доступа к элементам структуры или массива.

; Запомним тип первого элемента (вещественное значение) и продолжим анализ

sub    esp, 8

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

fstp   [esp+8+var_8]

; перепихиваем считанное вещественное значение в локальную переменную var_8

mov    ecx, [ebp+arg_0]

; Загружаем в ECX значение переданного функции указателя

mov    edx, [ecx+10h]

; загружаем в EDX значение, лежащее по смещению 0x10

; Ага! Это явно не вещественное значение, следовательно, мы имеем дело со

; структурой

push   edx

; заталкиваем только что считанное значение в стек

mov    eax, [ebp+arg_0]

push   eax

; получаем указатель на структуру (т.е. на ее первый член)

; и запихиваем его в стек. Поскольку ближайший элемент

; находится по смещению 0x10, то первый элемент структуры по-видимому

; занимает все эти 0x10 байт, хотя это и не обязательно – возможно остальные

; члены структуры просто не используются. Установить: как все обстоит на самом

; деле можно, обратившись к вызывающей (материнской) функции, которая и

; инициализировала эту структуру, но и без этого, мы можем восстановить

; ее приблизительный вид

; struct xxx{

; char x[0x10] || int x[4] || __int16[8] || __int64[2];

; int y;

; float z;

; }

push   offset aSXF  ; "%s %x %f\n"

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

; это, бесспорно, char x[x010], поскольку, он выводится как строка,

; следовательно наше предварительное предположение о формате структуры –

; верное!

call   printf

add    esp, 14h

pop    ebp

retn  

funct  endp




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