Например, когда мы используем %64d
в printf
, означает ли это, что 64 байта данных с содержимым кода ASCII для пространства сохраняются в стеке из-за этого %64
?(чтобы передать параметры в printf
)?
Я спрашиваю это, потому что я смотрел видео, где парень набрал более 100 миллионов пробелов для использования эксплойта строки формата (чтобы затем использовать %n
и поэтому пишите конкретный адрес в это место), но я не понимаю, как кто-то может использовать более 100-150 МБ данных (пробелов) в стеке, не выходя за пределы стека?Я думал, что выполнение этого в Linux вызовет ошибку сегмента?
Если наша программа простая printf
, то обычно, как долго мы можем идти вверх (в Linux), пока не достигнем конца стека и, таким образом, вызвать ошибку сегмента?
И также,не вызовет ли это проблемы с нашей программой, если мы перезапишем содержимое начала в стеке?Я думал, что это важные вещи, которые нужны программе, такие как переменные env и тому подобное?
Видео, о котором я говорю (оно в конце видео):
https://www.youtube.com/watch?v=t1LH9D5cuK4&t=616s
также в других видео, в которых нет также строки, переданной основной функции, строка формата, которую мы вставили, все еще находится в стеке, а не в куче (используя gdb для показа стека)