目录
今日目标
今天细看了一下 narnia2(不知道这是什么的小伙伴看我前篇),是个栈溢出的练习。所以,Buffer Overflow,BoF,是今天的主题。这篇文章的标题是基础的基础,我们会把基于栈的溢出深入再深入地探讨一下。网上由很多关于栈溢出地基础例子和文章,想必大家也看过很多了。
带着下面几个问题,我们开始这篇 BoF 基础的基础。无论大家能不能回答这几个问题,看下去,总有一些新的收获。
- BoF 的前世今生大家了解多少?BoF 有多少种类型?
- 都说栈溢出,首先,为什么你的程序会有栈?
- 漏洞叫做栈溢出,EBP,EIP,或者 BP,IP 是寄存器,一个在内存,一个在 CPU,为什么那些文章总说 EBP 和 EIP 会被覆盖,难道栈溢出还能溢出到 CPU ?
- 那些文章都提到 nop (\x90),nop 到底是什么?为什么要用 nop?
深入 BoF
我们先了解一下 BoF 的一小段历史,BoF 的种类,以及计算机科学家在与 BoF 做长达 20 余年的抗争之后,已经做出过哪些努力。
BoF 的前世今生
早在上世纪的 70 年代,BoF 就已经被发现和记载了。BoF 的可能性被出版在 Computer Security Technology Planning Study 这本书刊。我还在亚马逊找到了这本书,这价格就搞笑了 😂
言归正传。到 1988 年的时候,才出现有史以来第一次 BoF 的漏洞利用。当时有一个病毒叫做 Moris Worm,它利用几种计算机软件的漏洞在互联网传播,BoF 就是漏洞之一。
这之后,两个重大的蠕虫病毒,Code Red worm 和 SQL Slammer Worm 分别对微软的 IIS 5.0 服务器和 MSSQL Server 2000 进行了攻击。
看来,微软的产品真的不怎么安全。为了加强安全,微软在 2012 年发布了一篇文章,标题为 Security Development Lifecycle (SDL) Banned Function Calls,禁止使用一系列 C 和 C++ 的不安全方法。这是后话。
另外,大家熟知的 XBOX,PS2, Wii 等主机平台的破解,靠的都是某个类型的 BoF。
BoF 的产生,很多时候是程序员在写程序的过程中,使用了本身没有边界自测能力的函数或方法,这类函数或者方法,被称为 Unbounded Functions(暂且意译成无边界函数/方法),因为程序员无法判断什么时候这些方法会停止读取或者写入内存。因此,如果没有很好的手动的边界检测代码,直接使用这些无边界方法,后果就是 BoF。
BoF 的种类
BoF,Buffer Overflow 是所有溢出漏洞的统称。我们这篇文章在实践环节要讨论的,是基于栈的溢出(Stack Overflow)。我们来看一下 BoF 具体有哪些类型。
- 栈溢出 Stack Overflow,基于栈的溢出,利用不安全方法,通过写入指定长度的数据到栈空间,从而做到对程序跳转地址的控制,执行恶意代码
- 堆溢出 Heap Overflow,基于堆的溢出,高级话题,我都不知道怎么总结,以后碰到的时候再做特定的深入
- 整数溢出 Integer Overflow,将 long 这样的整数存入 int 型的变量,造成的溢出
- 字符编码溢出 Unicode Overflowÿ