看雪 2016 CTF 第十八题 点评和解析
看雪版主&评委netwind点评
该题把注册码算法验证过程分为了两部分,第一部分的算法用到了除法运算,要确保除数为 0 进入异常处理流程后,才能进入第二部分注册码验证过程;第二部分注册码的算法验证流程隐藏在一个简单的 VM 虚拟机里。该题主要考察选手分析 VM 的能力,VM 分析清楚了,便可得到答案。
下面选择了分析者loudy的详细分析
首先看 WinMain 函数,如下图,可知关键处理函数为 DialogFunc,从该函数可以看出 sub_401120 函数为注册函数。
分析 sub_401120,从 C 代码可以看出,该函数非常简单,看不到注册逻辑。
看汇编代码可以看到,4011AC 处代码等效于 JMP 4011BC,而这种 push retn形式跳转迷惑了 IDA 的分析。
修改成 JMP 4011BC,再看 C 代码,从中看不到明显的注册算法痕迹,推测对真正的注册流程进行了隐藏。
查看 sub_401120 汇编代码,发现下面左图代码不在正常流程(可能为异常处理流程)中,加上右图中(正常流程)有除法操作,如果出现0为除数情况(即v6==0xD4C2086),即可调用该异常处理流程,否则无法正确注册。
而 0xD4C2086 等于 9 个字节值(大于 1)的乘积,对 0xD4C2086 分解可以知道,0xD4C2086 等于从 2 开始连续 9 个质数的乘积,因此,逆向算法如下,得到 1-9 位为“ pediy2016 ”,且从第 14 位开始字节值必须在‘ 0 ’-‘ 9 ’之间。
进入 sub_4013B0 可以看到 loc_40420E 处代码有一个虚拟机跳转指令(到各个 handler)。因为没有花指令,手动跟踪比较简单,不过比较耗时间,过滤掉和算法流程关系不大的。
Handler:loc_40408B 处如下图,依次取输入字符串的一个字节,判断是否为0,不为 0 则地址 [3C0770] 处加 1,即计算输入字符串长度(当然不止此handler,其它自行跟踪即可)。
Handler:loc_403ABD 处如下图,如果取得的字符串长度等于 0x14,则往下执行,否则失败。
Handler:loc_403CE8 处如下图,循环 5 次,输入字符串第 10-14 位依次和“cool1”(0x63,0x6f,0x6f,0x6c,0x31)对比,相等则继续,不等则失败,因此第 10-14 位为“cool1”。接下去就处理 15-20 位。
第 14-16 位一起处理,已知第 14 位为‘1’,几个流程循环3次。
1、40222E:取得第X(14-16)位值;
2、402877:取得第X位对应的数值,例0x31则对应1;
3、4021C8:数值复制
4、402F39:调用两次,实现立方运算。
5、402665:保存立方运算结果(byte)。
循环结束后
6、402923:调用两次,实现3个立方值的加法运算。
7、402665:保存加法运算结果(byte)。
此过程结束。
接下来:
1、40222E:取得第14位byte值
2、402877:取得数值
3、402E89:该数值乘以0x64(100)
4、4023B0:取得第15位byte值
5、4028DB:取得数值
6、402EEF:该数值乘以0x0A(10)
7、402923:第3步和第6步结果相加
8、4023B0:取得第16位byte值
9、4028DB:取得数值
10、402923:第7步和第9步结果相加
此过程结束
1、403BE6:比较以上两个过程结果,相等则继续,不等则失败。
算法总结,一个百位为1的三位数,且三个位置上数字(0-9)的立方和等于它本身,求此三位数。
//"153"
unsigned char xx,yy;
for(xx=0;xx<=9;xx++)
{
for(yy=0;yy<=9;yy++)
{
unsigned char c1 = 1+xx*xx*xx+yy*yy*yy;
unsigned char c2 = 0x64 + xx*0x0a + yy;
if(c1==c2) printf("%d",c2);
}
}
容易得到,该数为“153”,即第 14-16 位为“153”。
接下来 17-20 位,依然在此虚拟机中,流程如下:
1、40222E:取得第 17 位 byte 值;
2、402877:取得数值
3、402E89:该数值乘以 0x0A
4、4023B0:取得第 18 位 byte 值;
5、4028DB:取得数值
6、402923:第 3 步和第 5 步结果相加
7、402665:存储结果
8、4023B0:取得第 19 位 byte 值;
9、4028DB:取得数值
10、402EEF:该数值乘以 0x0A
11、40222E:取得第 20 位 byte 值;
12、402877:取得数值
13、402965:第 10 步和第 12 步结果相加
14、402923:第 6 步和第 13 步结果相加
15、402EBA:第 6 步结果乘以 4
16、402EEF:第 13 步结果乘以 2
17、40294E:第 15 步和第 16 步结果相加
18、403ABD:第 14 步结果和 0x23 比较相等则继续,不等则失败
19、403B14:第 17 步结果和 0x5E 比较相等则继续(成功),不等则失败
总结
两个两位数(即第6步结果(x1)和第13步结果(x2))有如下等式;
x1+x2=0x23;
4*x1+2*x2=0x5E;
解方程的到 x1=12,x2=23.
故第 17-20 位为“1223”。
总结
1、第 1-9 位为“pediy2016”
2、第 10-14 位为“cool1”
3、第 14-16 位为“153”
4、第 17-20 位为“1223”
因此最终结果 “pediy2016cool1531223”。
点击图片回顾 第十七题
猜你喜欢:
看雪 2016 CTF 第十六题 点评和解析
看雪 2016 CTF 第十五题 点评和解析
看雪 2016 CTF 第十四题 点评和解析
看雪 2016 CTF 第十三题 点评和解析
看雪 2016 CTF 第十二题 点评和解析
看雪 2016 CTF 第十一题 点评和解析
微博:看雪安全
看雪安全 · 看雪众测
持续关注安全16年,专业为您服务!
快,关注这个公众号,一起涨姿势~