发表于 2020-12-1 22:54

申请会员ID:Ironmna【申请通过】

1、申请ID:Ironmna
2、个人邮箱:2213829792@qq.com
3、原创技术文章:【Unctf2020】Unlink知识学习
0x1.查看
先查看保护情况:首先知道此题没有地址随机化,可以劫持got表(Partial RELRO)

0x2.静态分析
拖到ida后,提前将菜单,功能都事先标记好、开始进行逐步分析:是一个经典日记题,那基本是堆题目了=_=。               

先看一下创建流程,事先确定好日记的存储结构。一共可以创建24个小本本,跟我们小本本有关的三个数组分别是size,ptr,content。当我们创建一个小本本的时候,首先动态申请一个空间用来存放日记内容,ptr数组存储这个指针,然后size数组存储空间大小。但是在54行的位置强行为size进行了加一操作,别说了,off_by_one!之后一切都很和谐,但是紧接着也是我标出来的地方最迷,我们在创建小本本的时候内容先存在content数组里????啊这,不应该存在ptr里嘛,奇奇怪怪的。基础结构分析完毕,接着着重查看剩下三个操作,找到漏洞。   


删除有两个小问题,首先很显然循环多判断了一次,第25个也能删,然后删除时没有对size数组进行清零,但是漏洞并不能为我们所利用ORZ。

Show函数屁用没有,下一个!

edit函数就有的玩了,我们会发现这回日记存储进入ptr所指向的空间内了,再加上之前对size强行加一的操作,我们就可以用off_by_one对堆来布局了。   

0x3.思考
传统想法应该是off_by_one加上malloc_hook来getshell。但是对于本题来说,show无法使用,也就是说我们无法泄露malloc_hook地址,所以我们需要另辟蹊径,得利用我们所知道的地址了。经过我不懈努力(百度)终于发现:由于未开地址随机化,所以对于ptr,size这些数组的地址我们都是可以知道的,而且我还惊喜地发现了后门函数。啊这,那我们就可以利用unlink来解决这道题目了。

0x4实操
对于unlink来说最核心的部分就是欺骗检查:
P->fd->bk == P
P->bk->fd == P
通俗的来说那就是要保证前一个块的后面是你,后一个块的前面也得是你,当然这是正常的情况。【手动滑稽】
对于这道题来说,我们知道ptr数组中存放的就是本块的地址,那我们就可以这么构造了(画的比较粗糙,各位见谅哈orz)file:///C:/Users/ASUS/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg

这样构造后,便能够绕过检查。紧接着重头戏来了,当我们如此绕过检查后,堆块便会合并
P->fd->bk = P->bk
P->bk->fd = P->fd.
那么简单的算下来,发现ptr_addr=ptr_addr-0x18!!!!!!!!!!
此时我们的ptr指针已经指到-0x18的位置上了,而且此时以ptr-0x18的位置已经被系统识别为了一个chunk,这个chunk的内容就是ptr_addr!!!!!!!!!!
假设我们事先填充到P这个块为puts.plt.got的地址,在进行正常的修改时实际上已经写到了got表中puts的地址。我们输入后门函数地址后,等到系统下次再运行到puts时,便跳转到我们的后门地址上了,成功getshell!
脚本如下:   


题目相关资源:
链接:https://pan.baidu.com/s/1bo4DtmMv-eank7LRUwl8HA
提取码:2333

Hmily 发表于 2020-12-4 18:09

I D:Ironmna
邮箱:2213829792@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

Ironmna 发表于 2020-12-4 21:45

本帖最后由 Ironmna 于 2020-12-5 10:35 编辑

报道,感谢H大orz
页: [1]
查看完整版本: 申请会员ID:Ironmna【申请通过】