内容简介
《图灵程序设计丛书:捉虫日记》从实践角度介绍安全漏洞,描述了作者在过去几年里怎样发现漏洞、怎样利用漏洞来攻击以及开发商如何修复,旨在为开发人员提醒,为漏洞研究领域的工作人员提供工作思路。
《图灵程序设计丛书:捉虫日记》适合所有程序员以及安全领域相关工作人员。
目录
第1章 捉虫
1.1 兴趣还是利益
1.2 通用技巧
1.2.1 个人技术偏好
1.2.2 代码中潜在的漏洞
1.2.3 模糊测试
1.2.4 延伸阅读
1.3 内存错误
1.4 专用工具
1.4.1 调试器
1.4.2 反汇编工具
1.5 EIP=41414141
1.6 结束语
第2章 回到90年代
2.1 发现漏洞
2.1.1 第一步:生成VLC中解复用器的清单
2.1.2 第二步:识别输入数据
2.1.3 第三步:跟踪输入数据
2.2 漏洞利用
2.2.1 第一步:找一个TiVo格式的样例电影文件
2.2.2 第二步:找一条代码路径执行到漏洞代码
2.2.3 第三步:修改这个TiVo电影文件,使VLC崩溃
2.2.4 第四步:修改这个TiVo电影文件,控制EIP
2.3 漏洞修正
2.4 经验和教训
2.5 补充
第3章 突破区域限制
3.1 发现漏洞
3.1.1 第一步:列出内核的IOCTL
3.1.2 第二步:识别输入数据
3.1.3 第三步:跟踪输入数据
3.2 漏洞利用
3.2.1 第一步:触发这个空指针解引用,实现拒绝服务
3.2.2 第二步:利用零页内存控制EIP/RIP
3.3 漏洞修正
3.4 经验和教训
3.5 补充
第4章 空指针万岁
4.1 发现漏洞
4.1.1 第一步:列出FFmpeg的解复用器
4.1.2 第二步:识别输入数据
4.1.3 第三步:跟踪输入数据
4.2 漏洞利用
4.2.1 第一步:找一个带有有效strk块的4X样例电影文件
4.2.2 第二步:了解这个strk块的布局
4.2.3 第三步:修改这个strk块以使 FFmpeg崩溃
4.2.4 第四步:修改这个strk块以控制EIP
4.3 漏洞修正
4.4 经验和教训
4.5 补充
第5章 浏览即遭劫持
5.1 探寻漏洞
5.1.1 第一步:列出WebEx注册的对象和导出方法
5.1.2 第二步:在浏览器中测试导出方法
5.1.3 第三步:找到二进制文件中的对象方法
5.1.4 第四步:找到用户控制的输入数值
5.1.5 第五步:逆向工程这个对象方法
5.2 漏洞利用
5.3 漏洞修正
5.4 经验和教训
5.5 补充
第6章 一个内核统治一切
6.1 发现漏洞
6.1.1 第一步:为内核调试准备一个VMware客户机
6.1.2 第二步:生成一个avast!创建的驱动和设备对象列表
6.1.3 第三步:检查设备的安全设置
6.1.4 第四步:列出IOCTL
6.1.5 第五步:找出用户控制的输入数据
6.1.6 第六步:逆向工程IOCTL处理程序
6.2 漏洞利用
6.3 漏洞修正
6.4 经验和教训
6.5 补充
第7章 比4.4BSD还老的BUG
7.1 发现漏洞
7.1.1 第一步:列出内核的IOCTL
7.1.2 第二步:识别输入数据
7.1.3 第三步:跟踪输入数据
7.2 漏洞利用
7.2.1 第一步:触发这个bug使系统崩溃(拒绝服务)
7.2.2 第二步:准备一个内核调试的环境
7.2.3 第三步:连接调试器和目标系统
7.2.4 第四步:控制EIP
7.3 漏洞修正
7.4 经验和教训
7.5 补充
第8章 铃音大屠杀
8.1 发现漏洞
8.1.1 第一步:研究iPhone的音频性能
8.1.2 第二步:创建一个简单的模糊测试程序对这个手机进行模糊测试
8.2 崩溃分析及利用
8.3 漏洞修正
8.4 经验和教训
8.5 补充
附录A 捉虫提示
附录B 调试
附录C 缓解技术
摘要与插图
1捉 虫
捉虫是从软件或硬件中查找bug的过程,然而在本书中我们用这个术语特指发现安全攸关的软件bug的过程。安全攸关的bug,也被称作软件的安全漏洞(security vulnerability),攻击者可利用它远程攻击系统、提升本地权限、跨越权限边界,或者严重破坏系统。
大约10年前,搜寻软件安全漏洞大多还只是一种业余爱好或引起媒体注意的方法。等到人们意识到这里存在大量的利益时,捉虫才开始慢慢成为一种正式职业。[1]
媒体大量报道软件的安全漏洞和利用这些漏洞的程序(也称作利用程序),此外,有许多书籍和网络资源介绍如何利用安全漏洞,还有关于如何披露已发现bug的无休止的争论。尽管如此,涉及捉虫过程本身的出版物却少得可怜。虽然软件漏洞和破解这样的术语已被广泛使用,很多人,包括很多信息安全专业人士,并不清楚捉虫人是怎样发现软件安全漏洞的。
问10个捉虫人他们怎样在软件里寻找安全相关的bug,可能会得到10个不同的答案,这就是至今仍没有“捉虫秘籍”之类的书的原因,并且将来可能也不会有。我的目的不是写一本一般的操作指南,而是要描述自己在真实软件中找到这类bug的方法和技巧。愿这本书能帮助你形成自己的风格,从而让你也可以找到一些有趣的软件安全bug。
1.1 兴趣还是利益
人们搜寻软件bug的目的和动机各式各样。一些独立的捉虫人希望能改善软件的安全性,而另一些人追逐名利、媒体关注、报酬以及工作机会等个人利益。公司可能需要找出这样的bug,从而在市场营销中大肆宣扬。当然,也总是有心怀不轨的家伙在寻找新方法侵入你的系统或网络。另一方面,也有人这样做仅仅因为觉得有趣,没准儿想藉此拯救世界。:
1.2 通用技巧
虽然没有正式文档描述标准的捉虫过程,但通用技巧还是存在的。这些技巧可以分成两类:静态的和动态的。在静态分析中(通常也称作静态代码分析),我们会检查软件的源代码或者二进制文件的反汇编码,但不会执行软件。而动态分析是在执行软件时对它进行调试或模糊测试。两种技巧各有利弊,大部分捉虫人会将两者结合起来用。
1.2.1 个人技术偏好
多数时候,我静态分析方法。我经常逐行阅读源代码或软件的反汇编码,去理解它。当然,从头到尾阅读源代码往往不大现实,查找bug时,我通常先尝试找出哪里是受用户影响的输入数据得以进入软件的对外接口。这些数据可能来自网络、文件或者执行环境等。
接下来,我会研究输入数据在软件中“游走”的不同路径,留意任何潜在的可被利用来破坏数据的代码。有时候我会在读源代码(见第2章)或者反汇编码(见第6章)时标记这些不同路径的入口。有时候我会结合静态代码分析和调试结果(见第5章),定位处理输入数据的代码。开发漏洞利用程序时我也倾向于结合静态分析和动态分析两种方法。
发现一个bug之后,我会去证明它确实是可利用的。因此我会尝试为它构建一个漏洞利用程序,这样一个程序做好之后,就可以投入大把的时间到调试中了。
1.2.2 代码中潜在的漏洞
静态分析只是捉虫的一种方法,发现代码中潜在漏洞的另一种方法是留心观察靠近“不安全”C/C++库函数的代码,譬如strcpy()和strcat(),寻找可能的缓冲区溢出。或者,可以在反汇编后搜索movsx汇编指令,寻找符号扩展(sign- extension)漏洞。如果找到了一处漏洞,可以向前追查这段代码,确定它是否暴露了可通过应用入口来访问的漏洞。我很少用这种方法,但许多捉虫人很信赖它。
1.2.3 模糊测试
模糊测试是一种不同的捉虫方法,它是一种动态分析技术,由一