HGAME WEEK3 REVERSE Cpp
这是一题cpp逆向,由于命名空间等一系列的东西在,cpp逆向的难度相较于c逆向更大
题目后来放出hint是给了PDB文件的,ida中file可以直接load
主函数长成这样,只能说非常的丑,并且主要的加密逻辑与上面的encrypt几乎无关
其中几个函数的名字已经被我改掉了,intial是对加密key的初始化
如果进入看一下密文,并且搜索一下密文的值是可以直接找到chacha20加密算法的
chacha20也是流密码的一种,这意味着他也是逐字节加密的,对于这样的不对key做出干扰的加密方式,用ida下断点dump出key的值是非常好的一种解法
主要的加密只有一个异或
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)); putchar(v2[i * 4 + 1] ^ (key[i] >> 16)); putchar(v2[i * 4 + 2] ^ (key[i] >> 8)); putchar(v2[i * 4 + 3] ^ (key[i] >> 0)); } }
|
这里同样的代码(官方wp的代码)放到python跑不出来,可能是负数的原因,C语言里unsigned char就没问题了
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !