MozhuCY's blog.

jarvisoj-文件数据恢复

字数统计: 595阅读时长: 2 min
1970/01/01 Share

新年第一篇hhhhhh

  • mfc好像已经是过气了的东西了…不过这个题可以看出来是一个类似于文件解析的算法,可以拿来做做看
  • resourcehacker确定对话框的id,配合xspy定位函数位置,找到函数sub_402570,CWnd::GetDlgItemTextW(v1, 1002, &FileName, 256)获取的是第一个对话框的路径,然后进行对此文件路径下文件的读取
  • 下面CWnd::GetDlgItemTextW(v1, 1003, &pwd, 256);是对于pwd的读取,在这两行读取文件的代码之间,存在许多读取4字节并且进行验证的操作,怀疑是ctf文件头的验证
  • 从读取文件绝对路径来算,CreateFileW返回文件句柄,ReadFile函数读取4个字节,判断文件前四个字节是不是CTF3,接下来继续读取四个字节,到nNumberOfBytesToRead,然后继续读取nNumberOfBytesToRead个字节,验证实际读入是否与此相等
  • 所以文件头就是四字节的CTF3加上四字节的文件名长度描述,读取文件名
  • 继续读取16字节,获取输入密码,两次md5判断是否和文件中16字节相等,如果相等继续读入
  • 接下来就是4字节长度描述和源文件真正的加密内容
  • 加密过程也很明确,与第一次md5后decode(“hex”)后的16字节轮异或,异或以后key加一
1
con = "CTF3" + '\x10\x00\x00\x00' + "a"*16 + "4280d89a5a03f812751f504cc10ee8a5".decode("hex") + '\x20\x00\x00\x00' + '\x00'*0x20
  • 上面是我构造的文件,解密后我获得了名称为aaaaaaaaaaaaaaaa的文件,内容是123456的第一次md5的值
  • 查看所给文件内容,就是md5一次的内容.循环异或每次下标加一
1
2
3
4
5
6
7
8
9
10
11
12
s=[ord(i) for i in "1382fe47e4b98ed868fca1d54a4f3602".decode("hex")]

f = [ord(i) for i in open("123123","r").read()]

for i in range(len(f)):
f[i] ^= s[i%16]
s[i%16] += 1
s[i%16] &= 0xff

ss = "".join([chr(i) for i in f])
ff = open("what.zip","wb")
ff.write(ss)
  • 脚本如上,解析以后查看文件结构发现是一个docx文件,改后缀打开后即可看到flag
  • 当然爆破或者在线反找md5也可以找到对应pwd,利用所给程序解密,题目提示8位纯数字.所以可以爆破,就算不是的话,因为是异或运算.我们也可以用程序中出现的大段00的性质.反推md5(key)
CATALOG
  1. 1. 新年第一篇hhhhhh