首页
社区
课程
招聘
[原创]Hctf-2017-babyprintf-一个有趣的PWN-writeup
发表于: 2017-11-13 19:52 14893

[原创]Hctf-2017-babyprintf-一个有趣的PWN-writeup

2017-11-13 19:52
14893

这几天在看house of orange,然后遇到了HCTF这么一道题目,感觉能够用house of orange来做(和出题大佬spine聊完之后发现这个方法不算准确的预期解法,还有别的解法。),但是和house of orange的场景不一致,最后貌似学会了一种不需要知道heap地址的house of orange攻击方法,这样house of orange的攻击面更加广泛了,不知道各位大牛怎么看,有误之处,还望多多指教。

程序流程很简单了,就是一个堆分配,然后一个gets读入,有溢出,同时之后又打印,有格式化字符串。

咋一看,格式化字符串漏洞,哇,这道题目这么简单的吗?然后。。。。。
发现开启了FORTIFY_SOURCE机制,emm......记得32位好像可以绕过,然后再定睛一看64位,mmp,好像饶不了?难不成是0day?
FORTIFY_SOURCE机制对格式化字符串有两个限制

第二点还是比较好过的,依然还是可以泄露出来信息的。但是第一点是无法绕过的,至少在谷歌上没有找到方案,在32位的情况下是可以绕过的,所以思路不能停留在格式化字符串上。

gets这里可以无限写入直到\n为止,所以通过这个漏洞可以修改top_chunk,所以想到了可以使用house of orange(关于house_of_orange有不懂的可以看我之前关于house of orange的博客318K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4y4A6L8i4l9I4k6g2)9J5k6h3I4W2j5h3&6G2N6r3g2Q4x3X3g2U0L8$3#2Q4x3V1k6H3L8%4y4@1i4K6u0r3z5e0f1%4x3h3q4W2x3K6u0W2z5r3y4S2)。

先用格式化字符串漏洞泄露libc地址,为我们后面的house of orange做好准备。和普通的格式化字符串漏洞泄露方法差不多,就是需要把%n$前面的n-1个也打上就行。然后你可以去尝试用用%n,会发现被检测出来使用可写地址,然后结束了,我的泄露部分如下,能够泄露出来libc_start_main的返回地址,由偏移得到libc地址,同时栈上还有stack地址一并进行了泄露。

但是这里有一个问题就是我们无法泄露heap的地址,但是在house of orange里面是需要获取heap地址来设置vtable的,而且这里给出的服务器上libc的版本是2.24,在2.24的libc源码中对io_filevtable进行了IO_vtable_check,源码如下19fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8$3c8W2i4K6u0W2N6$3!0T1L8%4q4Q4x3X3g2G2M7X3N6Q4x3V1k6#2M7$3g2J5M7%4m8S2j5$3g2Q4x3V1k6Y4L8r3W2T1j5#2)9J5c8X3I4A6j5X3W2G2i4K6u0r3N6Y4c8S2j5X3I4W2M7#2)9J5k6h3y4Q4x3X3g2Z5N6r3#2D9i4K6t1K6x3K6V1`.

这里其实我没看懂,但是知道就算我们知道了heap地址,应该还是正常伪造的vtable通过不了检查的,那么有一个思路,有没有可以利用不在heap上的vtable呢,这个真的可以有,在strops的源码中就有这样的io_jump结构。 677K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6U0L8$3c8W2i4K6u0W2N6$3!0T1L8%4q4Q4x3X3g2G2M7X3N6Q4x3V1k6#2M7$3g2J5M7%4m8S2j5$3g2Q4x3V1k6Y4L8r3W2T1j5#2)9J5c8X3I4A6j5X3W2G2i4K6u0r3M7%4c8J5L8%4m8K6i4K6u0W2j5#2)9J5k6h3S2@1L8h3I4Q4x3U0x3I4y4l9`.`.

这里面的结构体有什么特点呢?一个是这个io_str_jumps是在libc上的,第二是我们来看这个IO_str_overflow这个函数。

这个函数里面是有一个相对地址调用的,也就是调用fp结构某处地址,由于fp这个结构我们正好是可以控制的。具体偏移是多少呢?这个偏移我们就不看源码了,直接用IDA来看这个偏移。

IDA我们可以很快知道这个偏移是0x1c*8=0xe0,同时执行函数时候参数正好2*v6+100,不过我们也需要绕过一些判断。
那么我们一步一步来分析

我们设置v7为binsh的地址,那么v6=(binsh-100) /2,把0xe0偏移位置设置成system地址就可以了,所以,这样的话house_of_orange是不需要依靠heap地址的,我还看了一下,其他版本的libc也有和这个io_str_jumps,所以这应该是一个通用的方法。
这里参考了lowkey师傅在安全客的文章,以及angelboyhouse of orange,感谢他们的分享,学习到不少知识。

最近某湿敷发了一句话,know it then hack it,这几天重新学习堆方面的漏洞利用知识时候很受教,在学习新的攻击方法和漏洞利用思路时候,必须把每一个步骤都了解清楚,必要的时候比照libc源码进行分析,不知道内部原因的情况下,是无法吃透一个漏洞利用思路的精华所在的,那就更别谈对方法进行改进了。
题目附件我已经上传了,题目最近还开着,大家可以自己尝试去做做,据spine大佬说还有很多解法,我的解法不一定是官方出题思路,大家如果用别的姿势进行利用成功的话,也可以分享来学习一下。

 
 
 
 

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 1
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  Editor   +1.00 2017/11/15
最新回复 (8)
雪    币: 45
活跃值: (108)
能力值: ( LV7,RANK:101 )
在线值:
发帖
回帖
粉丝
2
spine大佬看到他变成了spin,然后哭晕在厕所里了
2017-11-14 16:26
0
雪    币: 2379
活跃值: (171)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
Hcamael spine大佬看到他变成了spin,然后哭晕在厕所里了
尴尬,我看能不能改,我得给spine大佬认错去了,而且我每处都标红了
2017-11-14 17:43
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错!
2017-11-14 20:37
0
雪    币: 386
活跃值: (25)
能力值: ( LV7,RANK:104 )
在线值:
发帖
回帖
粉丝
5
大佬,我想问两个问题,我看了一下gets函数和_IO_getc函数,并没有发现哪儿调用了_IO_str_overflow函数呀(一定是我太菜了),能否告知是在哪儿调用的?还有,我试了一下你末尾处的payload,发现打不通呀,拿不到shell
2017-11-14 22:14
0
雪    币: 2379
活跃值: (171)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
不是gets调用了io_str_overflow函数,是abort在clean  io时候  我们伪造虚表调用了io_str_overflow函数
2017-11-15 17:20
0
雪    币: 386
活跃值: (25)
能力值: ( LV7,RANK:104 )
在线值:
发帖
回帖
粉丝
7
simSimple 不是gets调用了io_str_overflow函数,是abort在clean io时候 我们伪造虚表调用了io_str_overflow函数
受教了大佬,我再去看看源码,这两天libc源码看着恶心了看了三天的源码,才懂一点io的知识
2017-11-15 22:26
0
雪    币: 27
活跃值: (637)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
膜拜simple师傅
2017-12-1 18:00
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不错!!
2017-12-1 22:40
0
游客
登录 | 注册 方可回帖
返回