pwnhub 9月公开赛
作者:jambolt 编辑:白帽子社区运营团队
"白帽子社区在线CTF靶场BMZCTF,欢迎各位在这里练习、学习,BMZCTF全身心为网络安全赛手提供优质学习环境,链接(http://www.bmzclub.cn/)
"
利用技巧
fastbin attack
tcachebin attack
IO_file
FSOP 利用 pwntools SigreturnFrame模块
程序分析
程序保护情况
沙盒保护
禁止程序执行系统命令,且限定使用 ARCH_x86_64指令
程序保护
程序保护全开
libc环境
glibc-2.31
程序漏洞出现点
free调用可以越界
leave_num 的最大值可以取为8,固free 最大次数为9
全局变量 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 写入 堆块的地址
泄露libc地址
申请堆块后的堆空间 写入 'a' * 8 覆盖堆块fd 可以进行libc泄露,写入 'a'*16覆盖 fd和bk 可以泄露堆空间地址
2)构造fastbins attack
题目中可以对 break_up_list进行越界free,先将tachebins 填满
之后再通过越界free(chunk_list[0])来构造double free,既
free(break_up_list[6])
free(break_up_list[7])
free(chunk_list[0]) #越界free
成功控制fastbins链表
3)通过fastbin attack 构造tcache bin attack
申请 两个 0x450的 堆块 top_chunk被挤到 0x290 + (0x460 * 2) = 0xb50,申请一个0x20的chunk_list[15] 定位到了 0xb50
从unsortedbin中申请0x20堆块 内容写上伪造的chunk_size
之后申请的smallbin也会从unsortedbin中申请
清空之前的tcachebins,剩下之前构造的double free
再次申请堆块,fastbins 进入 tcachebins,改写fd指针,控制tcachebins,tcache之后申请的空间可以改写 chunk_list[0]
之后free chunk_list[0], chunk_list[1],使之进入 tcachebins[0x260]中,再次申请0x40的堆块可以改写 tachebins[0x260]的链表
之后改写_IO_2_1_stdin_
4)FSOP执行触发流程
exit() -> __run_exit_handlers() -> IO_cleanup() -> _IO_flush_all_lockp()-> _IO_str_overflow() -> malloc() -> __malloc_hook-> setcontext -> mprotect()
通过setcontext 和 mprotect 跳转到之后写入的汇编代码进行执行
在got表的汇编代码中实现了 fd = open("flag.txt", 0)
read(fd, buf, 0x40)
write(fd, buf, 0x40)
往期精彩文章
黄金票据的制作与使用
baijiacmsV4代码审计!
记一道有趣的“签到”题
php代码审计总结
技术支持:白帽子社区团队— 扫码关注我们 —