pwnable.kr刷题之UAF

来源:互联网 发布:范玮琪人品知乎 编辑:程序博客网 时间:2024/05/29 12:51

先把题目下载到本地。
这里写图片描述
我们先说说UAF的利用过程是怎样的。
(1)先产生一个野指针
(2)精心构造数据填充被释放的内存区域
(3)再次使用该指针让填充的数据使EIP发生跳转
基础知识
(1)C++虚函数表解析
这是我看过最好懂最清晰的有关C++虚函数表的文章。
(2)内存分配释放的原理
这里用不上多么高级的知识,只需要知道一点,在指针释放后再申请相同大小的内存系统会将释放的地址进行分配以提高系统运行速度,因此可以修改到被释放的内存数据。
看一下程序的源代码,程序流程是根据输入数字跳转到不同的地方执行。
1:调用两个类的函数
2:分配data空间从文件名为argv[2]中读取长度为argv[1]的字符到data部分
3:释放对象
这里如果是先执行3再执行1就触发了UAF漏洞。那么如何操纵被释放的空间呢?可以看到在2中从文件名为argv[2]中读取长度为argv[1]的字符到data部分,根据前面所述,data在分配空间的时候就分配到了3中被释放的空间。如果我们能够把introduce函数的指针覆盖为give_shell的指针,那么就可以接着执行1调用shell了。
这里写图片描述
v13就是vptr,转换为指针取其中的数据是vtable的第一个值,再加8是第二个值,正好是introduce的函数指针。
这里写图片描述
如果让v13+8指向get_shell那么vtable+8=0x401570,因此vtable的值应该是0x401568。
这里写图片描述
之所以要allocate两次,是因为在free的时候是先free的m后free的w。因此第一次allocate会写入w第二次才会写入m。