下载附件,得到未知格式文件0da9641b7aad4efb8f7eb45f47eaebb2,进kali,用file看一下,单纯是数据
010打开,一眼看见9D FF,最底下有8D FF,熟悉的jpg文件标识符,只不过反过来了
前后颠倒一下,恢复正常的FF D8和FF D9顺序,另存为jpg文件,文件打不开
考虑整个16进制字符排列全反了,将16进制复制走,用java反转一下
import java.io.FileInputStream;
import java.io.FileOutputStream;
/**
* 将文件的16进制复制进txt,读取txt,反转字符串,导出另一个txt,复制走,010粘贴为16进制
*
* @Author: Jack Jparrow
* @Date: 2021-10-05 13:30:12
* @Last Modified by: Jack Jparrow
* @Last Modified time: 2021-10-05 13:54:28
*/
public class reverse {
public static void main(String[] args) {
reverse.reverseFileInStringFromHex();
}
/**
* 打工人开始打工
*/
static void reverseFileInStringFromHex() {
try {
FileInputStream in = new FileInputStream("D:\\Desktop\\a.txt");// 读入数据
byte[] b = new byte[1024];// 设置byte数组接受文件的内容
int len = 0;// 数据长度
String str = null;
// 有一个返回值返回读取数据的长度,读取到最后一个数据则继续向后读一个,此时返回-1
// 即:当返回-1,则表示文件读完
while ((len = in.read(b)) != -1) {
// b: 缓冲byte数组
// 0: 从数组哪一位读起
// len: 具体读了多少数据
str += new String(b, 0, len);// 文件内容写入字符串
}
String str_r = (new StringBuilder(str)).reverse().toString();// 使用reverse()方法反转字符串
FileOutputStream out = new FileOutputStream("D:\\Desktop\\2.txt");// 指定输出位置
out.write(str_r.getBytes());// 把数据写入内存
out.flush();// 把内存中数据写到硬盘
out.close();// 关闭
in.close();// 流在使用完一定要关闭
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制出来的16进制字符串(部分)
反转后的字符串(部分)
虽然细枝末节上跟想象中不太一样,但整体上想要的结果出来了,也不影响结果,复制全文,010新建文件以16进制粘贴
另存为jpg格式,成功打开,但是内容是反的
Windows自带的画图翻转一下,得到flag
网上的wp,好多都是python做的,代码少,效率还挺高,可惜我不会,只能上java,代码实现不难,细节上bug一堆,浪费不少时间
总结:
- 多积攒常见文件16进制标识符,能很快确定文件类型,也能很快从杂乱无章的数据中发现解题思路
- 掌握至少一门编程语言