|
|
1
3
堆栈缓冲区溢出堆栈缓冲区溢出是指程序意外或恶意地写入堆栈上特定数据项的范围之外,例如C字符串。这会影响修改堆栈(而不是堆)上附近的控件或数据结构的值,从而导致不希望的程序行为,如崩溃、错误或更改控制流。 这通常不是指在堆栈本身的范围之外写入,堆栈本身通常受 guard pages 以防止意外的超负荷或欠负荷运行。
Linux上的调用堆栈调用堆栈的大小是固定的,实际堆栈本身根据需要在该限制内增长和收缩。 堆和堆栈不重叠或共享内存-它们通常在虚拟地址空间的不同区域进行管理。
进程主堆栈的大小由程序运行时存在的环境决定。有关C函数的设置,请参见
如果创建自己的线程,则可以承担创建它们的堆栈的责任(请参见
|
|
|
2
2
对于Windows:
当您溢出存储在堆栈上的固定长度缓冲区并覆盖堆栈上的其他控制数据(如返回地址)时,就会发生堆栈缓冲区溢出。 例如,假设您调用函数,它有一个16字节大小的本地缓冲区。调用堆栈可能如下所示(为了清楚起见,省略了其他细节:
如果您的代码有一个bug并在0x990处溢出缓冲区,您将覆盖返回地址。如果攻击者可以导致缓冲区溢出,他们可以将一些代码放入缓冲区,并覆盖返回地址以指向注入的代码。当函数返回时,它跳到攻击者的代码。 |