看雪 2016 CTF 第十八题 点评和解析

回复 星标
更多

看雪 2016 CTF 第十八题 点评和解析

看雪版主&评委netwind点评

该题把注册码算法验证过程分为了两部分,第一部分的算法用到了除法运算,要确保除数为 0 进入异常处理流程后,才能进入第二部分注册码验证过程;第二部分注册码的算法验证流程隐藏在一个简单的 VM 虚拟机里。该题主要考察选手分析 VM 的能力,VM 分析清楚了,便可得到答案。

下面选择了分析者loudy的详细分析

首先看 WinMain 函数,如下图,可知关键处理函数为 DialogFunc,从该函数可以看出 sub_401120 函数为注册函数。

508573

508573

508573

分析 sub_401120,从 C 代码可以看出,该函数非常简单,看不到注册逻辑。

看汇编代码可以看到,4011AC 处代码等效于 JMP 4011BC,而这种 push retn形式跳转迷惑了 IDA 的分析。

508573

修改成 JMP 4011BC,再看 C 代码,从中看不到明显的注册算法痕迹,推测对真正的注册流程进行了隐藏。

508573

508573

查看 sub_401120 汇编代码,发现下面左图代码不在正常流程(可能为异常处理流程)中,加上右图中(正常流程)有除法操作,如果出现0为除数情况(即v6==0xD4C2086),即可调用该异常处理流程,否则无法正确注册。

508573

而 0xD4C2086 等于 9 个字节值(大于 1)的乘积,对 0xD4C2086 分解可以知道,0xD4C2086 等于从 2 开始连续 9 个质数的乘积,因此,逆向算法如下,得到 1-9 位为“ pediy2016 ”,且从第 14 位开始字节值必须在‘ 0 ’-‘ 9 ’之间。

508573

进入 sub_4013B0 可以看到 loc_40420E 处代码有一个虚拟机跳转指令(到各个 handler)。因为没有花指令,手动跟踪比较简单,不过比较耗时间,过滤掉和算法流程关系不大的。

508573

Handler:loc_40408B 处如下图,依次取输入字符串的一个字节,判断是否为0,不为 0 则地址 [3C0770] 处加 1,即计算输入字符串长度(当然不止此handler,其它自行跟踪即可)。

508573

Handler:loc_403ABD 处如下图,如果取得的字符串长度等于 0x14,则往下执行,否则失败。

508573

Handler:loc_403CE8 处如下图,循环 5 次,输入字符串第 10-14 位依次和“cool1”(0x63,0x6f,0x6f,0x6c,0x31)对比,相等则继续,不等则失败,因此第 10-14 位为“cool1”。接下去就处理 15-20 位。

508573

第 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”。

点击图片回顾 第十七题

508573

猜你喜欢:

看雪 2016 CTF 第十六题 点评和解析

看雪 2016 CTF 第十五题 点评和解析

看雪 2016 CTF 第十四题 点评和解析

看雪 2016 CTF 第十三题 点评和解析

看雪 2016 CTF 第十二题 点评和解析

看雪 2016 CTF 第十一题 点评和解析

508573

508573

508573

508573

508573

508573

508573

508573

508573

微博:看雪安全

508573

看雪安全 · 看雪众测

持续关注安全16年,专业为您服务!

快,关注这个公众号,一起涨姿势~

508573

此帖已被锁定,无法回复
新窗口打开 关闭