cpp

Posted by Humb1e on 2023-02-20
Estimated Reading Time 2 Minutes
Words 487 In Total
Viewed Times

HGAME WEEK3 REVERSE Cpp

这是一题cpp逆向,由于命名空间等一系列的东西在,cpp逆向的难度相较于c逆向更大

题目后来放出hint是给了PDB文件的,ida中file可以直接load

image-20230220150513442

主函数长成这样,只能说非常的丑,并且主要的加密逻辑与上面的encrypt几乎无关

其中几个函数的名字已经被我改掉了,intial是对加密key的初始化

如果进入看一下密文,并且搜索一下密文的值是可以直接找到chacha20加密算法的

chacha20也是流密码的一种,这意味着他也是逐字节加密的,对于这样的不对key做出干扰的加密方式,用ida下断点dump出key的值是非常好的一种解法

image-20230222132026923

主要的加密只有一个异或

1
2
3
4
from idaapi import get_reg_val 

print(get_reg_val('ecx'),end=",")

得到key值

unsigned int key[] = { 1077387342,4258923078,1013905953,3483163055,1731413945,233590496,327206097,984787250,39669927,2202679682 };

#include<stdio.h>

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
int main()
{
unsigned int key[] = { 1077387342,4258923078,1013905953,3483163055,1731413945,233590496,327206097,984787250,39669927,2202679682 };
unsigned char v2[40];
v2[0] = 0x28;
v2[1] = 0x50;
v2[2] = -63;
v2[3] = 35;
v2[4] = -104;
v2[5] = -95;
v2[6] = 65;
v2[7] = 54;
v2[8] = 76;
v2[9] = 49;
v2[10] = -53;
v2[11] = 82;
v2[12] = -112;
v2[13] = -15;
v2[14] = -84;
v2[15] = -52;
v2[16] = 15;
v2[17] = 108;
v2[18] = 42;
v2[19] = -119;
v2[20] = 127;
v2[21] = -33;
v2[22] = 17;
v2[23] = -124;
v2[24] = 127;
v2[25] = -26;
v2[26] = -94;
v2[27] = -32;
v2[28] = 89;
v2[29] = -57;
v2[30] = -59;
v2[31] = 70;
v2[32] = 93;
v2[33] = 41;
v2[34] = 56;
v2[35] = -109;
v2[36] = -19;
v2[37] = 21;
v2[38] = 122;
v2[39] = -1;
for (int i = 0; i < 10; i++)
{
putchar(v2[i * 4 + 0] ^ (key[i] >> 24));//key是大端序
putchar(v2[i * 4 + 1] ^ (key[i] >> 16));
putchar(v2[i * 4 + 2] ^ (key[i] >> 8));
putchar(v2[i * 4 + 3] ^ (key[i] >> 0));
}
}
//hgame{Cpp_1s_much_m0r3_dlff1cult_th4n_C}

这里同样的代码(官方wp的代码)放到python跑不出来,可能是负数的原因,C语言里unsigned char就没问题了


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !