记:2023羊城杯-Ez加密器-题目复现和学习记录““
文章目录
- 前言
- 题目分析and调试过程
- 完整exp
前言
前段时间的比赛,那会刚入门o(╥﹏╥)o都不会写,现在复现一下。
羊城杯题目复现:
第二题 知识点 :动态调试 : CSGO
第三题 虚假控制流 py字典 MD5加密“”“” Blast
题目分析and调试过程
查壳nie
进入IDA,shift+F12查找下字符串看看,定位过去
先用N重命名一下函数,方便阅读。这里就是要求我们输入 code 和 flag。 分别 放入 a1 和 a2 中,查看一下该函数被谁调用了。
跳到上一级函数。
发现俩个参数a000000,a11111111111111,有点奇怪,推测一下应该是输入的长度。长度分别是 6 和 40
接着分析 看看sub_1400036A0里面的东西,
这里移位 4 移位 6 有点像base64编码,接着下面看,
一个base64变表,可以动态调试验证一下,输入code 为 123456,构造flag : DASCTF{11111111111111111111111111111111}
验证成功,sub_1400036A0就是对code进行一个base64编码。
接着看sub_7FF6D8B93AE0,点进去发现实在看不懂是什么,借助一下插件Signsrch
发现DES加密,随便双击跟进一下,会发现跟进到sub_7FF6D8B93AE0里面去了,因此可以判断这里是DES加密。
关于DES加密的介绍,可以看一下博主总结的DES加密原理
这里如果明白DES加密,就知道会有一个key,key的长度为8个字节(64-bit),经由这个主钥匙进行密钥调度得到16个子钥匙,再对密文继续迭代加密,总共16轮,得到密文
这里就已经分析完了,str1是给出的,不过还有一步,程序在运行时对Str1进行了修改,动态调试到下图处,得到真正的Str1。
完整exp
from Crypto.Cipher import DES
import base64
encrypted_data = bytes.fromhex(
"0723105D5C12217DCDC3601F5ECB54DA9CCEC2279F1684A13A0D716D17217F4C9EA85FF1A42795731CA3C55D3A4D7BEA")
print(encrypted_data)
def decrypt_DES(key, encrypted_data):
cipher = DES.new(key, DES.MODE_ECB)
decrypted_data = cipher.decrypt(encrypted_data)
return decrypted_data
string1 = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+/'
string2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
string = str.maketrans(string2, string1)
for i in range(1000000):
key = base64.b64encode(str(i).zfill(6).encode()).decode().translate(string).encode()
decrypted_data = decrypt_DES(key, encrypted_data)
if b"DASCTF{" in decrypted_data:
print(decrypted_data)
exit()
# DASCTF{f771b96b71514bb6bc20f3275fa9404e}