Pwn,我的栈溢出笔记就该这么写(上)

一周的刨坟结束了,忙着搭建维护k8s,该整个小小的笔记了

原理篇

什么是栈溢出?

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致与其相邻的栈中的变量的值被改变。

栈溢出会导致什么结果?

栈溢出漏洞轻则可以使程序崩溃,重则可以使攻击者控制程序执行流程。

如何防范栈溢出?

(1).金丝雀(canary)

1、 在所有函数调用发生时,向栈帧内压入一个额外的随机 DWORD(数),这个随机数被称作
“canary”,函数执行完在返回之前,程序通过检查这个随机数是否改变来判断是否存在栈溢出,用 IDA 反汇编时,又被称作“Security Cookie”。
2、 canary 位于 ebp 之前,系统还会在.data 的内存区域中存放一个 canary 的副本。
3、 当栈中发生溢出时,canary 将被首先淹没,之后才是 EBP 和返回地址。
4、 在函数返回之前,系统将执行一个额外的安全验证操作,称作 Security Check。

5、在 Security Check 过程中,系统会将栈帧中原先存放的 canary 和.data的内存区域中副本的值进行对比,若两者不一样,则说明栈中发生了溢出,系统将进入异常处理流程,函数不会正常返回。

如图所示:图自 Dynamic Canary Randomization for Improved Software Security 论文)

你可能感兴趣的:(栈)