看雪2022 KCTF 春季赛 | 第九题设计思路及解析

admin 2022年6月2日01:37:09评论21 views字数 2581阅读8分36秒阅读模式
看雪 2022 KCTF春季赛 于5月10日中午12点正式开赛!

第九题《同归于尽》已于今日中午12点截止答题。

经统计,此题围观人数1698人,共6支战队成功破解。

看雪2022 KCTF 春季赛 | 第九题设计思路及解析

接下来和我一起来看看该赛题的设计思路和相关解析吧!



出题团队简介


第九题《同归于尽》出题方 【中午吃什么】战队:


看雪2022 KCTF 春季赛 | 第九题设计思路及解析


看雪2022 KCTF 春季赛 | 第九题设计思路及解析



赛题设计思路


题目答案:AFF7AEFB8AEFF697B6B915FA9818CB16

 

使用方案一(老规则)

详细的题目设计说明和破解思路:
运行流程:
-->输入序列号
-->存入string
-->启动本地socket线程(干扰,收发一些假数据)
-->自定义类初始化
-->获取SM4密钥(放在内存里一个固定的__declspec(naked)函数)
-->字符串转HEX数组(16字节)
-->异或加密
-->SM4加密
-->结果比较

 

详细设计:
1、自定义类有20多个函数,f1调用f2调用f3类推,将计算逻辑分开,增加破解难度。
2、本地socket为干扰分之,会进行一些假数据加密【异或加密-->BASE64加密-->MD5加密】。
3、字符串均使用内置函数加密。
4、自定义的超大类会使IDA F5解析不完整

 

破解思路:
1、anti会干扰计算结果(需要过简单的反调试)(插件即可过)。
2、有干扰的无用代码,需要跟踪或去除干扰代码。
3、解密流程为【HexToString(自定义异或解密(SM4解密(key, arr)))】 key和arr均能逆出。



赛题解析


本赛题解析由看雪论坛大侠 上学困难户  给出:

看雪2022 KCTF 春季赛 | 第九题设计思路及解析





初步分析与思路


拿到题目,看了眼大小,822KB,心中顿时感到不妙,丢到X64DBG,调试跟踪一波,得到如下信息。

  1. 程序内字符串均已加密,运行时通过xor特定值解密。

  2. 程序启动时创建了一个socket线程,会接受数据

  3. 共三次数据,三条线程,第一次解密一串16进制值,第二次BASE64第一次的值,第三次MD5第二次的BASE64

  4. 主线程中给出了FLAG首位为A,长度为32

  5. 主线程在一个充满了垃圾代码与套娃的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 KCTF 春季赛 | 第九题设计思路及解析

看雪2022 KCTF 春季赛 | 第九题设计思路及解析

第十题《陷入轮回》正在进行中

👆还在等什么,快来参赛吧!


如何成为一名出色的CTF选手?
看雪2022 KCTF 春季赛 | 第九题设计思路及解析
看雪2022 KCTF 春季赛 | 第九题设计思路及解析
*点击图片查看详情

入门-基础-进阶-强化,只需四个阶段!摇身一变成为主力、中坚力量

看雪2022 KCTF 春季赛 | 第九题设计思路及解析



看雪2022 KCTF 春季赛 | 第九题设计思路及解析
- End -

看雪2022 KCTF 春季赛 | 第九题设计思路及解析


看雪2022 KCTF 春季赛 | 第九题设计思路及解析

球分享

看雪2022 KCTF 春季赛 | 第九题设计思路及解析

球点赞

看雪2022 KCTF 春季赛 | 第九题设计思路及解析

球在看



看雪2022 KCTF 春季赛 | 第九题设计思路及解析
“阅读原文展开第十题的战斗!

原文始发于微信公众号(看雪学苑):看雪2022 KCTF 春季赛 | 第九题设计思路及解析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年6月2日01:37:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   看雪2022 KCTF 春季赛 | 第九题设计思路及解析https://cn-sec.com/archives/1072639.html

发表评论

匿名网友 填写信息