_main

首先用ida打开这个程序

image-20201004105620170

然后跳转到main函数,按F5查看伪代码

image-20201004105730225

aE3nifih9bCNDh = "e3nifIH9b_C@n@dH"这是加密之后的字符串。Dest经过for循环的变化,对应位加上了常数。之后就剩sub_4110BE这个函数没有分析了。

sub_4110BE

进入该函数之后发现跳转到另一个函数sub_411AB0中,然后查看其中的内容。

image-20201004110315214

不难发现这里是base64的加密算法。base64的特征运算如下

1
2
3
4
b1 = c1 >> 2;
b2 = ((c1 & 0x3) << 4) | (c2 >> 4);
b3 = ((c2 & 0xF) << 2) | (c3 >> 6);
b4 = c3 & 0x3F;

然后aAbcdefghijklmn = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="进一步说明了这是base64

总结

于是整个流程就是先将输入的flag进行base64编码,然后对应位加上常数,得到加密后的字符串。

1
2
3
4
5
6
7
8
9
10
11
12
import base64

str1 = 'e3nifIH9b_C@n@dH'
x = ''
flag = ''

for j in range(0, len(str1)):
x += chr(ord(str1[j]) - j)

flag = base64.b64decode(x)
flag = flag.decode('ASCII') # 不要这个会输出 b'{i_l0ve_you}'
print(flag)