强网杯_final
没想到第一次打线下就回到了家乡河南,强网有排面!!
线下赛赛制为AD(awd)和RW(real world),real world就相当与挖掘0day,难度不言而喻,AD的话只有pwn题,占50%的分数,因此pwn采用的是只打ad的策略,最后也取得了不错的效果。
AD的赛前准备
打AD要想获得不错的成绩,我认为最重要的就是要抢占先机。率先发现漏洞,并写出exp,往往能打得别人措手不及,因此赛前的脚本准备往往非常重要。
准备脚本一般分为两类:1.批量IP生成脚本。2.批量交flag的脚本。
批量IP生成脚本:
1 | import sys |
批量交flag脚本:
1 | if __name__ == "__main__": |
AD全程高能
Pwn题一共出了4道。
win(一道windows下的栈溢出)
pd0(go写的一个框架)
sort(vm_pwn)
thrd(线程堆题)
个人认为最难的是pd0,好像只有0x300R第二天做出来了,疯狂打群场。不过我们守住了,ruan师傅在github上找到了源码,打patch改了max_size,nb!
下面依次分析:
0x01 win
win是第一个放出的题目,仅过4分钟vidar-time就发起进攻,我们也瞬间反应过来这道题目有后门果然:
1 | if ( !memcmp(v43, "vvqqccqaFEFH", v45) && v44 == 12 ) 我patch过了已经 |
第一波脚本:
1 | def main(host,port=16957): |
直接打到第六,但其他队也不是吃素的,patch改”wwssadadBABA”为其他字符串。
之后又有一个洞在这里:
1 | sub_1400060E0(v5, (__int64)"Please input the password: "); |
可见,第一次输入较长的password可以泄露出stack上的地址,然后再借助第二次的try again覆盖返回地址为上面后门函数的地址即可!
patch限制size为0x30,栈溢出不了。
0x02 pd0
源码地址:https://github.com/HITB-CyberWeek/proctf-2019/blob/master/services/handy/server/main.go
Fixing:
Either the padding should be removed or a handler should be modified to not leak the information, e.g. by changing the max allowed size of the generated picture.
0x03 sort
感觉是最有意思的一题。
题目意思是要完成对一个随机数组进行排序,所执行的汇编指令越少分数越高,分高的一方获胜,攻击方获胜拿flag,防守方获胜则攻击方无法拿flag.
同时有给出了出题人自己写的汇编指令系统,还要opcode和初赛的qwlogin一样,省去了逆opcode的时间。
opcode:
1 |
|
接下来就得手撕汇编了,我们选择了较为简单的冒泡排序,又因为没有那种直接操作内存的指令,就只能用寄存器传递,导致效率并不是很高。
1 | from pwn import * |
VM_pwn一定要耐心!!!一边写,一边调。
0x04 thrd
最后一题终于是heap题了,但牵扯到线程的条件竞争问题,使得调试起来会很奇怪。
漏洞存在于edit函数中:
1 | int __fastcall edit(unsigned int a1, unsigned int a2, int a3) |
还有一个洞是在enc中:
1 | void __fastcall enc(unsigned int a1, int a2) |
这个的逻辑主要是进行了异或的操作,但漏洞是strlen()函数,当填满堆后strlen会拿到下一个heap的size为,从而我们可以修改下一个heap的size。
程序一开始给出了elf基地址,PIE白开了,还能控制next heap’s size,因此可以unlink,但中间show泄露的时候,由于线程竞争问题,需要对heap进行修复,当时是抄流量才知道的,很迷。。
1 | from pwn import * |
ruan师傅nb,我还是太年轻了。还有很长的路要走:D