我玩弄缓冲区溢出,但我在Mac OS上运行以下简单的C程序时发现我所困惑的。期待它没有得到一个分段错误
#include <stdio.h>
int main(void) {
char buf[2];
scanf("%s", buf);
printf("%s\n", buf);
}
通过BUF的长度设置为2个字节,我希望输入字符串“CCC”时,导致段错误,但这并没有发生。只有输入长度为24个字符的字符串时,才会产生分段错误。
发生了什么事?这与字符编码有关吗?
谢谢。
我明白了。我认为便士已经下降。一个恶意的攻击者会试图溢出堆栈的其余部分,并因此覆盖寄存器?但是,他们如何预测剩余的筹码?操作系统每次都会分配固定数量的内存吗? –
查看装配输出和试错法是确定“剩余堆叠”的最佳选择。这是可能的,但不能保证,在_same environment_中执行_same binary_时,这将保持不变。缓冲区溢出不会覆盖寄存器。他们覆盖堆栈或堆。 – Mat
@Martin典型的想法是溢出堆栈中的缓冲区,以便覆盖堆栈上的一些数据,指示CPU从函数返回后将返回的位置。有关更多详细信息,请尝试使用Google搜索“粉碎堆栈”。 –