这是一个有趣的话题。
你把一个加密的docx的后缀改掉
1.docx> 1.zip
解压
看看会有什么
是不是出来了几个文件
看看那个
EncryptionInfo
里面有一些值可以用来破解密码(弱一点的口令如000-999)
让我们拖入notepad 可以发现有一堆这样的东西
好了 作为程序员 我们需要一个自动化工具提取saltValue
damn
规定只能用c/c++ windows系统
我的思路:
- 按照重命名的步骤 ->zip 然后解压 然后读文件 然后找到value 搞定
我死在了解压上 不是代码没有 是docx变成zip后文件头不是正常的 常规代码解压不了 我一度陷入自闭 后知后觉 调了5个小时不懂 以为自己代码有问题
2.摆脱自闭 我把文件后缀改成了txt 打开来也是有saltValue的 。。。
那还用个P的zip!!!
我尝试使用系统自带的命令搞出value 灵光一现! findstr 了解一下
好了这道题就是个水题
而且其实可以不用重命名为txt的
findstr过于牛逼你直接docx即可 看我上面那个图
我写完博客之后想到了
#include <locale.h>
#include <fstream>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <Windows.h>
#include <string>
using namespace std;
string dupYin = "\"";//双引号
string solve(string ans) {
string ret;
for (int i = 0; i < ans.size(); ++i) {
if (ans[i] == '\"') return ret;
ret += ans[i];
}
return ret;
}
void rename(string name) {
string temp = "REN " +dupYin + name + ".docx\" " + " " + dupYin + name + ".txt\"";
cout << temp << endl;
system(temp.c_str());
}
int main() {
cout << "docx文件名:" << endl;
string name;
while (getline(cin,name)) {
rename(name);
string CMD = "findstr \"salt\" " + dupYin+ name + ".txt" + dupYin+ " >\"" + "key_" + name + ".txt\"";
cout << CMD << endl;
system(CMD.c_str());
string target = "key_" + name + ".txt";
FILE *fp = fopen(target.c_str(), "r");
char ch;
string ans;
while (fscanf(fp, "%c", &ch) != EOF) {
ans += ch;
}
int pos = ans.find("saltValue=") + 11;//找到位置加个偏移 刚开始为s的位置
ans = ans.substr(pos);
ans = solve(ans);
cout << ans << endl;
}
}
牛逼findstr