<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=%E5%8F%96%E8%AF%81%E9%9A%90%E5%86%99%E5%89%8D%E7%BD%AE%E6%8A%80%E6%9C%AF</id>
	<title>取证隐写前置技术 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://game.etao.net/w/index.php?action=history&amp;feed=atom&amp;title=%E5%8F%96%E8%AF%81%E9%9A%90%E5%86%99%E5%89%8D%E7%BD%AE%E6%8A%80%E6%9C%AF"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=%E5%8F%96%E8%AF%81%E9%9A%90%E5%86%99%E5%89%8D%E7%BD%AE%E6%8A%80%E6%9C%AF&amp;action=history"/>
	<updated>2026-05-06T08:12:57Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=%E5%8F%96%E8%AF%81%E9%9A%90%E5%86%99%E5%89%8D%E7%BD%AE%E6%8A%80%E6%9C%AF&amp;diff=245&amp;oldid=prev</id>
		<title>127.0.0.1：​创建页面，内容为“{{Ctf_Wiki}}  = 取证隐写前置技术 =  大部分的 CTF 比赛中，取证及隐写两者密不可分，两者所需要的知识也相辅相成，所以这里也将对两者一起介绍。  任何要求检查一个静态数据文件从而获取隐藏信息的都可以被认为是隐写取证题（除非单纯地是密码学的知识），一些低分的隐写取证又常常与古典密码学结合在一起，而高分的题目则通常用与一些较为复…”</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=%E5%8F%96%E8%AF%81%E9%9A%90%E5%86%99%E5%89%8D%E7%BD%AE%E6%8A%80%E6%9C%AF&amp;diff=245&amp;oldid=prev"/>
		<updated>2023-07-03T03:44:44Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Ctf_Wiki}}  = 取证隐写前置技术 =  大部分的 CTF 比赛中，取证及隐写两者密不可分，两者所需要的知识也相辅相成，所以这里也将对两者一起介绍。  任何要求检查一个静态数据文件从而获取隐藏信息的都可以被认为是隐写取证题（除非单纯地是密码学的知识），一些低分的隐写取证又常常与古典密码学结合在一起，而高分的题目则通常用与一些较为复…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Ctf_Wiki}}&lt;br /&gt;
&lt;br /&gt;
= 取证隐写前置技术 =&lt;br /&gt;
&lt;br /&gt;
大部分的 CTF 比赛中，取证及隐写两者密不可分，两者所需要的知识也相辅相成，所以这里也将对两者一起介绍。&lt;br /&gt;
&lt;br /&gt;
任何要求检查一个静态数据文件从而获取隐藏信息的都可以被认为是隐写取证题（除非单纯地是密码学的知识），一些低分的隐写取证又常常与古典密码学结合在一起，而高分的题目则通常用与一些较为复杂的现代密码学知识结合在一起，很好地体现了 Misc 题的特点。&lt;br /&gt;
&lt;br /&gt;
== 前置技能 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;了解常见的编码&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;能够对文件中出现的一些编码进行解码，并且对一些特殊的编码（Base64、十六进制、二进制等）有一定的敏感度，对其进行转换并得到最终的 flag。&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;能够利用脚本语言（Python 等）去操作二进制数据&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;熟知常见文件的文件格式，尤其是各类 [https://en.wikipedia.org/wiki/List_of_file_signatures 文件头]、协议、结构等&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;灵活运用常见的工具&amp;lt;/p&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;python-操作二进制数据&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
== Python 操作二进制数据 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;struct-模块&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== struct 模块 ===&lt;br /&gt;
&lt;br /&gt;
有的时候需要用 Python 处理二进制数据，比如，存取文件，socket 操作时。这时候，可以使用 Python 的 struct 模块来完成。&lt;br /&gt;
&lt;br /&gt;
struct 模块中最重要的三个函数是 &amp;lt;code&amp;gt;pack()&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;unpack()&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;calcsize()&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;pack(fmt, v1, v2, ...)&amp;lt;/code&amp;gt; 按照给定的格式（fmt），把数据封装成字符串（实际上是类似于c结构体的字节流）&lt;br /&gt;
* &amp;lt;code&amp;gt;unpack(fmt, string)&amp;lt;/code&amp;gt; 按照给定的格式（fmt）解析字节流 string，返回解析出来的 tuple&lt;br /&gt;
* &amp;lt;code&amp;gt;calcsize(fmt)&amp;lt;/code&amp;gt; 计算给定的格式（fmt）占用多少字节的内存&lt;br /&gt;
&lt;br /&gt;
这里打包格式 &amp;lt;code&amp;gt;fmt&amp;lt;/code&amp;gt; 确定了将变量按照什么方式打包成字节流，其包含了一系列的格式字符串。这里就不再给出不同格式字符串的含义了，详细细节可以参照 [https://docs.python.org/2/library/struct.html Python Doc]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt; import struct&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; struct.pack(&amp;#039;&amp;gt;I&amp;#039;,16)&lt;br /&gt;
&amp;#039;\x00\x00\x00\x10&amp;#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;pack&amp;lt;/code&amp;gt; 的第一个参数是处理指令，&amp;lt;code&amp;gt;&amp;#039;&amp;amp;gt;I&amp;#039;&amp;lt;/code&amp;gt; 的意思是：&amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; 表示字节顺序是 Big-Endian，也就是网络序，&amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; 表示 4 字节无符号整数。&lt;br /&gt;
&lt;br /&gt;
后面的参数个数要和处理指令一致。&lt;br /&gt;
&lt;br /&gt;
读入一个 BMP 文件的前 30 字节，文件头的结构按顺序如下&lt;br /&gt;
&lt;br /&gt;
* 两个字节：&amp;lt;code&amp;gt;BM&amp;lt;/code&amp;gt; 表示 Windows 位图，&amp;lt;code&amp;gt;BA&amp;lt;/code&amp;gt; 表示 OS/2 位图&lt;br /&gt;
* 一个 4 字节整数：表示位图大小&lt;br /&gt;
* 一个 4 字节整数：保留位，始终为 0&lt;br /&gt;
* 一个 4 字节整数：实际图像的偏移量&lt;br /&gt;
* 一个 4 字节整数：Header 的字节数&lt;br /&gt;
* 一个 4 字节整数：图像宽度&lt;br /&gt;
* 一个 4 字节整数：图像高度&lt;br /&gt;
* 一个 2 字节整数：始终为 1&lt;br /&gt;
* 一个 2 字节整数：颜色数&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt; import struct&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bmp = &amp;#039;\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00&amp;#039;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; struct.unpack(&amp;#039;&amp;lt;ccIIIIIIHH&amp;#039;,bmp)&lt;br /&gt;
(&amp;#039;B&amp;#039;, &amp;#039;M&amp;#039;, 691256, 0, 54, 40, 640, 360, 1, 24)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;bytearray-字节数组&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== bytearray 字节数组 ===&lt;br /&gt;
&lt;br /&gt;
将文件以二进制数组形式读取&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;data = bytearray(open(&amp;#039;challenge.png&amp;#039;, &amp;#039;rb&amp;#039;).read())&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
字节数组就是可变版本的字节&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;data[0] = &amp;#039;\x89&amp;#039;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== 常用工具 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;010-editor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== [http://www.sweetscape.com/010editor/ 010 Editor] ===&lt;br /&gt;
&lt;br /&gt;
SweetScape 010 Editor 是一个全新的十六进位文件编辑器，它有别于传统的十六进位编辑器在于它可用「范本」来解析二进位文件，从而让你读懂和编辑它。它还可用来比较一切可视的二进位文件。&lt;br /&gt;
&lt;br /&gt;
利用它的模板功能可以非常轻松的观察文件内部的具体结构并且依此快速更改内容。&lt;br /&gt;
&lt;br /&gt;
[[File:figure/010.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;file-命令&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; 命令 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; 命令根据文件头（魔法字节）去识别一个文件的文件类型。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;root in ~/Desktop/tmp λ file flag&lt;br /&gt;
flag: PNG image data, 450 x 450, 8-bit grayscale, non-interlaced&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;strings-命令&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;strings&amp;lt;/code&amp;gt; 命令 ===&lt;br /&gt;
&lt;br /&gt;
打印文件中可打印的字符，经常用来发现文件中的一些提示信息或是一些特殊的编码信息，常常用来发现题目的突破口。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;可以配合 &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; 命令探测指定信息&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;strings test|grep -i XXCTF&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;p&amp;gt;也可以配合 &amp;lt;code&amp;gt;-o&amp;lt;/code&amp;gt; 参数获取所有 ASCII 字符偏移&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;root in ~/Desktop/tmp λ strings -o flag|head&lt;br /&gt;
    14 IHDR&lt;br /&gt;
    45 gAMA&lt;br /&gt;
    64  cHRM&lt;br /&gt;
    141 bKGD&lt;br /&gt;
    157 tIME&lt;br /&gt;
    202 IDATx&lt;br /&gt;
    223 NFdVK3&lt;br /&gt;
    361 |;*-&lt;br /&gt;
    410 Ge%&amp;lt;W&lt;br /&gt;
    431 5duX@%&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;binwalk-命令&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== &amp;lt;code&amp;gt;binwalk&amp;lt;/code&amp;gt; 命令 ===&lt;br /&gt;
&lt;br /&gt;
binwalk 本是一个固件的分析工具，比赛中常用来发现多个文件粘合再在一起的情况。根据文件头去识别一个文件中夹杂的其他文件，有时也会存在误报率（尤其是对Pcap流量包等文件时）。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;root in ~/Desktop/tmp λ binwalk flag&lt;br /&gt;
&lt;br /&gt;
DECIMAL       HEXADECIMAL     DESCRIPTION&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
0             0x0             PNG image, 450 x 450, 8-bit grayscale, non-interlaced&lt;br /&gt;
134           0x86            Zlib compressed data, best compression&lt;br /&gt;
25683         0x6453          Zip archive data, at least v2.0 to extract, compressed size: 675, uncompressed size: 1159, name: readme.txt&lt;br /&gt;
26398         0x671E          Zip archive data, at least v2.0 to extract, compressed size: 430849, uncompressed size: 1027984, name: trid&lt;br /&gt;
457387        0x6FAAB         End of Zip archive&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
配合 &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt; 参数可以进行自动化提取。&lt;br /&gt;
&lt;br /&gt;
也可以结合 &amp;lt;code&amp;gt;dd&amp;lt;/code&amp;gt; 命令进行手动切割。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;root in ~/Desktop/tmp λ dd if=flag of=1.zip bs=1 skip=25683&lt;br /&gt;
431726+0 records in&lt;br /&gt;
431726+0 records out&lt;br /&gt;
431726 bytes (432 kB, 422 KiB) copied, 0.900973 s, 479 kB/s&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>