为什么缓冲区溢出会在访问整数时导致分段错误?

ski*_*ppy 4 c c++ buffer-overflow segmentation-fault

在从函数A()调用函数B()期间,B()分配一个100-char数组并多次填充,包括一次使用101个字符的字符串,一次使用110个字符的字符串.这是一个明显的错误.

之后,函数A()尝试访问完全不相关的int变量i,并发生分段错误.

我理解为什么会发生缓冲区溢出,但为什么在访问此整数时会出现分段错误?为什么我不简单地得到垃圾数据?

Pas*_*uoq 14

缓冲区溢出可能会破坏堆栈上先前保存的帧指针版本.当函数返回时,此损坏版本将加载到帧指针寄存器中,从而导致您描述的行为.

维基百科的页面包含图形和定义.


wal*_*lyk 5

A()调用时B(),B的前导码指令保存A的帧指针 - 堆栈中A保持局部变量的位置,然后用B自己的帧指针替换它.它看起来像这样:

堆栈框架

当B超出其局部变量时,它会混淆将重新加载到帧指针中的值.这是垃圾作为帧指针值,因此所有A的局部变量都被删除.更糟糕的是,未来对局部变量的写入会混淆属于其他人的内存.