[投稿]Iscc reverse7逆向分析

这是今年iscc的逆向第7道题目,题目介绍如下:

2

1. 脱壳

3

Peid查壳,发现是ASProtect 1.2x – 1.3x [Registered] -> Alexey Solodovnikov。

为了快速脱壳,直接使用了pediy的脱壳脚本,链接如下:

http://bbs.pediy.com/showthread.php?t=89342

脱壳后程序见附件(dump.exe)

2. 解决xp运行问题

在主机win7上运行

4

在xp虚拟机上运行

5

在ida中通过字符串查找,定位到这个弹框。

6

往上看

7

可以看见程序通过GetVersionExW获取了系统版本,看来程序只能在某些特定系统版本才能运行正常,此处可以通过修改程序使其在xp下运行。

这样在xp下也能正常弹出输入框。

8

随便输入一个字符串,弹框如下:

 

3.定位

在ida中查字符串,看到这个 “阿里巴巴与四十”的繁体字符串,交叉引用,发现有3处使用,除了之前 夜观天象之外,另外2处都在sub_00402310函数中。

10

在00402310的开始处设置断点,点击芝麻开门,程序成功断在了402310处。之后单步跟踪,在4023B8处esi正好指向我们输入的字符串。

程序往下找,定位到最终比较的地方。这里进行了循环比较,只要有一个不等,就弹出凶残的四十大盗。

13

4.大致分析算法流程

程序中调用了2个unknown_libname_6, 分别在004023db和00403489处,这实际就是new函数,新建了2个缓冲区。(记第一次为addr1, 第二次为addr2)

之后动态跟踪,发现输入数据为12345678时,

经过00423f7-00402428这块代码后,输入数据经过变换放到addr1中。

变换后的addr1的数据为 12 34 56 78。

之后经过40247d处的call 401590中的sub_4013B0函数后,

addr1的数据变换为 ec 7f 77 81

之后,经过4024a8-4024c4的代码,将数据从addr1变换到addr2

add2的数据为 65 63 37 66 37 37 38 31 即字符串ec7f7781

 

之后程序在4017c3创建了一个位图CreateDIBSection,其中数据地址指向地址0x12d20c。

22

之后程序在40184b通过ExtTextOutA向位图中写入字符串ec7f7781。

24

查看此时位图中的数据:(此时cdb0000地址处的6000字节数据就是位图数据)

25

之后在402560至402596对位图中的内容进行变换。

之后,进行比较(6000字节),一个是位图数据,一个是内存中的固定数据。

5. 找出位图中的字符串

位图中的加密算法如下:

逆向算法

解密得到6000字节数据,在6000字节之前加上bmp文件头:

 

打开bmp文件,可以得到bmp中的字符串

 

6. 前面字符串变换算法逆向

前面的变换,主要是对sub_4013B0函数的逆向。各子函数 详细见附件。

 

逆向:

 

运行得到key

在程序中输入这个字符串,会弹出 充满宝藏的神秘山洞。

附件下载地址:http://pan.baidu.com/s/1qWM5iri