恕我直言,周五的比赛。。。都是在针对要上课的人orz边听课边做题真的无法专心做题23333,虽然也因为太菜了,课上连double free都没反应过来怎么利用。。。
Amazon
审查
保护全都开了,libc版本是2.27。
通过分析功能,可以发现delete功能没有清零指针。没有修改功能。添加部分被分割成三个部分[给定内容|自定义内容|自定义内容大小]
,这样使得正常情况下fd不在控制范围内。需要通过构造堆块重叠。
由于有tcache机制,构造堆块重叠更加方便。利用分配到unsorted bin中的堆块,通过分割,使得分割出来的堆块在原来堆块的可控范围内,在从tcache中将原来的堆块分配出来,就能修改fd字段,从而实现任意地址分配。
分配到unsorted bin中的块的fd和bk会保存main_arena+96
的值,由此得到libc的基地址。然后经实验,没有可用的one gadget
,通过system('/bin/sh')
来get shell。
利用
首先分配两个块,第二个块用来防止跟top chunk合并。
然后首先填满tcache,再次checkout
,此时,fd和bk字段已经是main_arena+96
了,通过show函数打印,然后获得libc的基地址,从而获得system
地址以及free_hook
地址。
分配三个小块。需要满足这三个块都是从unsorted bin中分割而来,并且第二第三个块的fd需要在原来块的可控区域。然后将第二个块释放,进入对应的tcache。
构造payload,将原来的tcache中的大块分配出来,然后使得成功覆盖之前三个小块的第二个小块的fd为fake chunk-0x10
以及第三个小块的fd为/bin/sh
。
然后就是分配小tcache修改free_hook
了。
最后free('/bin/sh')
。
Exp
一开始写得很麻烦,我以为tcache会有对chunk的检查,想不到啥也没有orz,根据队内大佬的exp修改了以下,看起来就简便了很多23333
1 | #!/usr/bin/python |
Fkroman
前排感谢PKFxxxx解答疑问,wtcl
审查
第一次写跟IO_File相关的题orz,最近得找个时间把FSOP学了才行。不然感觉越来越多的题目用到IO_File就完全动不了orz
程序是一个传统的目录型文件,保护全开,但是没有输出功能。
程序有两个漏洞,一个是free的时候有悬挂指针,可以用来double free
制造任意地址分配。还有一个是edit功能没有限制长度,导致任意长度的溢出,这个就方便我们uaf。
现在重要的问题就在于,没得输出,一般情况下,这时应该借助stdout文件输出,但是程序开了PIE,无法轻易得到stdout
的地址。那咋办嘛.jpg
显然,我们可以知道,再unsorted bin中chunk的fd字段会设置成main_arena
相关的值,这样的话~我们就可以通过部分覆盖,使之指向stdout部分去,然后讲stdout部分malloc出来,这样,就能泄露libc的地址啦。
利用
思路首先就是要得到main_arena
相关的地址,然后再通过修改最后几个字节使之指向_IO_2_1_stdout
,然后再把_IO_2_1_stdout
给分配出来,得到libc的地址。然后就是正常的利用了。
为了能够得到stdout的chunk,我们需要使用double free,首先free使之进入small bin,然后通过溢出修改size,再次free,使之进入unsorted bin。此时,该chunk的fd已经指向了main_arena+88
,然后再次通过溢出,修改size为原来大小,并且修改最后几个字节。由于程序开了PIE,需要多试几次。然后再将_IO_2_1_stdout
块分配出来。修改write_base
得到libc基地址。剩下的就简单啦。。。
Exp
1 | #!/usr/bin/python |