羊城杯 Ez加密器

第一部分

通过查找字符串找到主函数:

看到这里有四个函数,我们一一分析,第一个函数没有看出有什么的特别,我们看第二个:第二个信息量就很大了,首先可以看到两个提示输入,那么下面的两个应该是接受输入的的函数了。

这里sub_140003A20这个函数看的不是很懂,先放一下,后面的sub_140003910这个函数和前面的sub_140003A20函数结构很像,我们动态调试一下这两个函数,动态调试时发现fun1(sub_140003A20)这个函数是验证我们的验证码是否正确,同时这里的fun1他限制了验证码是6位的数字,点进fun1里的a1可以发现:

这里也可以看到这里的两个数据的长度分别是6和40,a000000存储着我们的验证码,那么上面就存储着我们的flag,调试看看:

猜测正确。其实这里也可以把fun1的前半段代码复制下来爆破出验证码的长度,因为fun1中只有len(a1)为6时才能让v3

为1

后半部分的代码时验证输入的是不是字符串,同样可以爆破,动态调试试,当然也可以GPT(大人,时代变了@w@)

第二部分

分析完第二个函数,我们看看后面两个:第三个是base64变表加密,第四个是一个DES加密可以用IDA的Signsrch插件查出。

最后的比较部分如果我们直接看Str1:

如果直接那这里的data去逆向,就会出错,这里的几个‘’>‘和”?“字符串很可疑,所以我们在动态调试一下看看这里的data是不是被改变了:

果然,是被更改了,这里我们可以查找这个字符串的引用找到加密的部分:

其实这里就在DES加密的函数里面。

第三部分

信息基本齐全了,EXP:

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
from pyDes import *
from Crypto.Cipher import DES
import base64

data = "0723105D5C12217DCDC3601F5ECB54DA9CCEC2279F1684A13A0D716D17217F4C9EA85FF1A42795731CA3C55D3A4D7BEA"
#用于将一个十六进制表示的字符串转换为字节串
encrypt_data = bytes.fromhex(data)

def decrypt_DES(key , encrypt_data):
cipher = DES.new(key,DES.MODE_ECB)
decrypt_data = cipher.decrypt(encrypt_data)
return decrypt_data

str1 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

#string = str.maketrans(str1,str2)
string = str.maketrans(str2,str1)

for i in range(1000000):
key = base64.b64encode(str(i).rjust(6,"0").encode()).decode().translate(string).encode()
decrypt_data = decrypt_DES(key,encrypt_data)
if(b'DASCTF{' in decrypt_data):
print(decrypt_data)
exit()

#DASCTF{f771b96b71514bb6bc20f3275fa9404e}