记:2023羊城杯-Ez加密器-题目复现和学习记录““

文章目录

  • 前言
  • 题目分析and调试过程
  • 完整exp

前言

前段时间的比赛,那会刚入门o(╥﹏╥)o都不会写,现在复现一下。

羊城杯题目复现:
第二题 知识点 :动态调试 : CSGO
第三题 虚假控制流 py字典 MD5加密“”“” Blast

题目分析and调试过程

记:2023羊城杯-Ez加密器-题目复现和学习记录““_第1张图片
查壳nie

进入IDA,shift+F12查找下字符串看看,定位过去

记:2023羊城杯-Ez加密器-题目复现和学习记录““_第2张图片
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第3张图片
先用N重命名一下函数,方便阅读。这里就是要求我们输入 code 和 flag。 分别 放入 a1 和 a2 中,查看一下该函数被谁调用了。
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第4张图片

跳到上一级函数。

记:2023羊城杯-Ez加密器-题目复现和学习记录““_第5张图片
发现俩个参数a000000,a11111111111111,有点奇怪,推测一下应该是输入的长度。长度分别是 6 和 40
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第6张图片
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第7张图片
接着分析 看看sub_1400036A0里面的东西,
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第8张图片
这里移位 4 移位 6 有点像base64编码,接着下面看,
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第9张图片
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第10张图片
一个base64变表,可以动态调试验证一下,输入code 为 123456,构造flag : DASCTF{11111111111111111111111111111111}
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第11张图片
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第12张图片
验证成功,sub_1400036A0就是对code进行一个base64编码。

接着看sub_7FF6D8B93AE0,点进去发现实在看不懂是什么,借助一下插件Signsrch
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第13张图片
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第14张图片
发现DES加密,随便双击跟进一下,会发现跟进到sub_7FF6D8B93AE0里面去了,因此可以判断这里是DES加密。
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第15张图片
关于DES加密的介绍,可以看一下博主总结的DES加密原理

这里如果明白DES加密,就知道会有一个key,key的长度为8个字节(64-bit),经由这个主钥匙进行密钥调度得到16个子钥匙,再对密文继续迭代加密,总共16轮,得到密文
记:2023羊城杯-Ez加密器-题目复现和学习记录““_第16张图片

这里就已经分析完了,str1是给出的,不过还有一步,程序在运行时对Str1进行了修改,动态调试到下图处,得到真正的Str1。

记:2023羊城杯-Ez加密器-题目复现和学习记录““_第17张图片

完整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}

你可能感兴趣的:(CTF比赛WP,学习,网络安全,密码学,python,CTF,Reverse)