例如,当我们使用%64d
in时printf
,这是否意味着包含 ASCII 码内容的 64 字节数据因此被存储在堆栈中%64
?(将参数传递给printf
)?
我之所以问这个问题是因为我观看了一个视频,其中那个家伙填充了超过 1 亿个空格来执行格式字符串漏洞利用(然后使用%n
and 将特定地址写入该位置),但我不明白有人怎么能在堆栈上使用超过 100-150MB 的数据(空间)而不到达堆栈外部?我认为在 Linux 中这样做会导致段错误?
如果我们的程序很简单printf
,那么通常我们可以上升多长时间(在 Linux 中)直到我们到达堆栈的末尾并因此导致段错误?
而且,如果我们覆盖堆栈中开头的内容,它不会导致我们的程序出现问题吗?我认为这些是程序需要的重要东西,比如环境变量等等?
我正在谈论的视频(在视频末尾):
https://www.youtube.com/watch?v=t1LH9D5cuK4&t=616s
同样在其他视频中也没有传递给 main 函数的字符串,我们放入的格式字符串仍然在堆栈上而不是在堆上(使用 gdb 显示堆栈)