pwnhub 9月公开赛

白帽子社区

共 1609字,需浏览 4分钟

 ·

2021-10-04 09:28

作者:jambolt  编辑白帽子社区运营团队




    "白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)

"    




利用技巧

  1. fastbin attack

  2. tcachebin attack

  3. IO_file

  4. FSOP 利用 pwntools SigreturnFrame模块

程序分析

程序保护情况

沙盒保护

90bd2740eabf3f3250a5601ee7a67fc9.webp

禁止程序执行系统命令,且限定使用 ARCH_x86_64指令

程序保护

程序保护全开 

d705fe545e98031c33ba35e68317902a.webp

libc环境

glibc-2.31

程序漏洞出现点

free调用可以越界

56bec3fe95255ff810cc39d818dc24b1.webp

leave_num 的最大值可以取为8,固free 最大次数为9

acedb0479282803265b58432286ec2a7.webp

全局变量 break_up_list与 chunk_list想连,发生free越界时,会执行free(break_up_list[8])既free(chunk_list[0]),可以用于构造double free。

利用过程

1)通过largebin泄露libc基址和堆空间地址

堆空间的地址泄露 在unsortedbin中申请 largebin 大小的chunk是,满足 bck=fwd时会触发执行堆块的 fd_nextsize和bk_nextsize 写入 堆块的地址

f8e4ed28f099e648376a8fe5d4f18b56.webp


54538c7ede9843458c8307a9b0127b66.webp

泄露libc地址

d9c62770aae3ab27a6c10527f0ecfaf1.webp

申请堆块后的堆空间 写入 'a' * 8 覆盖堆块fd 可以进行libc泄露,写入 'a'*16覆盖 fd和bk 可以泄露堆空间地址

e55f87337fa4cade094ea2b3182d2e12.webp

2)构造fastbins attack

题目中可以对 break_up_list进行越界free,先将tachebins 填满

915d3dba5aabffa953518343c4f74fcb.webp

之后再通过越界free(chunk_list[0])来构造double free,既

free(break_up_list[6])free(break_up_list[7])free(chunk_list[0]) #越界free

71a728438eabe14c38389b47b48614a0.webp

成功控制fastbins链表

93de3131f0dbf6f4d938af9840e4c3d0.webp

3)通过fastbin attack 构造tcache bin attack

申请 两个 0x450的 堆块 top_chunk被挤到 0x290 + (0x460 * 2) = 0xb50,申请一个0x20的chunk_list[15] 定位到了 0xb50

7a118a25044e1f46a4497edd922adbd6.webp

从unsortedbin中申请0x20堆块 内容写上伪造的chunk_size

128bdf17eb7c26908999b3e58716a419.webp

之后申请的smallbin也会从unsortedbin中申请

清空之前的tcachebins,剩下之前构造的double free

df1552d32e30fb54e3316074e79869bc.webp

再次申请堆块,fastbins 进入 tcachebins,改写fd指针,控制tcachebins,tcache之后申请的空间可以改写 chunk_list[0]

63c4154fe0b99bbf3ab498a35f2002c3.webp

之后free chunk_list[0], chunk_list[1],使之进入 tcachebins[0x260]中,再次申请0x40的堆块可以改写 tachebins[0x260]的链表

4c98acd739772d76b3722e70ce3f8de6.webp

27af4b46ee4882453d3ed8de60a5f04b.webp

之后改写_IO_2_1_stdin_

4)FSOP执行触发流程

exit() -> __run_exit_handlers() -> IO_cleanup() -> _IO_flush_all_lockp()-> _IO_str_overflow() -> malloc() -> __malloc_hook-> setcontext -> mprotect()

8cbd1515c755e7ae7166602a48512f6e.webp


9754f45a891e35df2f0049be72d1c3e7.webp


61bb660940810c643fb807c670b19e40.webp

 通过setcontext 和 mprotect 跳转到之后写入的汇编代码进行执行

2ea8f3ddb05ef126a99e2e5fd647c3f2.webp

在got表的汇编代码中实现了 fd = open("flag.txt", 0)

86af398351a81a928953fc5008753055.webp

read(fd, buf, 0x40)

19c8f3436b0ae2eceb72bdaf6ee486b7.webp

write(fd, buf, 0x40)

f046ce5365d6903e01a8b7a2c0a48d4d.webp



往期精彩文章



黄金票据的制作与使用
baijiacmsV4代码审计!
记一道有趣的“签到”题
php代码审计总结




技术支持:白帽子社区团队— 扫码关注我们 


浏览 22
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报