1.先分析一下大致的流程:
1)输入flag,先进行长度判断,是不是16位
2)sub_562AB8800C00函数:判断输入的flag是否为16进制数
3)sub_562AB8801180函数:xxtea解密(无填充模式),密钥是unk_562AB8A02010
4)sub_562AB88013D0函数:CRC16校验,具体可以参考CRC校验码简介及CRC16的计算方法 - 21ic电子网
5)最后将解密后的数据与0x17异或,最终得到"Bingo!"
2.分析具体的解密过程
1)先将"Bingo!"与0x17异或,通过sub_562AB8801180函数可以看出解密之后一共有8位数,其中最后一位小于4,所以后两位的值需要爆破一下。
2)将异或后的数据进行xxtea加密(python中有这个模块,直接调用没问题),加密完之后hex()改一下值。
3)将第二步修改过的值包上"rctf{}",进行md5加密,与hint中的md5判断,如果md5值相等,输出其中的值,即为flag。
3.附上整体脚本:
import xxtea
import hashlib
key = [0xc7,0xe0,0xc7,0xe0,0xd7,0xd3,0xf1,0xc6,0xd3,0xc6,0xd3,0xc6,0xce,0xd2,0xd0,0xc4]
key = "".join(chr(m) for m in key)
text = [0x55,0x7e,0x79,0x70,0x78,0x36,0x0,0x0]
for i in range(0xff):
for j in range(4):
text[6] = i
text[7] = j
encrypt_data = xxtea.encrypt("".join(chr(n) for n in text),key)
encrypt_data = encrypt_data.hex()
flag = "rctf{"+ encrypt_data +"}"
hl = hashlib.md5()
hl.update(flag.encode(encoding='utf-8'))
if hl.hexdigest() == '5f8243a662cf71bf31d2b2602638dc1d':
print("yesyes")
print(encrypt_data)
#rctf{05e8a376e4e0446e}