0x00 分析

常规题目,主要是要知道认出来算法

0x01 解

查壳不放了,反正就是没有

直接上IDA,由于没有函数名,所以搜搜字串

字串里面有点意思的,下面很明显是个base64,不过是换表的,应该哪个地方用到了

先放着,先去看看getflag在哪

非常好,一个简单的strcmp,没有这么多弯弯绕绕

看看密文str1

挺长的,明文应该没这么长,合理怀疑进行了一些扩充

然后去看看别的地方

先看看input flag的地方

结合题目,这里应该是把输入验证码和flag放在一起了

其中变量a1就是验证码,变量a2就是输入的flag了

从这个接收输入的函数出来就会到使用”GetFlag”这个字串函数内了

看来GetFlag这个字串所在的函数就是main了

出来之后可以看到sub_140003C30的两个参数分别是a000000和a11111111111111

这两个就分别是验证码和输入的flag了

下面还有两个函数

一个个看

先看sub_1400036A0

下面可以找到这个数组off_140015108

一直跟进去就会看到这个

看来这个函数sub_1400036A0就是个base64的加密函数了

所以根据接收的变量可以判断,这个sub_1400036A0就是将6位的验证码进行了base64加密

有意思的是在这个数组之上有一个这个

DES的置换表

看来这个程序还用到了DES算法

想了一下根据base64的加密过程,这个6位验证码会输出一个8位的密文

而这个密文是字符串,也就是说一共有8B,64bit

恰好是DES的密钥位数,看来这段base64加密的数据肯定是用来做DES加密的密钥了

回到main函数看看下一个函数sub_140003AE0

结合刚才的分析

sub_1400036A0是进行base64加密的函数,v27就是加密后的密钥,所以sub_140003AE0应该就是DES加密函数了

用刚刚的数组验证一下

看来确实是用到了这个表,也确实是DES加密函数

不过这又有一个问题了,DES加密是一个置换,也就是说出来的密文应该全是hex字符,但是用来对比的密文是这样的

里面有一些特殊字符,所以可能也进行了什么操作

查看一下密文,果然发现了异样

密文被异或了一个7

因为这个验证码压根不知道。所以只能进行爆破了

写脚本!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from Crypto.Cipher import DES
import base64
c = "7054672C2D65560CDCD4176A2BDE23CF>DDBD550>A61?3F64F7C061C60560A3D>BF?2AA6F350>2046DF4D22C4F3C0EBF"
enc = ''
for i in range(len(c)):
enc += chr(ord(c[i]) ^ 7)
print(enc)
# enc = "0723105D5C12217DCDC3601F5ECB54DA9CCEC2279F1684A13A0D716D17217F4C9EA85FF1A42795731CA3C55D3A4D7BEA"
enc = bytes.fromhex(enc)

tab1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
tab2 = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
for i in range(1000000):
key = base64.b64encode(str(i).rjust(6, "0").encode()).decode().translate(str.maketrans(tab1, tab2)).encode()
cipher = DES.new(key, DES.MODE_ECB)
dec = cipher.decrypt(enc)
if b"DASCTF{" in dec:
print(dec)
exit(1)
# m = DASCTF{f771b96b71514bb6bc20f3275fa9404e}\x08\x08\x08\x08\x08\x08\x08\x08