PassWordBox_FreeVersion
题目分析
2.27版本的offbynull,有一字长的加密,一开始没想到直接填充/X00就可以leak加密的密钥,无脑爆破,写了个小程序,把密钥爆出来了。贴个源码。
1 |
|
然后就是常规操作,unlink后,达到任意地址读写,改malloc hook为one gadget,申请堆块触发one gadget。可以参考我之前写的
exp
1 | #!/usr/bin/env python3 |
JigSaw’sCage
题目分析
存在溢出,改v2的值,触发mprotect,使得heap区域可执行。
因为有text功能,可以执行堆块里的指令,然后就是写汇编布置参数调用execve(“/bin/sh”)来拿shell
exp
1 | #!/usr/bin/env python3 |
PassWordBox_ProVersion(赛后复现)
题目分析
存在uaf,但是size范围限制在了large bin大小,2.31版本常规large bin attack方法是被修复的,但是还是存在可以利用的漏洞
官方给的思路应该是house of banana
,向_rtld_global
里伪造结构体,手法和house of banana
一样,主要是一些参数的布置不太了解,当时没复现出,赛后硬调出来了。附上poc,可以调一下。
大佬博客:https://0xc4se.com/2021/07/19/glibc2.31house-of-banana/#toc-heading-5
poc
1 |
|
exp
1 | #!/usr/bin/env python3 |
网上还有一种方法,是修改mp_.tcache_bin
,使得大于0x408大小的堆块也能在tcache中,这种方法使得我们的攻击更为简单。
从祥云杯PassWordBox_ProVersion看GLIBC2.31 LargeBin Attack_黑客技术
只需要将这里改大就可以使得大于0x408大小的堆块也能在tcache中(利用large bin attack)。主要是这一个,可以看一下tcache部分的代码。
1 | #if USE_TCACHE |
后续就是attack tcache bin,就挺简单了,改free hook 为system
exp
1 | #!/usr/bin/env python3 |
note(赛后复现)
题目分析
存在scanf格式化漏洞,有申请堆块的功能,同时会leak堆块地址信息,还有show的功能,没有free
解题思路
通过格式化字符输入修改top chunk的大小(注意地址需要页对其),申请比top chunk大小还大的chunk来将top chunk放入到unsorted bin里来leak地址
然后伪造file结构体(包括vtable结构),将
_IO_2_1_stderr_
的_chain
改成我们伪造的file结构体,在程序结束的时候会调用_IO_flush_all_lockp
函数,这个函数最初的目的是为了保留数据不丢失,如果缓冲区还残留数据,就会调用_IO_OVERFLOW
来刷新缓冲区,这样的话,我们伪造的file结构体中缓冲区的长度fp->_IO_write_ptr-fp->_IO_write_base
就必须大于0,还有一个检测就是mode
要小于等于0
exp
1 | #!/usr/bin/env python3 |
还有一种方式leak地址通过改输出stdout的_IO_write_base
使得缓冲区存在数据。
最终执行_IO_do_write
来调用系统调用write
输出输出缓冲区
IO FILE之fwrite详解:https://ray-cp.github.io/archivers/IO_FILE_fwrite_analysis