AWD/AWDP-PWN-FIX
SafeParse
fix
main函数的跳表没法正常识别,把这个jmp rax
给改成jmp eax
过后再f5就正常了。
可以看出程序主逻辑是对一些特殊符号进行解释,然后对unk_4098
这个地址的数据进行一系列的变换操作。
看到exit(0),以及libc是2.31,当时是盲猜了一手会去打ld上的rtld_global
,在_run_exit_hand
中劫持exit hook
指针。所以就把exit给nop掉(以防万一,也把free给nop了)
(赛后问了出题人,打法是类似于今年qwb的qwarmup那题的,先丢这儿,过段时间看吧)
oldvm
fix
类似于上一题,这道题也需要在main函数中简单修复一下switch跳表,
然后这个附件是一个vm,进过初步分析发现,在函数sub_1DD0
, sub_1E80
, sub_1F30
中,都有对传入的参数a1
, a2
, a3
范围的检测。
可是在sub_1F30
中,缺少了对a2
<0这种情况的判断,会造成对*(_DWORD *)(4LL * a2 + *(_QWORD *)(qword_5050 + 24))
地址非预期的访问。
为了方便,我这里直接将判断a3
<0的分支改为了判断a2
<0,只修改1byte即可。
mvvm
fix
一个vm解释程序
在readn的时候感觉是存在溢出的,因为size是0x100,里面是和0x1000判断的,但是由于溢出点在堆上,且后续并没有什么好触发的堆漏洞的函数,所以就没管了(前面交过一发nop free+修复堆溢出的,exp还是通过了)
然后思路就断了,不过看到init_io
中存在alarm函数,且时间设置的非常长。
这里尝试着把参数改成了0x5
,然后就fix通过了。
猜测原因是功能check用时较短,且exp通过vm的运行时间较长,所以非预期fix了。
(预期解的话是在vm_exec
中,暂时还没有分析。这题还有一种非预期是上通防,这里给出一个较好用的通防脚本:https://github.com/TTY-flag/evilPatcher)
fmpfs
fix
该题实现了一个简单的文件系统,并且有一定的基本功能。
发现在对文件加密和解密的过程中,调用了sub_4032A5
这个函数,发现它存在逻辑漏洞
当v2
刚好等于128时,v5会是一个未被赋值的悬挂指针,然后再下一次使用password
认证,就能劫持到该指针,造成任意内存写。
直接将v2
>128这个判断给nop掉即可fix成功。
ezcgi
fix
一个路由器的cgi程序,由于代码量比较大,所以直接从敏感函数入手了。
在函数sub_461E
中有两个mmap
语句
其中有一个权限给到了7,可能存在问题
这样就能通过fix检测了。
stream
fix
在do_write
函数中有一个size检测的逻辑漏洞
这里只检查了相应的指针是否存在,然后nbytes
是否小于0x200。但是这个nbytes
并没有和对应的stream当时open的大小进行比较,所以是存在溢出风险的。
在do_open
中最大能申请到的stream就是0x200,
这里我们可以直接给他patch为固定申请0x200。这样就能避免后面可能存在的溢出风险了。