20155306 白皎 免考实践总结——0day漏洞
本次免考实践提纲及链接
第一部分 基础知识
1.1 0day漏洞概述
1.2二进制文件概述
1.3 必备工具
1.4 crack实验
第二部分 漏洞利用
2.1.1 系统栈工作原理
2.1.2 修改邻接变量
2.1.3 修改函数返回地址
2.1.4 代码植入
2.2.1 DEP机制的保护原理
2.2.2 linux下利用Ret2Lib绕过DEP
2.2.3 windows下利用Ret2Libc绕过DEP
2.3.1 GS安全编译选项的保护原理
2.3.2 利用未被保护的内存突破GS
2.3.3 覆盖虚函数突破GS
2.3.4 攻击异常处理突破GS
2.3.5 同时替换栈中和.data中的Cookie突破GS
3.1 Ubuntu16.04 (CVE-2017-16995)
3.2 Flash 0day(CVE-2018-4878)
总结与体会
一、 总结
终于历经辛苦完成了本次免考实践,可以安心复习其他课程了哈哈。回顾这次免考实践,刚开始选择0day漏洞这个课题,起初是因为在微信群里看到老师发了一个2018年5月的Flash 0day漏洞的相关链接,经了解后,便萌生了想要从头自学0day漏洞相关原理知识的想法。通过在图书馆借阅相关书籍、以及从网上购买书籍和查阅资料,我大概确定了自己的免考思路,如上述目录所列的内容。
首先,我学习了对0day漏洞环境的搭建,以及相关工具的熟悉,并掌握了很多必备的工具。
其次,我选择学习了0day漏洞初级、高级的原理并进行实践。其中,第一部分,主要介绍了学习0day漏洞需要掌握应用了四种工具以及关于PE文件等的基础知识,主要收获是学习了通过查看内存地址,寄存器的值以及栈中的数值变化来判断出程序运行目前的状态。第二部分,学习了漏洞原理之栈溢出利用,目标代码嵌套到shellcode中,通过溢出覆盖地址的方式,替换掉本来的地址,而是将地址指向我想要执行的shellcode,以达到目的。除此之外,成功利用系统函数system()实现了在Linux下做Ret2Lib绕过DEP,并掌握了在Windows下做Ret2Lib绕过DEP的各种思路方法。在最后模块,我主要是实践如何突破GS,GS是微软提供的一种编译保护选项,主要目的是为了增加栈溢出的难度。在这一部分的实践过程中我尝试了许多方法,找了很多教程,但是网上相关的内容并不多,因此遇到了很多问题,感受到自己的知识还有很大差距。比如,在老师的帮助下,我才了解在程序里设断点,并且把程序改成release版本是会报错的,断点必须在OD中设置,也正是因为这个问题让我调试了很久,浪费了很多时间。在此,还是要非常感谢老师!
最后,我原本的初心是通过这次免考所学到的知识可以去复现并分析一个近两年的漏洞。但是我发现仅仅通过这次免考实践我所掌握的知识还是非常浅薄的,只是最原始的知识层面,因此主要完成了复现近两年的两个0day漏洞。希望以后在时间充裕的情况下,还可以进一步深入学习。
二、 体会
总之,本次实践的整体过程难免遇到了一些问题,进行了一些调整,但最终这次免考实践我最大的感触就如Krashen的“i+1”理论,它既没有像“i+0”让我在原有的知识层面上毫无所获,也没有像“i+N(N远大于1)”让我丧失对获得新鲜知识的兴趣甚至产生畏惧感。一个人单独完成这项任务给了我很大的压力,但也让我能够转化为动力,踏踏实实沉下心来去研究、去思考,从而让我收获颇丰。
我另一点印象最深的体会就是在向老师请教的时候,老师说的那句话,一定要做得很开心、很享受,知道自己在做什么。虽然说实话最开始我们都是怀抱一颗仅仅是想要获得好成绩的心选择免考哈哈,但是在这个过程中,一次次实践的成功让我获得巨大的成就感,让我真正地用心体会到了“兴趣才是最好的老师”这个简单质朴却又极其经典的道理。免考实践就像是整个网络攻防课程的缩影,如果我们只是被动地疲于应付老师每次要求的实践任务,便没有任何意义。而只有主动地积极学习,享受学习带来的乐趣,才能在整个学习的过程在收获幸福感、获得感!