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



         

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


{

return a+b;

}

__int64 int64_func(__int64 a, __int64 b)

{

return a+b;

}

int* near_func(int* a, int* b)

{

int *c;

c=(int *)malloc(sizeof(int));

c[0]=a[0]+b[0];

return c;

}

main()

{

int a;

int b;

a=0x666;

b=0x777;

printf("%x\n",

char_func(0x1,0x2)+

int_func(0x3,0x4)+

int64_func(0x5,0x6)+

near_func(&a,&b)[0]);

}

Листинг 89 Пример, демонстрирующий механизм возвращения основных типов значений

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

char_func    proc near           ; CODE XREF: main+1Ap

arg_0         = byte ptr  8

arg_4        = byte ptr  0Ch

push   ebp

mov    ebp, esp

; Открываем кадр стека

movsx  eax, [ebp+arg_0]

; Загружаем в EAX arg_0 тип signed char, попутно расширяя его до int

movsx  ecx, [ebp+arg_4]

; Загружаем в EAX arg_0 тип signed char, попутно расширяя его до int

add    eax, ecx

; Складываем arg_0 и arg_4 расширенные до int, сохраняя их в регистре EAX -

; это есть значение, возвращаемое функцией.

; К сожалению, достоверно определить его тип невозможно. Он с равным успехом

; может представлять собой и int и char, причем, int даже более вероятен,

; т.к. сумма двух char по соображениям безопасности должна помещаться в int,

; иначе возможно переполнение.

pop    ebp

retn

char_func    endp

int_func     proc near           ; CODE XREF: main+29p

arg_0        = dword      ptr  8

arg_4        = dword      ptr  0Ch

push   ebp

mov    ebp, esp

; Открываем кадр стека

mov    eax, [ebp+arg_0]

; Загружаем в EAX значение аргумента arg_0 типа int

add    eax, [ebp+arg_4]

; Складываем arg_0 с arg_4 и оставляем результат в регистре EAX.

; Это и есть значение, возвращаемое функцией, вероятнее всего, типа int.

pop    ebp

retn

int_func     endp

int64_func   proc near           ; CODE XREF: main+40p




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