2020 GKCTF writeup
这周做了一下由防灾科技学院 Ginkgo 战队主办的
GKCTF2020,题目难度不大,但是有些小地方卡住了(再加上周末睡懒觉起晚了
RE
Check in
用字符画画了一个笔记本电脑,提示说自己找开机密码.
没有仔细逆画字符画和移动的部分,直接搜字符串找到个类似base64的字符串,查找下引用发现是base58.
1 | import base58 |
EzMachine
VM题,一共22个handler,有寄存器及栈.指令不难分析,很容易写出parser
1 | code = [0x01, 0x03, 0x03, 0x05, 0x00, 0x00, 0x11, 0x00, 0x00, 0x01, 0x01, 0x11, 0x0C, 0x00, 0x01, 0x0D, 0x0A, 0x00, 0x01, 0x03, 0x01, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0x02, 0x00, 0x01, 0x00, 0x11, 0x0C, 0x00, 0x02, 0x0D, 0x2B, 0x00, 0x14, 0x00, 0x02, 0x01, 0x01, 0x61, 0x0C, 0x00, 0x01, 0x10, 0x1A, 0x00, 0x01, 0x01, 0x7A, 0x0C, 0x00, 0x01, 0x0F, 0x1A, 0x00, 0x01, 0x01, 0x47, 0x0A, 0x00, 0x01, 0x01, 0x01, 0x01, 0x06, 0x00, 0x01, 0x0B, 0x24, 0x00, 0x01, 0x01, 0x41, 0x0C, 0x00, 0x01, 0x10, 0x24, 0x00, 0x01, 0x01, 0x5A, 0x0C, 0x00, 0x01, 0x0F, 0x24, 0x00, 0x01, 0x01, 0x4B, 0x0A, 0x00, 0x01, 0x01, 0x01, 0x01, 0x07, 0x00, 0x01, 0x01, 0x01, 0x10, 0x09, 0x00, 0x01, 0x03, 0x01, 0x00, 0x03, 0x00, 0x00, 0x01, 0x01, 0x01, 0x06, 0x02, 0x01, 0x0B, 0x0B, 0x00, 0x02, 0x07, 0x00, 0x02, 0x0D, 0x00, 0x02, 0x00, 0x00, 0x02, 0x05, 0x00, 0x02, 0x01, 0x00, 0x02, 0x0C, 0x00, 0x02, 0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x0D, 0x00, 0x02, 0x05, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x00, 0x00, 0x02, 0x09, 0x00, 0x02, 0x05, 0x00, 0x02, 0x0F, 0x00, 0x02, 0x03, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x02, 0x05, 0x00, 0x02, 0x03, 0x00, 0x02, 0x03, 0x00, 0x02, 0x01, 0x00, 0x02, 0x07, 0x00, 0x02, 0x07, 0x00, 0x02, 0x0B, 0x00, 0x02, 0x02, 0x00, 0x02, 0x01, 0x00, 0x02, 0x02, 0x00, 0x02, 0x07, 0x00, 0x02, 0x02, 0x00, 0x02, 0x0C, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x01, 0x02, 0x01, 0x13, 0x01, 0x02, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x0E, 0x5B, 0x00, 0x01, 0x01, 0x22, 0x0C, 0x02, 0x01, 0x0D, 0x59, 0x00, 0x01, 0x01, 0x01, 0x06, 0x02, 0x01, 0x0B, 0x4E, 0x00, 0x01, 0x03, 0x00, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x01, 0x03, 0x01, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00] |
算法也不难,根据范围做简单的异或/加减运算,然后转hex.
1 | res = [7, 13, 0, 5, 1, 12, 1, 0, 0, 13, 5, 15, 0, 9, 5, 15, 3, 0, 2, 5, 3, 3, 1, 7, 7, 11, 2, 1, 2, 7, 2, 12, 2, 2][::-1] |
BabyDriver
驱动逆向.Windows搞得不多,由于这题算法比较简单因此纯静态就能做了,不然还得想办法搭双机调试环境.
我也不太熟悉keyboard
hook,做的时候也是瞎鸡儿做的.(以下内容分析的不一定正确,有空再研究...)总之就找到了一个关于按键的回调函数,很容易分析出是走迷宫.根据键盘扫描码应该是ikjl
对应上下左右,(发现有个地方加6了,一开始以为是要加6对应wsad,因为看了一篇文章是hook
KeyboardInterruptService的)交了下发现不对,也没找到其他的什么地方,又试了一下大写就对了.
1 | from hashlib import md5 |
Chellys_identity
搜了下找到罪恶王冠,由于没看过就没继续看了
调试一下很容易分析出算法.
求小于n的斐波那契数质数(我也不知道我做题的时候怎么想到是斐波那契数的,可能是看到2
3 5了吧2333...,总之是dump下来的)之和再异或
1 | res = [0x000001B6, 0x00000498, 0x00000441, 0x00000179, 0x00000179, 0x00000640, 0x0000039C, 0x00000179, 0x0000064A, 0x0000039C, 0x0000027D, 0x0000027F, 0x00000178, 0x00000236, 0x00000344, 0x0000033E] |
WannaReverse
此题赛后解出
看这个名字应该是类似永恒之蓝的玩意,就没直接run了.
直接分析WannaReverse.exe
静态编译的,但是熟悉函数结构的话不难分析出一些常见函数.main开头用srand(time(0))设定种子,然后用rand()%10生成32字节伪随机密钥.用exe中硬编码的公钥加密32字节密钥,然后用伪随机的32字节密钥AES加密flag.最后把WannaReverse
字符串,RSA加密的AES密钥,密文写入文件.
一开始尝试分解N,无果
然后直接硬爆密钥了.想用flag筛选,筛选不出.
测试一下题目加密的结果,发现是用00padding的.然后用 *
n做结尾筛选,三个的时候筛选出了flag.一看原来是Unicode编码的,所以用flag
字符串筛选不到
这里说一下,Win7的记事本在保存文件的时候可以指定Unicode编码,开头的,同时也可以指定UTF-8或Unicode大端序或ANSI.
1 |
|
DbgIsFun
此题赛后解出
main函数利用SEH捕获int 3断点,改变控制流.
输入长度不为28会进入假逻辑(先减去28,然后检验EFLG为0x246,即是否相等)
真逻辑只是设置一个地方为1,然后sleep5秒,就没了
其实这里Sleep应该反应过来是有多线程在干什么事情,应该搜一下CreateThread之类的
然后这里就卡住了.比赛后重新看一遍,找到TLS回调函数,里面有SMC,这是正常解法(不知道为什么x86dbg没有在tls回调函数断下来,还是Windows做的少.一般情况下x86dbg在TLS断下来后我才会去看,很少主动找TLS)
解完SMC,这里是正常加密逻辑.先对sub_401540求和(防止patch与断点),然后RC4
1 | from Crypto.Cipher import ARC4 |