[2019红帽杯]xx

分析

首先查壳,发现是64位无壳的,然后分析

image-20220629213413601

image-20220629213439078

image-20220629213510929

image-20220629213530344

xxtea函数

image-20220629214544222

首先这一部分就像是一个tea加密然后结合题目XX就在是可能是xxtea加密

总的分析

  1. 判断输入的字符串的每个字符是否包含在”qwertyuiopasdfghjklzxcvbnm1234567890”中
  2. 取输入字符串的前4位字符,即”flag”,扩展为16位,作为xxtea加密的秘钥key
  3. 将输入的字符串使用key加密,加密后的字符保存在字符数组v19,共24位字符
  4. 打乱v19数组,保存到v20数组中
  5. 将24位字符,每3位为一组,每一组都进行异或,得到新的加密字符串
  6. 将新的加密字符串与已经存在的字符串比较,相同即正确

脚本

import xxtea
result = 'CE BC 40 6B 7C 3A 95 C0 EF 9B 20 20 91 F7 02 35 23 18 02 C8 E7 56 56 FA'.split(" ")
res = [int(i,16) for i in result]#小端序
for i in range(7,-1,-1):
t = 0
for n in range(0,i):
if t == 0:
t = res[0]
else:
t ^= res[n]
for j in range(3):#三个一组
res[i*3+j] ^= t
box = [1,3,0,2,5,7,4,6,9,11,8,10,13,15,12,14,17,19,16,18,21,23,20,22]
m = []
for i in range(len(box)):#改顺序
m.append(res[box[i]])
key = 'flag'+'\x00'*12#key转为16位
print(xxtea.decrypt(bytes(m),key,padding=False))
#flag{CXX_and_++tea}

总结

题目自己做的话还是有点难有些复杂,参杂了很多内容,综合水平比较高。自己的写脚本能力还是太弱了,只能看得懂大佬们写的脚本,自己还是不能独立写出脚本,还要多多加油!!!