祥云杯 部分 re wp

这次就只复现感觉对目前自己有意义的题吧,那个驱动看了看,了解了大致过程,差不多就行了,如果没了解过驱动,没写过驱动,下次遇到驱动题,还是只能乱分析。

先说说对现在ctf的re部分的看法吧,考点越来越广了,感觉就是需要你见识广,几乎什么都了解,不然对一道题根本无从下手,windows的exe,linux的elf,驱动,,安卓的apk,python的pyc,windows编程,各种算法,甚至一些比较特殊的语言写的程序,比如说go,c#,lua,rust,还有各种题型,maze,mfc窗口check,windows窗口check,vm。如果对每种都比较熟悉的话,做题肯定是相对容易的,但实际情况是根本不能对每种都能掌握,特别是去符号的高级语言。所以对于ctf,我只能说打过的人都晓得,懂得都懂,个人认为还是主要将其当做一个抓要点学习,娱乐的比赛,当然也是个人看法。

最近也挺迷茫的,不知道干啥,马上也快大二了,也一直在思考,颓废了一阵,也就当休息了,希望能早点找到新目标。但是个人认为多思考方向远比漫无目的的学习要好。

Dizzy

本次re最简单的一道题,就是ida中f5不了,也好解决,跟着报错搜搜就行。

修改配置文件IDA 7.0\cfg\hexrays.cfg

MAX_FUNCSIZE            = 64        // Functions over 64K are not decompiled

// 修改为:
MAX_FUNCSIZE            = 1024        // Functions over 64K are not decompiled

然后f5,等待个几分钟,就发现加密过程就是+,-,^,都可逆,刚开始还用z3解,但是太多了,既然都可逆,就直接倒过来,加减互换就行了。

先用python得到算式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

lines = open('a.txt','r').readlines()
fp = open('b.txt','w')
for s in lines:
if '+' in s:
fp.write( s.replace('+','-'))
continue
if '-' in s:
fp.write(s.replace('-', '+'))
continue
fp.write(s)
fp.close()

lines = open('b.txt','r').readlines()
a=[]
for s in lines:
a.append(s)
a=a[::-1]
for i in a:
print(i,end='')

解flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

flag=[ 0x27, 0x3C, 0xE3, 0xFC, 0x2E, 0x41, 0x07, 0x5E, 0x62, 0xCF,
0xE8, 0xF2, 0x92, 0x80, 0xE2, 0x36, 0xB4, 0xB2, 0x67, 0x77,
0x0F, 0xF6, 0x0D, 0xB6, 0xED, 0x1C, 0x65, 0x8A, 0x07, 0x53,
0xA6, 0x66]

flag[16] -= flag[20]
flag[0] -= flag[5]
flag[21] += 54
flag[22] += flag[31]
flag[29] -= flag[25]
flag[18] ^= flag[14]
flag[1] -= 33
flag[31] -= 33
···
···
···
flag[10] -= flag[6]
flag[10] += flag[27]
flag[6] -= flag[3]

for i in flag:
print(chr(i&0xff),end='')
#flag{Try_R3vers1ng_W1th_ScR!pt!}

勒索解密

这道题是有学习价值的,可以用来学习<wincrypt.h> 这个windows的密码学库,里面提供了很多加密算法的api函数,可以去搜索,了解。这道题就是用了这个库,并将文件信息弄成了一个结构体,实际上就是HCRYPTPROV。类似于这篇文章中的类https://blog.csdn.net/neubuffer/article/details/16899905

这道题给了两个文件,一个是加密程序exe,另一个是加密后的文件flag.bmp.ctf_crypter。根据题目描述,我们可以在指定文件夹创建一个.bmp文件来方便我们调试这个程序,通过.bmp可以了解到原文件是一个图片文件。

开始分析,main函数里面的关键代码

然后看encrypt函数

然后aes中也是16个byte依次加密。后面需要注意的地方就是文件生成的问题了。

所以我们只用aes解密[:-0x84]就行了,这道题应该是想让我们用rsa解密得到原来的key,然后解密aes,但是那个key是可以用时间来得到的或者范围爆破。

也有文章已经将加密解密过程写出来了。

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

#include <iostream>
#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <stdio.h>
#include <wincrypt.h> //用的这个库里面的加解密函数
#pragma comment(lib, "Advapi32.lib")
#pragma comment(lib, "Crypt32.lib")

void decrypt_file(DWORD x) //文件解密
{
HCRYPTPROV ctx;
HCRYPTHASH ctx_has;
HCRYPTKEY aeskey;
DWORD v8 = 16;
FILE* fp;
FILE* fp2;
DWORD TestData[500] = { 0x0EC62FB2, 0x4B54D44F, x, 0x8EB1E721 }; //第三个数是time(0)

fopen_s(&fp,"flag.bmp.ctf_crypter", "rb");
size_t size = 0;
fseek(fp, 0, SEEK_END); //文件大小
size = ftell(fp);
fseek(fp, 0, SEEK_SET); //重置文件指针到文件头
size_t size2 = (size - 0x84) / 16; //减去加密后的文件的后两部分

char outname[256] = { 0 };
sprintf_s(outname, "data%x.bmp", x);
fopen_s(&fp2,outname, "wb"); //创建.bmp文件

CryptAcquireContextA(&ctx, 0, "Microsoft Enhanced RSA and AES Cryptographic Provider", 0x18, 0xF0000000);
CryptCreateHash(ctx, 0x800Cu, 0, 0, &ctx_has);
CryptHashData(ctx_has, (const BYTE*)TestData, 16u, 0);
CryptDeriveKey(ctx, 0x660Eu, ctx_has, 0, &aeskey);
BYTE pbData[4] = { 1, 0, 0, 0 };
BYTE v11[4] = { 1, 0, 0, 0 };

CryptSetKeyParam(aeskey, 4u, pbData, 0);
CryptSetKeyParam(aeskey, 3u, v11, 0);
DWORD encLen = 16;

for (int i = 0; i < size2; i++) //16字节16字节的对文件进行解密
{
char buffer[32] = { 0 };
fread(buffer, 16, 1, fp);
CryptDecrypt(aeskey, 0, 0, 0, (BYTE*)buffer, &encLen);
//CryptEncrypt(aeskey, 0, 0, 0, (BYTE*)buffer, &encLen);
fwrite(buffer, 16, 1, fp2);
}

fclose(fp);
fclose(fp2);
CryptDestroyHash(ctx_has);
CryptDestroyKey(aeskey);
CryptReleaseContext(ctx, 0);
}


int main()
{
DWORD time = 0x611a1105;
decrypt_file(time);
system("pause");
return 0;
}

或者用python来解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

from Crypto.Cipher import AES
import hashlib

key = bytearray.fromhex('b22fc60e4fd4544b05111a6121e7b18e')
key = hashlib.sha256(key).hexdigest()
key = bytes.fromhex(key)[:16]
iv=b'\x00'*16
cipher=AES.new(key,AES.MODE_CBC,iv)
fp = open('flag.bmp.ctf_crypter', 'rb')
tmp=fp.read()[:-0x84]
tmp2=cipher.decrypt(tmp)
fp2=open("flag.bmp",'wb')
fp2.write(tmp2)
fp.close()
fp2.close()

rua

好家伙,现在做个题还要配mac环境了,这道题去了符号表,还是得动调来看流程,看内存,题做不了倒是可以来学习salsa20https://zh.wikipedia.org/wiki/Salsa20