【博客23】linux 缓冲区溢出攻击
内容: 在微信的wetchat上学到的,linux系统缓冲区攻击的原理,然后模拟这自己实现了一个简单版本的。缓冲区溢出攻击就是利用越界改写,然后将调用函数的返回地址覆盖,覆盖的这个地址是攻击者事先已经准备好的函数的地址,从而在函数调用结束后,将控制权转移到攻击者的函数那里,从而执行攻击者的程序。
代码:
效果:
分析: 图中的代码就出现了溢出改写了,所以导致main函数的返回地址被覆盖了,从而导致跳过攻击函数那边去了。所以不是边界安全的代码容易被攻击。不过前提是我关闭了系统的栈保护。
-fno-stack-protector-这个是关闭栈保护,这时系统不会帮你插入栈保护检查代码。依稀记得,以前看深入理解计算机系统的时候,有讲过系统是有对缓冲区溢出攻击做出防范的,具体的做法有:为栈的起始位置附加一个偏移量,使攻击者无法准确获取栈空间具体位置,还有一个就是插入栈边界检查代码,在书中我记得给插入的那段地址起了个名字叫"金丝雀",这个空间是放在函数返回地址之前,如果发生缓冲区溢出改写,那么它一定比返回地址先被改写,通过比较 "金丝雀"的值有没有变化,有没有发生溢出改写。之所以叫金丝雀是因为它是一种可以被用来帮助矿工发现瓦斯泄露的动物,以此为名,用来命名防止溢出的地址。
建议: 我们在平时要注意写边界安全的代码,当然是尽可能写,因为有的错误不好发现。特别是如果对字符串函数不了解,那么很容易出现越界改写,比如:strcpy等不安全的函数,我们在使用它们之前最好能了解它的缺陷,从而通过正确传递参数,避免这个错误,memmove是个不错的选择,还顺便能解决下内存重叠。
大三学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。