-
-
[原创]看雪CTF 2017年秋季赛 第三题 writeup
-
2017-10-29 08:47 2449
-
反调试
这一题的核心在于绕过反调试来进行动态调试。
作者写了很多的反调试,总体的感觉在于都过于集中,很容易就绕过了。
每一块反调试都是 粗粗一看就能够 猜出这一块就是反调试。
程序没有完整性检测,nop掉这类反调试区域依旧能够调试
v5 = 0; v5 = sub_42E27F(); if ( v5 == 1 ) sub_42E086(); v5 = 0; v5 = sub_42E162(); if ( v5 == 1 ) sub_42E086(); v5 = 0; v5 = sub_42D4F6(); if ( v5 == 1 ) sub_42E086(); v5 = 0; v5 = sub_42DA41(); if ( v5 == 1 ) sub_42E086(); v5 = 0; v5 = sub_42D096(); if ( v5 == 1 ) sub_42E086(); v5 = 0; v5 = sub_42E45A(); if ( v5 == 1 ) sub_42E086();
加、解密环节
程序是静态编译的,部分算法比较难以识别
程序刚开始进行了两次base64解密,然后又分为两部分
一是根据解密后的字符串,来进行类似莫斯电码的解密。。
.-** a -... b -.-. c -..* d .*** e ..-. f --.* g .... h ..** i .--- j -.-* k .-.. l --** m -.** n ---* o .--. p --.- q .-.* r ...* s -*** t ..-* u ...- v .--* w -..- x -.-- y --.. z ----- 0 .---- 1 ..--- 2 ...-- 3 ....- 4 ..... 5 -.... 6 --... 7 ---.. 8 ----. 9 .-.-.-* . ---...* : --..--* , -.-.-.* ; ..--..* ? -...-** = .----.* ' -..-.** / -.-.--* ! -....-* - ..--.-* _ .-..-.* " -.--.** ( -.--.-* ) ...-..- $ .-...** & .--.-.* @ .-**-.. .
并且会对两次base64解密之后的字符串进行一次 前三位的sm3哈希求值。
刚开始看到这个的时候以为需要爆破hash..后来则不是
验证环节
第一个验证环节是使用 sm3哈希值与输入未进行base64解密的参数进行比对,要全部相同才可以。
第二个环节是一个迷宫,&unk_49B000
处的数值就是一张迷宫
0 1 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 0 0 1 1 0 0 0 1 0 1 0 0 1 1 0 1 0 0 0 1 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 1 1 1 1 0 0 0
然后
--..z
.-..l
.--.p
--.-q
分别为下右左上
而 zlzllllzzzppqppzzzlllzlllzllqqpqpqqlq
能到程序意图中的 x=8,y=3
然而 程序有一个bug 就是 遇到 空格就会跳出循环,,就是说 如果 不走迷宫 也是一样能够过的 只需要空格即可
所以我在验证的时候 输入的是 zlzllllzzzppqppzzzlllzlllzllqqpqpqqlq
(因为最终的注册码不能有=的出现,所以多加了个空格)
转为 莫斯电码为
--.. .-.. --.. .-.. .-.. .-.. .-.. --.. --.. --.. .--. .--. --.- .--. .--. --.. --.. --.. .-.. .-.. .-.. --.. .-.. .-.. .-.. --.. .-.. .-.. --.- --.- .--. --.- .--. --.- --.- .-.. --.- //
得到的注册码为TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDNHRMaTRnTFMwdUxTQXZMdz09b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94
但是实际上只需要空格就可以了
简单的///////
就可以了
得到零一组解为 THk4dkx5OHZMdz099aa4f168af9fcb372825d2e817379ab6ad4a7da973a38c44a0ec56a788dfb89b
思路和想法不错,,,就是在验证迷宫的时候代码写烂了。。。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课