首先读取文件的头四个字节判断是否是0x33465443,不是提示“你打开的不是.ctf加密文件”。
再接着读取了0x10个字节。它用来验证输入的密码是否正确。然后读取了4个字节,它决定了解密数据部分的长度。最后就是根据这个数据长度读取指定的字节数。
整个加密文件有0x61C9个字节。所以真正的数据部分长度不会超过这个大小。观察加密文件头部,很容易找到数据部分的长度。
整个文件0x619C个字节都是加密数据,前面的是头部。
接下来就是解密,输入的密钥经过md5加密得到的16字节作为密钥对数据进行异或,每异或16字节,密钥就自增1,数据段里有部分数据是如下:
规律很明显,由此可以推断这一部分对应的明文是0x00,数据是从43 C9 FD开始加密,很容易推出加密的密钥是0x13,0x82,0xFE,0x47,0xe4,0xb9,0x8e,0xd8,0x68,0xfc,0xa1,0xd5,0x4a,0x4f,0x36,0x2
解密脚本如下:
a='17 86 02 4B E8 BD 92 DC 6C 00 A5 D9 4E 53 3A 06'
aList=a.split(' ')
oriList=[]
for i in aList:
oriList.append((int(i,16)-4)&0xff)
print(oriList)
f=open('1.ctf','rb')
ctfdata=f.read()
f.close()
f=open('encrypt.ctf','wb')
validData=ctfdata[0x2d:]
for i in range(0,len(validData)):
data=int(validData[i].encode('hex'),16)
tmp=data^oriList[i%16]
f.write(chr(tmp))
oriList[i%16]+=1
oriList[i%16]=oriList[i%16]&0xff
f.close()