首页
社区
课程
招聘
4
[原创]2018看雪&TSRC CTF第14题WP
发表于: 2018-12-29 10:24 6085

[原创]2018看雪&TSRC CTF第14题WP

2018-12-29 10:24
6085

惯例先看看开了哪些保护。

程序流程很简单

两处漏洞:
1、gets堆溢出

2、格式化字符串

虽然存在格式化字符串漏洞,并且GOT表可写,但是程序使用的是printf_chk函数。会检测出形如"%n"和"%12$p"这种利用方式。
考虑到main函数由libc_start_main调用,因此栈上的返回地址是一个libc中的地址,利用格式化字符串漏洞能泄露出libc的基址。
"%p::%p::%p::%p::%p::%p::%p::%p"。第8个%p就能打印出libc上的地址。

houseoforange的思路
1、malloc一个0x400的chunk,通过gets()溢出修改topchunk的size域为0xc01(这里要保证topchunk是页对齐的,并且PRE_INUSE位置1,否则后面释放old topchunk时会报错)

2、malloc一个0x1000的chunk(比topchunk大,小于0x20c00就行).libc会分配出一个新的topchunk,并把old topchunk给free掉。这样我们就得到了一个unsorted bin

3、malloc一个0x20的chunk。unsorted bin会先放入large bin中,然后分割成两部分。第一部分返回给malloc,剩下的作为last_remainder又被放入unsorted bin链表中。利用gets溢出在这个unsortedbin中伪造一个IO_FILE结构

4、最后随便malloc一下,由于unsorted bin链表被破坏,程序_IO_flush_all_lockp时会使用我们伪造的IO_FILE,执行one_gadget


[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2018-12-29 10:56 被mratlatsn编辑 ,原因:
收藏
免费 4
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2022-7-27 01:50
心游尘世外
为你点赞~
2022-7-26 23:46
飘零丶
为你点赞~
2022-7-17 03:23
Editor
为你点赞~
2018-12-29 14:55
最新回复 (0)
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册