Итак, купил вумную книжку "The Shellcoders Handbook: Discovering and Exploiting Security Holes". Пытаюсь разобраться с примерами из книжки на практике. Возникла проблема с первым же примером.
PHP код:
void return_input()
{
char array[30];
gets(array);
printf("%s\n", array);
}
main()
{
return_input();
return 0;
}
Хочу вызвать функцию return_input() дважды, при помощи gdb узнаю её адрес "0x8048594".
Потом (если я прав), смотрю результат дизассемблирования функции return_input(), для того, чтобы понять сколько места резервируется в стеке, вижу:
Код:
0x08048594 <return_input+0>: push %ebp
0x08048595 <return_input+1>: mov %esp,%ebp
0x08048597 <return_input+3>: sub $0x28,%esp
0x0804859a <return_input+6>: sub $0xc,%esp
0x0804859d <return_input+9>: lea 0xffffffd8(%ebp),%eax
....
Если я прав, то мне нужно число 0x28 (40 в 10й системе) и к этому числу надо прибавить 8, для того чтобы переписать указатели ebp и eip. Или мне нужно (0x28+0xC)+8??
В общем пишу программулинку, которая тупо переписывала бы адреса:
PHP код:
main()
{
int i=0;
char stuffing[48];
for (i=0;i<=44;i+=4)
*(long*)&stuffing[i] = 0x8048594;
puts(stuffing);
}
В итоге когда её выход перенаправляю в уязвимую программу всё равно вижу "Segmentation fault (core dumped)".
Смотрю состояние регистров, ebp переписался значением 0x8048594, а в eip лежит 0x1. Почему? Что я не так делаю?
__________________
Я отдал бы немало за пару крыльев,
Я отдал бы немало за третий глаз
За руку на которой четырнадцать пальцев
Мне нужен для дыхания другой газ..
Мой блог:
http://qwazar.ru/.