AWD/AWDP-PWN-FIX

SafeParse

fix

1661246926024.png

main函数的跳表没法正常识别,把这个jmp rax给改成jmp eax过后再f5就正常了。

1661246997355.png

可以看出程序主逻辑是对一些特殊符号进行解释,然后对unk_4098这个地址的数据进行一系列的变换操作。

看到exit(0),以及libc是2.31,当时是盲猜了一手会去打ld上的rtld_global,在_run_exit_hand中劫持exit hook指针。所以就把exit给nop掉(以防万一,也把free给nop了)

1661247261632.png

(赛后问了出题人,打法是类似于今年qwb的qwarmup那题的,先丢这儿,过段时间看吧)

oldvm

fix

类似于上一题,这道题也需要在main函数中简单修复一下switch跳表,

1661247437875.png

然后这个附件是一个vm,进过初步分析发现,在函数sub_1DD0, sub_1E80, sub_1F30中,都有对传入的参数a1, a2, a3范围的检测。

1661247593083.png
1661247624087.png
1661247653548.png

可是在sub_1F30中,缺少了对a2<0这种情况的判断,会造成对*(_DWORD *)(4LL * a2 + *(_QWORD *)(qword_5050 + 24))地址非预期的访问。

为了方便,我这里直接将判断a3<0的分支改为了判断a2<0,只修改1byte即可。

1661247808960.png
1661247829169.png

mvvm

fix

一个vm解释程序

1661316287432.png

在readn的时候感觉是存在溢出的,因为size是0x100,里面是和0x1000判断的,但是由于溢出点在堆上,且后续并没有什么好触发的堆漏洞的函数,所以就没管了(前面交过一发nop free+修复堆溢出的,exp还是通过了)

然后思路就断了,不过看到init_io中存在alarm函数,且时间设置的非常长。

1661316628819.png

这里尝试着把参数改成了0x5,然后就fix通过了。

猜测原因是功能check用时较短,且exp通过vm的运行时间较长,所以非预期fix了。

(预期解的话是在vm_exec中,暂时还没有分析。这题还有一种非预期是上通防,这里给出一个较好用的通防脚本:https://github.com/TTY-flag/evilPatcher)

fmpfs

fix

该题实现了一个简单的文件系统,并且有一定的基本功能。

1661316800085.png

发现在对文件加密和解密的过程中,调用了sub_4032A5这个函数,发现它存在逻辑漏洞

1661317030891.png

v2刚好等于128时,v5会是一个未被赋值的悬挂指针,然后再下一次使用password认证,就能劫持到该指针,造成任意内存写。

1661317248584.png

直接将v2>128这个判断给nop掉即可fix成功。

ezcgi

fix

1662096776496.png

一个路由器的cgi程序,由于代码量比较大,所以直接从敏感函数入手了。

在函数sub_461E中有两个mmap语句

1662097776848.png

其中有一个权限给到了7,可能存在问题

1662097869538.png

这样就能通过fix检测了。

stream

fix

do_write函数中有一个size检测的逻辑漏洞

1662098314921.png

这里只检查了相应的指针是否存在,然后nbytes是否小于0x200。但是这个nbytes并没有和对应的stream当时open的大小进行比较,所以是存在溢出风险的。

do_open中最大能申请到的stream就是0x200,

1662098021871.png

这里我们可以直接给他patch为固定申请0x200。这样就能避免后面可能存在的溢出风险了。

1662098699143.png