A2ur2的梦想小屋

我许下的愿望该向谁去说明

0%

今日学习碎片

一、前言

最近这段时间,感觉没有说系统的学习一个bin的attack,而是卡在了一题heap的题目,反复调试下也是掌握了一些零碎的但未曾接触过的知识。最近的学习状态有点迷,感觉自己的兴趣和热情被消耗的过多,容易去担忧自己未来能不能找到一个让自己满意的工作,怕自己能力和天赋不足,怕付出和收获不成正比。emo下,进入正题,分享一道简单堆题

二、0ctf-babyheap(未打通)

这是一题利用到unsorted bin和fast bin的一道堆题。

1.代码分析

这里我已经把代码整理过了,经典菜单题,实现了创建,编辑,删除和输出四个功能,其中在编辑edit函数中,会让用户重新输入一个size并且输入和size一样长的数据,但是并不会对一开始已经malloc的堆块进行操作,意味着你可以无限制溢出。

其中在add函数中我们可以还原出程序定义了一个结构体数组,分别存储一个1,一个size大小,以及malloc返回的指针。

起初本来在想,我能否堆溢出,通过修改这个数组里存放的指针达到任意地址读写的效果,后来发现这题和之前off-by-one例题不太一样,那道例题是因为他维护malloc回来的指针也是用chunk的,所以overlapping拿到控制权后可以实现任意地址读写,而本题堆块仅仅是用于存储data。

2.思路

利用unsorted bin去leak出libc的基址,用fastbin去打malloc_hook

3.调试时的问题

由于我本地时高版本的libc,所以本地调试时遇到了一些有趣的事情,记录了一下

首先,是关于tcache的

图中我们可以看到,当我们申请一个0xb0大小的堆块时,按照常理来说,系统应该把tcache里这个符合大小的chunk返回给我们,但是我们可以看到它并没有从tcache中取出来给我们,反而从top chunk里面重新切割了0xc0大小的chunk。

这是因为我们在申请堆块时用的时calloc,calloc不从tcache中获取堆块。

然后,calloc申请堆块时,和malloc不同,它会将堆块的空间初始化,所以当我们overlap的时候( chunk1包含了chunk2),当我们free掉chunk1再申请回来的时候,chunk2的头会被抹除,此时如果我们对chunk2进行操作程序会crash

最后就是一个关于pwndbg的。

LRBYrD.png

当我们overlap没计算好size时,会造成chunk的边界模糊,此时pwndbg会解析不到chunk,如图,top chunk直接再见

4.目前的状况

由于此题原本环境是libc2.23,结合*ctf的时候打不开附件的情况,准备研究下patchelf怎么绑定动态库到程序中,但遇到了一个貌似很常见的问题就是换了动态库和ld之后,gdb 的heap指令会出问题。