LINUX.ORG.RU

Выполнение многократного переполнения буфера


0

0

Вопрос на понимание. Вижу, что работает, не понимаю, почему.

Дано: прога с уязвимостью test void func (void) { gets (small); printf ("%s\n", small); }

int main (void){ func (); return (0); }

Дано: прога, формирующая буфер proc int main (void){ int i = 0; char buf[56]; memset (buf, 0x20, 34); for (i = 32; i <= 52; i += 4) // Адрес функции func в исполняемом test *(long *) &buf[i] = 0x83a40804; //gdb test; disas main puts (buf); return (0); }

Запуск в баше: 1) ./test string string 2) ./proc 8

Далее: (./proc;cat) | ./test 8 1 1 2 2 ... 6 Ошибка переполнения

Т.е. один раз переполнили буфер, а дальше подавали инфу с cat

Понятно, что на промежутке i = 32 <= 52 адрес уложили 6 раз, но почему сработало? Не могу осознать механизм "подтягивания" того, что оказалось за пределами буфера с каждым новым вызовом func.

можешь хотя бы на строчки разбить? Запости исходные файлы так, что бы можно было одним махом копи-пейстнуть в терминал:

cat > file.c << EOF
#include stdio.h
....
EOF

cat > file2.c

...
и в том же духе. А то глаза сломаешь читать.

gods-little-toy ★★★
()

Я, возможно, чего-то не понимаю, но программа test прочла строку, имеющую большую длину чем буфер small. Потому и упала.

Все остальное не имеет отношения к ситуации.

anonymous
()
Ответ на: комментарий от anonymous

> Я, возможно, чего-то не понимаю, но программа test прочла строку, > имеющую большую длину чем буфер small. Потому и упала. > Все остальное не имеет отношения к ситуации.

Собственно, ситуация в том, что мне _нужно_, чтобы программа упала 6 раз подряд.

Correra
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.