DAS9月挑战赛 PWN题出题思路

admin 2022年9月28日20:29:01评论29 views字数 2270阅读7分34秒阅读模式

DAS9月挑战赛 PWN题出题思路

本文为看雪论坛优秀文章

看雪论坛作者ID:Nameless_a





前言

DAS9月挑战赛 PWN题出题思路
进战队半个年后承接了PWN题的出题任务,由于还要校内招新,加上堆题不太想出house(感觉没必要太卷glibc),所以整体难度不太难。揉合了学pwn一年以来见过的比较好玩的利用手法,也算是自己出的很开心,希望大家在复盘的时候也玩的开心。





appetizer


碎碎念


本来是把这题当作签到题的,没想到cyberprinter被非预期了。导致难度下降很多被秒了,导致这题成了第二解的最多的。


出题思路


考察大家对栈帧的理解,设置了一个栈帧复用:
DAS9月挑战赛 PWN题出题思路
在func函数栈帧的读入,能被check函数复用从而绕过里面对栈上变量值的检查。

同样考察和栈有关,函数调用时候rsp的值会减少,这里故意设置给的bss段的地址非常接近bssbase:
DAS9月挑战赛 PWN题出题思路
DAS9月挑战赛 PWN题出题思路
如果栈迁移到这里,不抬栈的话,可能会导致后续的ROP调用函数的时候减少rsp,访问“白色”(指gdb里白色的没有w权限的)内存。

而后的利用就是非常简单的ret2csu ORW打印flag了。

题目改进


聪明的师傅其实发现我的沙箱这里没有对架构的检测:
DAS9月挑战赛 PWN题出题思路
所以可以通过retf切换到x86_32,先mmap出一段32位下可用内存(4字节),然后调用32位的execve(32位下和64位的execve的系统调用号不一样)。

但这么做太复杂了。但如果我把orw ban了,只给mmap呢?大抵只能这么做了,但是这样就太阴间了。




cyberprinter


碎碎念


由于话太多导致的非预期。


出题思路


先说说预期解,预期是fmt改exit里面的这里:
DAS9月挑战赛 PWN题出题思路
但是由于我们程序最后是_exit结束的,所以还需要一个ret再次返回到vuln函数,返回同样可以通过fmt修改:
DAS9月挑战赛 PWN题出题思路
修改红色箭头的低一字节,在开了pie的情况下有16分之一概率能使fmt修改到黄色箭头。而黄色箭头修改低两字节,也有16分之一的概率ret(start或者就vuln函数)。所以说是一个256分之一的爆破。

但是,怎么就非预期了呢?答,printf()后接了一个puts:
DAS9月挑战赛 PWN题出题思路
由于puts函数在调用的时候有一个这个东西:

DAS9月挑战赛 PWN题出题思路

而这个玩意是有点类似elf的plt的,内部也会跳转到got:

DAS9月挑战赛 PWN题出题思路

可以改这个为one_gadget,直接getshell。

当时都没注意,写那个东西纯纯为了增加题目的故事性。

题目改进


把printf后面的puts去掉。





bar


碎碎念


受8月份打的巅峰极客的影响,当时想的就是切割堆块,使得tcache里面有个堆块的fd指针为UB的main_arena,然后改成free_hook。但当时完全是想错了。于是就保留了这个思路用到自己出的题上。

出题思路


其实就是一个非常经典的利用——填满tcache,然后继续放进UB合并先后放入的chunk1,chunk2(2位于高地址),取走tcache一个堆块,double free chunk2放入tcache,这样就能获得一块既在UB里面,又在tcache里面的堆块了,然后切割合并的堆块就能在没有edit的情况下,修改tcache chunk的fd指针为libc地址。

题目改进


感觉挺有意思的中等题,应该不太需要改了。
什么,提高难度?加house?加高版本?
有几斤小马珍珠敢这么出题?





cgrasstring


碎碎念


排除了house,堆题只能选择结构体或者C++,但感觉结构体以俺的渣渣数据结构,也弄不出来XCTF R-tree那么猛的题,所以就搞搞简单的C++。参考参考了chuj学长给Hgame2022 week4出的verctor题,然后自己去研究研究了很久C++的STL容器,一开始想的是map,但是没研究出啥可以出题的漏洞。于是就把眼光放在了string类上面。

出题思路


c++的string类的resize非常类似realloc函数,当resize是扩大当前string时,会delet掉原来的string,然后新建一个。

题目设置了一个char类型的指针数组,存储了string类begin迭代器的值(设置可能不太严谨,效果其实是为了保存string类似字符数组的指针,然后用来赋值):
DAS9月挑战赛 PWN题出题思路
对于resize,如果触发扩容的delet,我们并没有修改point上的残留指针,就会存在UAF,通过这个UAF进行正常的2.27的tcache attack就行了。

题目改进


其实笔者在出这道题的时候对c++的类的研究并不是很深入,题目设置还是有不严谨的地方,比如获取string类的类似字符数组的指针的东西,c++好像是有专门的函数的,但是当时并不知道。




尾声


这次出题也是对个人能力的一次锻炼吧,堆题可能止步于此了,而且最近打比赛几乎很少能看见堆题,大多都是考察异构pwn或者其它一些更深入、复杂的东西,希望以后学习过后能出这类的题。


DAS9月挑战赛 PWN题出题思路


看雪ID:Nameless_a

https://bbs.pediy.com/user-home-943085.htm

*本文由看雪论坛 Nameless_a 原创,转载请注明来自看雪社区

DAS9月挑战赛 PWN题出题思路

2.5折门票限时抢购DAS9月挑战赛 PWN题出题思路

峰会官网:https://meet.kanxue.com/kxmeet-6.htm



# 往期推荐

1.CVE-2022-21882提权漏洞学习笔记

2.wibu证书 - 初探

3.win10 1909逆向之APIC中断和实验

4.EMET下EAF机制分析以及模拟实现

5.sql注入学习分享

6.V8 Array.prototype.concat函数出现过的issues和他们的POC们



DAS9月挑战赛 PWN题出题思路



DAS9月挑战赛 PWN题出题思路

球分享

DAS9月挑战赛 PWN题出题思路

球点赞

DAS9月挑战赛 PWN题出题思路

球在看



DAS9月挑战赛 PWN题出题思路

点击“阅读原文”,了解更多!

原文始发于微信公众号(看雪学苑):DAS9月挑战赛 PWN题出题思路

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月28日20:29:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   DAS9月挑战赛 PWN题出题思路http://cn-sec.com/archives/1322429.html

发表评论

匿名网友 填写信息