2020 KCTF秋季赛 | 第七题设计及解题思路
2020-12-04 18:59:00 Author: mp.weixin.qq.com(查看原文) 阅读量:16 收藏

天气越来越冷,但是KCTF 比赛热度持续上升,在刚刚结束的第七题《鱼目混珠》中,共有1400多人围观,最终8支战队挑战成功。

TLJ 夺得首旗,成功实现逆袭。A2 战队也开始爆发,成为第四支攻击成功的团队,斩获96分,进入前十名。明月照大江1024战队 给我们带来惊喜,抓住最后的机会,也成功挤进第20名。

比赛日益激烈,可以看到战队提交答案的时间都非常接近。接下来我们一起看看本题都有哪些奥妙吧!
一. 题目简介

击败仿生人大军后,肖恩激动地熊抱住你,欣慰地告诉你他就知道你收到求救信号,一定会回来救他们的。

询问事情原委后,你得知肖恩正是在“破晓”与地球的联络被切断后,想尽办法向飞船发送求救信号才被仿生人大军盯上,而这些黑客们也因尝试对外联络被拘捕。

在微型计算机即将被统一收缴的最后关头,他在黑客们的掩护下,远程入侵仿生肖恩的芯片,给你留下了他们的坐标。

现在人是救出来了,但对黑客来说,没了计算机就如同折翼的鹰一般无法自由飞翔,必须马上取回被收缴的微型计算机!

在前往中央控制室的路上,肖恩开始八卦起这个神秘的美少女与你的关系,上下打量一番还说觉得很眼熟。

你让肖恩利用国安局的高级权限,进入公民个人信息库搜索比对少女的身份,却惊讶地发现查无此人!本来已对她产生些许信任的你顿时又陷入了重重迷雾中……

中央控制室的门缓缓合上,你们开始翻找被藏起来的计算机。突然却有人惨叫着倒下了,随即黑客们开始自相残杀!!

你们三个想上去劝架,才发现主动发起攻击的原来是仿生人。看来是在刚才与他们的混战中,有仿生人趁乱混入黑客中,伺机发动反击!

抓紧时间找出所有混在黑客中的内鬼,把伤亡降到最低!

* 上下滑动查看
二. 出题团队简介
三.设计思路
设计思路由 lelfei  提供
注册码:
10C7F30833B9C4563BF035C32D8C7709E040FCA64E211F34CD3FE773

说明:注册成功时输出“GOOD!”

设计说明
这一题是这一段时间一些crackme想法的大集合,包含花指令、调试检查、内存校验、大数计算、溢出利用等等,如果能够理清各种干扰项,最后的算法其实比较简单。
自己写了一个大数计算类BigNum,数据位有0x20字节,实现了基本的加减乘除算法。有2个固定大数P=0x3FAFFA2B01B6BA9744C4B4E010010401和Q=0xFEA1BD9E6964129D8F5079E1,其中P共有4个DWORD组成,其中高位的3个DWORD分别是“INPUT:”、“GOOD!”、“ERROR!”的计算值,输出“INPUT:”等待用户输入。
用户输入注册码记为D,对D的前7位和后7位转换为数值记为sn1和sn2,对main()函数和调试检查函数分别计算内存校验,根据调试检查结果分别与这2个校验值进行异或。循环9次后,检查结果是否为P的第2、3个DWORD。
D转换为大数,取P的第一个DWORD记作E,计算D*E/0xE053D0F+P+Q记为F,计算F-P*Q记为m1,要求m1的数据位不超过0x10字节。
计算F*0x0E053D0F*25记为m2,再自加一次m2+m2会导致溢出覆盖掉P的长度位,导致P=1。
比较m1==P,即最终验证为D*E/0xE053D0F+P+Q-P*Q==1,正确则提示“GOOD!”。
程序源码中定义了4个花指令标志位:
#define JUNKCODE5()  asm volatile("mov $0x55555555,%eax")#define JUNKCODE7()  asm volatile("mov $0x77777777,%eax;inc %eax;inc %eax;")#define JUNKCODE9()  asm volatile("mov $0x99999999,%eax;inc %eax;inc %eax;inc %eax;inc %eax;")#define JUNKCODE11() asm volatile("mov $0xAAAAAAAA,%eax;mov $0xBBBBBBBB,%eax;inc %eax;")
在源码的main()和调试检测函数中添加了很多引用占位,编译后使用replace_byte.py把标志位替换成随机花指令。
由于替换花指令导致内存校验值发生变化,程序中使用了2个全局变量作为salt,需要在花指令替换完成后,调试时修改程序流程计算出校验值,再由校验值计算出2个salt手动patch到程序的数据段。
调试检测函数中有一个是硬件断点检查,程序源码中并没有调用设置硬件断点的函数SetDrxBreakPoint(),而是在编译之后手动patch到入口附近,代码为:
0040CA3A    50                    push eax0040CA3B    E8 06000000           call 33.0040CA460040CA40  - FF25 AC734C00         *jmp dword ptr ds:[<&msvcrt.__lconv_init>]0040CA46    58                    pop eax0040CA47    05 70900A00           add eax,0xA90700040CA4C    FF10                  call dword ptr ds:[eax]0040CA4E    EB 03                 jmp short 33.0040CA530040CA50    31C0                  *xor eax,eax0040CA52    C3                    *retn0040CA53    58                    pop eax0040CA54  ^ E9 77FFFFFF           jmp 33.0040C9D0
加*号的为原来数据不要动。目的是调用SetDrxBreakPoint()函数。其中有add eax,0xA9070让指针指向main()中保存SetDrxBreakPoint()的数据地址。这一步操作的主要目的是避免显示调用函数。
总结及破解建议
1. “花指令+内存校验”让动态调试过程很恶心,估计很多人都会想到解决办法,就是把去花后的数据保存下来用于IDA分析。
2. “调试检测+内存校验”会让动态调试数据变得不可靠,其实分析完后面大数验证的代码可以发现,这一部分验证并没有起多大作用,通过大数验证就已经让结果唯一了。这一段验证的主要目的只有一个,就是防止在大数前面补0造成多解。
3. 大数验证过程需要动态分析与静态分析相结合,静态分析很容易了解到验证过程就是D*E/0xE053D0F+P+Q-P*Q==P,但是却很难看到溢出漏洞改变了P值。
4. 大数验证看似计算很乱,分析清楚之后其实很简单,根据这几个变量名也差不多能看出来,其实就是RSA算法中最基础的一步,根据d*e+k*Phi=1的解反求出Phi,再根据Phi=(P-1)*(Q-1)=P*Q-P-Q+1=N-P-Q+1来进行最终验证。
此crackme使用CodeBlocks设计,gcc编译,在win7x64下测试通过。
四. 解题思路

解题思路由作者 k1ee 提供

修复各种❀,比如连续的两个分支跳转,以及call手动回堆栈,旋转跳跃等。
 
 
修复完成后看到原始代码:
 
初始化反调试函数表,注释是理论上的没调试情况,但本人Win反正不是这样,最后靠爆破得出。建议防守方自己扣分。随后由两个字符串新建了两个256位数。

对前7字节以及后7字节进行校验,其中反调函数9和10是对main以及另一个函数本体进行校验和,通过逆向算法可以得出结果:

后续算法就是256位的加减乘除,其中关键点在于加法会溢出(pwn题?),导致覆盖后面的256数结构的比特数,如下:

两个大的数相加会把dword_4C5110的长度由0x10变为0x01,因此最终比对的其实是1,因此要逆向推导。
a = 1b = 0x3FAFFA2B01B6BA9744C4B4E010010401 * 0xFEA1BD9E6964129D8F5079E1print(hex(a)) a = a + ba = a - 0xFEA1BD9E6964129D8F5079E1a = a - 0x3FAFFA2B01B6BA9744C4B4E010010401a = a * 0xE053D0Fa = a // 0x10010401 print(''.join(reversed(hex(a))).upper())

得到输出:

00C7F30833B9C4563BF035C32D8C7709E040FCA64E211F34CD3FE773X0
注意到头尾和刚才的计算结果,得出最终Flag:
10C7F30833B9C4563BF035C32D8C7709E040FCA64E211F34CD3FE773

看完解析你会了吗?你还有不一样的解题思路吗?
实践出真知~速速动手自己做一遍,才算把知识装进脑子~
欢迎大家分享解题思路哦~

现在第八题《惊天阴谋》正在火热进行中!

有你比赛更精彩!

越早提交答案,得分越高哦!

立即扫码加入战斗!

华为全面屏智能电视、Xbox One X、JBL 无线蓝牙耳机等你来拿哦!

赛题回顾

2020 KCTF秋季赛 | 第一题点评及解题思路

出题战队:七星战队

2020 KCTF秋季赛 | 第二题设计及解题思路

出题战队:中娅之戒

2020 KCTF秋季赛 | 第三题点评及解题思路

出题战队:2019

2020 KCTF秋季赛 | 第四题点评及解题思路

出题战队:大灰狼爱喜羊羊

2020 KCTF秋季赛 | 第五题设计及解题思路

出题战队:金左手

2020 KCTF秋季赛 | 第六题设计及解题思路

出题团队:T.O.

你的好友秀秀子拍了拍你

并请你点击阅读原文,参与最新一题的挑战!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458377813&idx=1&sn=5b2b28faaf8875a1ed4263667a8ad44f&chksm=b180eedf86f767c9e229b71472ddab4cedfa855b094097528e6fdbdc012b330c1e4a41d32587#rd
如有侵权请联系:admin#unsafe.sh