-
-
[原创]看雪 2022·KCTF 春季赛 第九题 同归于尽 WriteUP
-
2022-5-31 10:23 6014
-
看雪 2022·KCTF 春季赛 第九题 同归于尽 WriteUP
一、开篇
当天中午写完第八题的WriteUP,就马上溜过去看第九题了,不过当看到出题战队的名字——中午吃什么,就顿时陷入了深深的沉思,之后立即去吃了顿好的,果然美食是最能安抚人心的。
老样子,菜狗镇楼.jpg
二、初步分析与思路
拿到题目,看了眼大小,822KB,心中顿时感到不妙,丢到X64DBG,调试跟踪一波,得到如下信息。
程序内字符串均已加密,运行时通过xor特定值解密。
程序启动时创建了一个socket线程,会接受数据
共三次数据,三条线程,第一次解密一串16进制值,第二次BASE64第一次的值,第三次MD5第二次的BASE64
主线程中给出了FLAG首位为A,长度为32
主线程在一个充满了垃圾代码与套娃的call里执行判定(套娃CALL我们命名为bad)
3.中的数据如下
35 C9 ED AA 55 55 55 EC DD 55 65
NcntqlVVVezdVQ==
AFF7AEFB8AE17A47B6B915FA9818CB16
当时没注意到第三个MD5值其实就是FLAG(明明都暗示首位为A,长度32了),还特意去分析了下后续的流程,属实是中午吃饱了,就开始摸鱼了。
以上为fake news,"假"数据与FLAG存在细微差别,读者可以自行比对一下。
下面是分析过程的一些总结,那个SM4刚开始确实没看出来,刚开始还以为是自写的算法(害怕),后来查表才发现是SM4,属实是萌新的悲伤。
以下出现的函数地址均为RVA。
分析一下套娃CALL,也就是bad函数(0x3A44D)(函数结尾居然是ret 0x2460,这调用深度有点恐怖啊),我们会发现其中大部分是jnb(基本无用)和jp(范围内会有有效调用),每次调用函数前会执行一个类似memmove的函数(0x3CA3),那么我们就可以分析对memmove函数(0x3CA3)的引用,来寻找别的有效调用,通过抽样分析10个调用,我们发现如下规律。
这是有一定功能的函数调用:
0030B11E | E8 808BF9FF | call <crackme.my_1memmove> | 0030B123 | C645 FC 2D | mov byte ptr ss:[ebp-0x4],0x2D | 2D:'-' 0030B127 | C645 FC 00 | mov byte ptr ss:[ebp-0x4],0x0 | 0030B12B | 8BCE | mov ecx,esi | 0030B12D | E8 601F0000 | call <crackme.judge> |
这是套娃函数的调用方式:
002B86E3 | E8 BBB5FEFF | call <crackme.my_1memmove> | 002B86E8 | C645 FC 07 | mov byte ptr ss:[ebp-0x4],0x7 | 002B86EC | 56 | push esi | 002B86ED | C645 FC 00 | mov byte ptr ss:[ebp-0x4],0x0 | 002B86F1 | E8 571D0200 | call <crackme.xxxed> | |
利用该特征,我们可以使用特征码搜索,定位出有一定功能的函数,最终找到几个有用的函数。
三、实践
通过特征码搜索,我们找到大概25个可用函数,分析得到
0x993D5 字符串处理函数,负责将输入的十六进制文本转换成十六进制数据(但是当你输入的不是十六进制文本,而是别的东西。。)
0x4EBEC 异或部分,负责将上一步输入的十六进制数据与一串0x55异或。
0x631E9 SM4部分,对上一步处理完成的值进行加密(核心位于0x652AF),算法可以通过搜索其所用表的特征得出,加密解密可去这个网站,该网站支持十六进制。
0x6D092 判断输入正确与否的函数,核心判断位于0x72417。
0x783E3 大小写判断部分,应该是为了防止大小写造成的多解。
到这里我们就可以将最终判断所用值拿去SM4解密,进行一次转换,得出正确的输入值
AFF7AEFB8AEFF697B6B915FA9818CB16
四、题外话
做完这道CTF回想起来。。。如果当时直接测一下那个MD5值,估计就不用后续那么麻烦了,毕竟给了FLAG的大部分内容,说到底还是CTF方面的经验不足,萌新的悲伤~
五、多解分析
问题应该是出在字符串处理函数,该函数每次读两位相邻字符转为大写,减去0x30,再减去0x7,最后位或去合并值,例如
0x41 0x42 |aa ---- 0x11 0x12 |?? ---- 0xa 0xb|?? ---- 0xab
因为存在大小写判断,所以输入值不能大于0x61,但是0x20~0x61,足够我们去弄几组多解,如:
符号流:AFF7AEFB8AEFF6@>`]``15FA9818CB16
字母表流:AFF7AEFB8AEFF697B6B9GLFA98GOCBGM
[2022夏季班]《安卓高级研修班(网课)》月薪三万班招生中~