
上QQ阅读APP看书,第一时间看更新
第3章 指针诡计
与Rob Murawski合著 [1]
Tush!tush!fear boys with bugs.
—William Shakespeare.The Taming of the Shrew.act1.scene2
指针诡计(pointer subterfuge)是通过修改指针值来利用程序漏洞的方法的统称[Pincus 2004]。C和C++的对象指针和函数指针是有区别的。指向void或指向一个对象类型的指针的类型被称为对象指针类型(object pointer type)。可以指定一个函数的指针类型被称为函数指针类型(function pointer type)。指向类型T的对象的指针被称为“指向T的指针”。C++还定义了一种成员指针类型(pointer to member type),它是指定一个非静态类成员的指针类型。
可以通过覆盖函数指针将程序的控制权转移到攻击者提供的外壳代码(shellcode)。当程序通过函数指针执行一个函数调用时,攻击者提供的代码将会取代原本希望执行的代码而得到执行。
对象指针也可以被修改,从而执行任意代码。如果一个对象指针用作后继赋值操作的目的地址,那么攻击者就可以通过控制该地址从而修改内存其他位置中的内容。
本章详细解释了函数指针和对象指针的修改问题。与本书其他各章的不同之处在于,本章在介绍了如何初步利用漏洞后(如缓冲区溢出),还详细讨论了攻击者可能如何进一步地执行任意的代码。预防指针诡计非常困难,最佳缓解措施就是在编程阶段消除漏洞。在进一步讨论指针诡计之前,让我们首先了解数据的声明与它在内存中存储位置之间的关系。
[1] Rob Murawski 是卡内基梅隆大学软件工程研究所(SEI)CERT 计划技术团队中的一员。