缓冲区溢出
- 破坏返回地址
- 让程序执行本来不愿意的函数
- 使用系统调用启动一个shell程序。
- 执行一些未授权的任务。
如何解决病毒攻击
- 栈随机化,操作系统每次执行程序的时候,在栈上分配一段
0~n
字节之间的随机大小的空间,要足够大又要足够小,不至于浪费程序太多的空间。- 被添加多个nop破解,只要攻击者能猜中就可以了。
- 该技术是地址空间布局随机化技术(ASLR)中的一种。
- 栈破坏检测
- GCC的栈保护者机制:在返回地址和缓冲区之间存储一个特殊的值,称为哨兵值,是在程序每次运行时随机产生的。函数返回之前检测这个金丝雀是否被该函数的某个操作或者该函数调用的某个函数的某个操作改变了。如果是的,那么程序中止。
- 限制可执行代码区域
- 限制哪些内存区域能存放可执行代码。一般只有保存编译器产生的代码的那部分内存才需要是可执行的,其他被限制为只允许读和写。
如何管理变长栈帧
- 现在分配栈之前先给分配好
%fs:40是段寻址。
栈在调用结束后,会讲栈都释放掉,所以level3不能将字符串放在低地址位。
该实验主要讲缓存区溢出攻击,以及其进化版
普通的缓冲区很方便的地方是可以自己写汇编代码,插入到里面
而进化版是因为其普通的攻击可能会被栈随机化和哨兵机制给阻止,因此我们得要利用系统或者软件本来有的二进制代码,跳到其汇编代码中去,同时更改每次的返回地址。
字符串在栈中的读入是由低到高的,所以只要计算得当,就讲当前栈中得返回地址更改,甚至可以更改返回地址所处的栈的+1位的地址,进化版就是设定多个栈返回地址,最用利用系统本来的二进制代码。
其中03表示的是ret,还有一个是表示nop。
小小总结:CSAPP的lab可能真的告一段落了,真心推荐各位大佬好好去看看这书同时完成一些质量不错的Lab。个人觉得大二是最适合精读这本书的时期,做好泡图书馆的准备,好好看就可以,不懂就百度。
个人的英语阅读能力还需要提高,对于lab的judge读起来蛮吃力
时间比较少且没有干劲。学习方法不太对,最好读judge或者读课本的时候做做笔记。