0%

GWCTF2019re3

链接:https://pan.baidu.com/s/1lZr8Cqf8FOuwOU-x2J3yVQ
提取码:myh6

知识点总结: ​ 🚦

AES逆向加密

ECB模式 平均分组 每组互不干扰

CBC模式 平均分组 改明文和前一个密文异或之后再进行加密 所以需要一个初始化数组对第一组异或

一般来说AES加密前会调用一个函数对密匙进行拓展 然后才会处理明

0X01 查看有无加壳 🍖

0

没有加壳,64位文件

0x02 使用IDA64打开文件 🔑

  • 找到main函数, F5 反编译,进行代码分析

1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
signed int i; // [sp+8h] [bp-48h]@4
char s; // [sp+20h] [bp-30h]@1
__int64 v5; // [sp+48h] [bp-8h]@1

v5 = *MK_FP(__FS__, 40LL);
__isoc99_scanf("%39s", &s, a3);
if ( (unsigned int)strlen(&s) != 32 ) //输入的长度为32
{
puts("Wrong!");
exit(0);
}
mprotect((void *)0x400000, 0xF000uLL, 7); //修改文件为可读可执行
for ( i = 0; i <= 223; ++i ) //SMC自修改代码,异或0x99
*((_BYTE *)sub_402219 + i) ^= 0x99u;
sub_40207B(&unk_603170, 61440LL);
sub_402219();
}
  • sub_4022190函数有异或,我们查看

3

  • 选中后我们按 C 强制( Force )分析代码

4

使用Findecrypt插件查看一下加密算法发现很多加密

  • 我们查看sub_40207B()函数

5

MD5加密,第10行和14行的MD5加密有用
内容大体将base64密码表进行两次sub_401CF9加密然后赋值给参数a1
这里没有用到用户输入,可以动调一下获得加密后的a1
IDA先在sub_40207B()函数执行后一条下断点

**0x03 写个脚本做循环对比就行了 ** ​ 🎅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from Crypto.Cipher import AES
from Crypto.Util.number import *

f = open('so.in')
a = ''
for i in range(2):
s = f.readline()
for j in range(16):
a += chr(int(s[j*3:j*3+2],16))
b = ''
s = f.readline()
for j in range(16):
b += chr(int(s[j*3:j*3+2],16))
print a,b
_aes = AES.new(b,mode = AES.MODE_ECB)
print _aes.decrypt(a)

so.in内容

1
2
3
BC 0A AD C0 14 7C 5E CC E0 B1 40 BC 9C 51 D5 2B
46 B2 B9 43 4D E5 32 4B AD 7F B4 B3 9C DB 4B 5B
CB 8D 49 35 21 B4 7A 4C C1 AE 7E 62 22 92 66 CE

欢迎关注我的其它发布渠道