首页 > CTF, 恶意代码, 逆向调试 > [HDUSEC CTF]逆向分析Final

[HDUSEC CTF]逆向分析Final

这是杭州电子科技大学信息安全竞赛(HDUSEC CTF)一个比较坑爹的题目,运行程序之后电脑就自动关了,如果直接在真机测试,那丢点数据也在所难免了,呵呵~ (注:本文是在比赛结束后发的

这个时候,你很可能拿起你的OD准备动手了,可是当你刚载入OD的那一瞬间,屏幕又黑了,看了看主机箱,擦,灯灭了,电脑有关了,这尼玛不是坑爹么!

别哭,开机继续搞!把程序载入PEiD,看,有TLS呢!当然啦,大概就猜TLS里面有坑爹的代码。这个TLS可以看也可以不看的,但是出于好奇心,我还是忍不住看了下。那还是用IDA看一下这个样本吧。载入IDA分析,看一下导出表,有个TlsCallback_0,就是这货调用了sub_4013B0函数,对调试器进行了检测。

Tls回调函数调试器进程检测

Tls回调函数调试器进程检测


其实在检测进程之前就注定要关机了:通过调用RtlAdjustPrivilege和ZwShutdownSystem两个函数实现瞬间关机,可以自己去网上找一下相关介绍,ZwShutdownSystem这个字符串是解密出来的,和后面的一种解密方法一致(后文提到的内联汇编代码)。

还是先看下Main函数吧,在start函数中,如果你熟悉运行库的启动代码,你就可以快速确定sub_4010A0就是main函数,不知道也没关系,可以看一下《MSVC CRT运行库启动代码分析》。

分析一下main函数,发现这货会解密两个字符串,就是Kernel32.dll和IsDebuggerPresent了,动态获取函数地址然后调用一下看看是不是被爆菊ing:

使用IsDebuggerPresent检测调试器

使用IsDebuggerPresent检测调试器

我们去看sub_401240这个函数,进去看看发现又是在解密,还在打印key呢,好开森啊!

解密出来的假的KEY

解密出来的假的KEY


写个程序算一下,输出的结果是这样的:
18118806718727666771776122771028512219102806977728066103767266872929
怎么发现不太对呢?这不是key啊,你他妈在逗我!!!

擦擦擦!再用IDA看一下字符串,发现还有点问题:

IDA字符串分析

IDA字符串分析


I am the Key!! 好像有点意思!去看看在哪里被引用了。通过IDA的交叉引用功能找到sub_401390,然后继续往上找到sub_4012E0,而在sub_4012E0中又发现了sub_401320,尼玛这货又在解密。
数据解密

数据解密

解密方式还不是简单的异或运算,稍微变换了下。还是看汇编代码吧:

.text:00401333 loc_401333:                             ;
.text:00401333                 xor     ecx, ecx
.text:00401335
.text:00401335 loc_401335:                             ;
.text:00401335                 mov     dl, byte_403078[ecx]
.text:0040133B                 mov     al, cl
.text:0040133D                 mov     bl, 2Bh
.text:0040133F                 imul    bl
.text:00401341                 add     dl, 80h
.text:00401344                 add     al, 4
.text:00401346                 xor     dl, al
.text:00401348                 mov     byte_403988[ecx], dl
.text:0040134E                 inc     ecx
.text:0040134F                 cmp     ecx, 5A9h
.text:00401355                 jl      short loc_401335
 
.text:00401357                 movsx   eax, byte_40303A
.text:0040135E                 movsx   edx, byte_40302C
.text:00401365                 push    offset byte_403988
.text:0040136A                 mov     byte_403988[ecx], 0
.text:00401371                 movsx   ecx, byte_403026
.text:00401378                 push    eax             ; y
.text:00401379                 push    ecx             ; e
.text:0040137A                 push    edx             ; k
.text:0040137B                 push    offset aCCCS    ; "%c%c%c:%s"
.text:00401380                 call    ds:printf

可以看到前面是对数据块byte_403078的解密操作,大小为0x5A9,解密完之后输出key:解密后的内容。现在去byte_403078提取0x5A9大小的数据,然后内联汇编解密吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;
 
int main(int argc, char **argv)
{
	const int size = 0x5A9;
	unsigned char src[size] = { 0 };
	unsigned char dst[size] = { 0 };
 
	FILE *fp = fopen("data.bin", "rb");
	fread(src, size, 1, fp);
	fclose(fp);
 
	__asm
	{
		xor     ecx, ecx
doDecrypt :
		mov     dl, src[ecx]
		mov     al, cl
		mov     bl, 2Bh
		imul    bl
		add     dl, 80h
		add     al, 4
		xor     dl, al
		mov     dst[ecx], dl
		inc     ecx
		cmp     ecx, 5A9h
		jl      short doDecrypt
	}
 
	printf("%s\n", dst);
 
	return 0;
}

打印出来是个啥?是KEY吗?显然不是,没图说个JB,看图:

解密后的数据

解密后的数据

又是一堆16进制数据,复制出来转成文件吧(就是让文件的16进制内容就是长这个样子),C32Asm有个特别粘贴功能(ASCII Hex),很好用!看一下文件内容,凭感觉判断吧:

解密后的数据内容

解密后的数据内容


看到Key.txt以及那个感叹号,你应该自信的想到这个是个RAR文件(你凭什么这么自信?不好意思我用了飘柔),那就加上Rar标志吧,然后保存为rar文件,尼玛又怒了,要密码啊,爆破都不行,你TM又在逗我!

等等,Key.txt很小的样子,RAR后还附加有数据,你还看到了IHDR和IEND以及那个‰符号,你又应该自信的想到这是一个PNG图片:

PNG数据

PNG数据


那就把第2、3、4字节改成PNG吧,把附加数据段单独提取出来保存。图片显示7.20,这货难道就是解压密码?真的是,这回没有逗我了,拿到KEY为cbklgcdm43ch96dsfCJ5dnGLQOnzfiS

至此,终于戳穿了对方的各种伎俩!纯静态分析实现本题Crack。收工!


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> [HDUSEC CTF]逆向分析Final
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. justtest
    2013年11月12日23:36 | #1

    还没结束吧,这样不太好吧。 [em010]

    [回复]

    代码疯子 回复:

    @justtest, 我晚上十一点发出来的文章,比赛晚上八点就结束了 [em013]

    [回复]

  2. 2013年11月13日06:00 | #2

    哈哈哈,好坑爹的程序,居然用rar

    [回复]

    代码疯子 回复:

    @JayXon, 起得好早。这个还算好的,还有个题目,没有HEADER……猜不出来是什么,最后说是BMP

    [回复]

    JayXon 回复:

    @代码疯子, 没有header的bmp那岂不是完全是像素数据。。。。

    [回复]

    代码疯子 回复:

    @JayXon, 拿到的数据才几百字节,还没弄清楚头部要怎么构造

    [回复]

    libmaru 回复:

    @代码疯子, BMP头部缺少’BM’,后面0xAA是提示,整个文件长度为0xAA

    [回复]

    代码疯子 回复:

    @libmaru, 膜拜!哎,没想到这么简单,就看到了0xAA以及文件大小为0xA8 [em018]

    [回复]

  3. kedebug
    2013年11月15日20:18 | #3

    科神说话变得牛气了许多,现在愈发觉得无论是什么领域,能潜下心来一直钻研下去,到最后肯定都会离成功不远的。

    [回复]

    代码疯子 回复:

    @kedebug, 只是玩玩,我们做的东西都谈不上钻研了,你才是静下了心的人;说话只是换了种语气

    [回复]

    kedebug 回复:

    @代码疯子, 风格挺好的,幽默又不乏自信。以前图样图森破,后悔没能在安全路上坚持下去。看好科神,相信你一定能在这条路上把功夫修炼的很深。

    [回复]

  4. 2013年11月24日09:36 | #4

    科神加油 [em022]

    [回复]

    代码疯子 回复:

    @LittleHann, 惨败而归 [em005]

    [回复]

    LittleHann 回复:

    @代码疯子, 决赛都考了哪些方面的题目呢?给说说

    [回复]

  5. 2013年11月24日09:39 | #5

    @LittleHann
    不过话说,那段看到!就知道是RAR的很亮啊,能否在文章的后面附加上一段各种文件格式的特征码的识别tips?

    [回复]

    代码疯子 回复:

    @LittleHann, 这个只是凭感觉了,像RAR的话,里面会有目录列表和文件名,然后Rar!这个标识,看到文件名和感叹号就这么猜了。而PNG的话,我也是搜索IHDR和IEND知道的。其实很多文件都会有一些可见的有意义的字符标识。

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.