<?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=%E6%95%B0%E6%8D%AE%E6%8F%90%E5%8F%96</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=%E6%95%B0%E6%8D%AE%E6%8F%90%E5%8F%96"/>
	<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=%E6%95%B0%E6%8D%AE%E6%8F%90%E5%8F%96&amp;action=history"/>
	<updated>2026-05-06T08:11:50Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://game.etao.net/w/index.php?title=%E6%95%B0%E6%8D%AE%E6%8F%90%E5%8F%96&amp;diff=263&amp;oldid=prev</id>
		<title>127.0.0.1：​创建页面，内容为“{{Ctf_Wiki}} = 数据提取 =  这一块是流量包中另一个重点,通过对协议分析,找到了题目的关键点,如何提取数据成了接下来的关键问题  == wireshark ==  === wireshark自动分析 ===  &lt;code&gt;file -&amp;gt; export objects -&amp;gt; http&lt;/code&gt;  === 手动数据提取 ===  &lt;code&gt;file-&amp;gt;export selected Packet Bytes&lt;/code&gt;  == tshark ==  tshark作为wireshark的命令行版,高效快捷是它的优点,配合其余命令行工具(awk,grep…”</title>
		<link rel="alternate" type="text/html" href="https://game.etao.net/w/index.php?title=%E6%95%B0%E6%8D%AE%E6%8F%90%E5%8F%96&amp;diff=263&amp;oldid=prev"/>
		<updated>2023-07-03T05:57:52Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{Ctf_Wiki}} = 数据提取 =  这一块是流量包中另一个重点,通过对协议分析,找到了题目的关键点,如何提取数据成了接下来的关键问题  == wireshark ==  === wireshark自动分析 ===  &amp;lt;code&amp;gt;file -&amp;gt; export objects -&amp;gt; http&amp;lt;/code&amp;gt;  === 手动数据提取 ===  &amp;lt;code&amp;gt;file-&amp;gt;export selected Packet Bytes&amp;lt;/code&amp;gt;  == tshark ==  tshark作为wireshark的命令行版,高效快捷是它的优点,配合其余命令行工具(awk,grep…”&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;
&lt;br /&gt;
== wireshark ==&lt;br /&gt;
&lt;br /&gt;
=== wireshark自动分析 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;file -&amp;amp;gt; export objects -&amp;amp;gt; http&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 手动数据提取 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;file-&amp;amp;gt;export selected Packet Bytes&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tshark ==&lt;br /&gt;
&lt;br /&gt;
tshark作为wireshark的命令行版,高效快捷是它的优点,配合其余命令行工具(awk,grep)等灵活使用,可以快速定位,提取数据从而省去了繁杂的脚本编写&lt;br /&gt;
&lt;br /&gt;
再看&amp;lt;code&amp;gt;Google CTF 2016 Forensic-200&amp;lt;/code&amp;gt;这一题,可以通过tshark迅速完成解题&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;shll&amp;quot;&amp;gt;what@kali:/tmp$ tshark -r capture.pcapng -T fields -e usb.capdata &amp;amp;gt; data2.txt&lt;br /&gt;
what@kali:/tmp$ # awk -F: &amp;#039;function comp(v){if(v&amp;amp;gt;127)v-=256;return v}{x+=comp(strtonum(&amp;amp;quot;0x&amp;amp;quot;$2));y+=comp(strtonum(&amp;amp;quot;0x&amp;amp;quot;$3))}$1==&amp;amp;quot;01&amp;amp;quot;{print x,y}&amp;#039; data.txt &amp;amp;gt; data3.txt&lt;br /&gt;
what@kali:/tmp$ gnuplot&lt;br /&gt;
&amp;amp;gt; plot &amp;amp;quot;data3.txt&amp;amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Step 1 鼠标协议中数据提取&lt;br /&gt;
* Step 2 通过awk进行位置坐标转换&lt;br /&gt;
* Step 3 形成图形&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
=== 常用方法 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;code&amp;gt;tshark -r **.pcap –Y ** -T fields –e ** | **** &amp;amp;gt; data&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;Usage:&lt;br /&gt;
  -Y &amp;amp;lt;display filter&amp;amp;gt;      packet displaY filter in Wireshark display filter&lt;br /&gt;
                           syntax&lt;br /&gt;
  -T pdml|ps|psml|json|jsonraw|ek|tabs|text|fields|?&lt;br /&gt;
                           format of text output (def: text)&lt;br /&gt;
  -e &amp;amp;lt;field&amp;amp;gt;               field to print if -Tfields selected (e.g. tcp.port,&lt;br /&gt;
                           _ws.col.Info)&amp;lt;/pre&amp;gt;&lt;br /&gt;
通过&amp;lt;code&amp;gt;-Y&amp;lt;/code&amp;gt;过滤器(与wireshark一致),然后用&amp;lt;code&amp;gt;-T filds -e&amp;lt;/code&amp;gt;配合指定显示的数据段(比如usb.capdata)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;tips&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;-e&amp;lt;/code&amp;gt;后的参数不确定可以由 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; 右击需要的数据选中后得到&lt;br /&gt;
&lt;br /&gt;
=== 例题 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;题目：&amp;lt;code&amp;gt;google-ctf-2016 : a-cute-stegosaurus-100&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
这题的数据隐藏的非常巧妙,而且有一张图片混淆视听,需要对&amp;lt;code&amp;gt;tcp&amp;lt;/code&amp;gt;协议非常熟悉,所以当时做出来的人并不多,全球只有 &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; 支队伍&lt;br /&gt;
&lt;br /&gt;
在&amp;lt;code&amp;gt;tcp&amp;lt;/code&amp;gt;报文段中有6Bit的状态控制码,分别如下&lt;br /&gt;
&lt;br /&gt;
* URG：紧急比特（urgent）,当URG＝1时，表明紧急指针字段有效,代表该封包为紧急封包。它告诉系统此报文段中有紧急数据，应尽快传送(相当于高优先级的数据)&lt;br /&gt;
* ACK：确认比特（Acknowledge）。只有当ACK＝1时确认号字段才有效,代表这个封包为确认封包。当ACK＝0时，确认号无效。&lt;br /&gt;
* PSH：（Push function）若为1时，代表要求对方立即传送缓冲区内的其他对应封包，而无需等缓冲满了才送。&lt;br /&gt;
* RST：复位比特(Reset) ,当RST＝1时，表明TCP连接中出现严重差错（如由于主机崩溃或其他原因），必须释放连接，然后再重新建立运输连接。&lt;br /&gt;
* SYN：同步比特(Synchronous)，SYN置为1，就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。。&lt;br /&gt;
* FIN：终止比特(Final)，用来释放一个连接。当FIN＝1时，表明此报文段的发送端的数据已发送完毕，并要求释放运输连接。&lt;br /&gt;
&lt;br /&gt;
而这里的&amp;lt;code&amp;gt;tcp.urg&amp;lt;/code&amp;gt;却为&lt;br /&gt;
&lt;br /&gt;
[[File:figure/urg.png|urg]]&lt;br /&gt;
&lt;br /&gt;
通过tshark提取&amp;lt;code&amp;gt;tcp.urg&amp;lt;/code&amp;gt;然后去除0的字段,换行符转&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;直接转换成python的列表,转ascii即可得到flag&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;⚡ root@kali:  tshark -r Stego-200_urg.pcap -T fields -e  tcp.urgent_pointer|egrep -vi &amp;amp;quot;^0$&amp;amp;quot;|tr &amp;#039;\n&amp;#039; &amp;#039;,&amp;#039;&lt;br /&gt;
Running as user &amp;amp;quot;root&amp;amp;quot; and group &amp;amp;quot;root&amp;amp;quot;. This could be dangerous.&lt;br /&gt;
67,84,70,123,65,110,100,95,89,111,117,95,84,104,111,117,103,104,116,95,73,116,95,87,97,115,95,73,110,95,84,104,101,95,80,105,99,116,117,114,101,125,#&lt;br /&gt;
...&lt;br /&gt;
&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; print &amp;amp;quot;&amp;amp;quot;.join([chr(x) for x in arr]) #python转换ascii&lt;br /&gt;
CTF{And_You_Thought_It_Was_In_The_Picture}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;题目：&amp;lt;code&amp;gt;stego-150_ears.xz&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Step 1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
通过&amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt;命令不断解压得到 &amp;lt;code&amp;gt;pcap&amp;lt;/code&amp;gt; 文件&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;shell&amp;quot;&amp;gt;➜  Desktop file ears&lt;br /&gt;
ears: XZ compressed data&lt;br /&gt;
➜  Desktop unxz &amp;lt; ears &amp;gt; file_1&lt;br /&gt;
➜  Desktop file file_1&lt;br /&gt;
file_1: POSIX tar archive&lt;br /&gt;
➜  Desktop 7z x file_1&lt;br /&gt;
&lt;br /&gt;
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21&lt;br /&gt;
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,1 CPU Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz (306C3),ASM,AES-NI)&lt;br /&gt;
&lt;br /&gt;
    Scanning the drive for archives:&lt;br /&gt;
    1 file, 4263936 bytes (4164 KiB)&lt;br /&gt;
&lt;br /&gt;
    Extracting archive: file_1&lt;br /&gt;
    --&lt;br /&gt;
    Path = file_1&lt;br /&gt;
    Type = tar&lt;br /&gt;
    Physical Size = 4263936&lt;br /&gt;
    Headers Size = 1536&lt;br /&gt;
    Code Page = UTF-8&lt;br /&gt;
&lt;br /&gt;
    Everything is Ok&lt;br /&gt;
&lt;br /&gt;
    Size:       4262272&lt;br /&gt;
    Compressed: 4263936&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Step 2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
通过 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; 发现 &amp;lt;code&amp;gt;dns&amp;lt;/code&amp;gt; 中回应名字存在异常，组成 &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; 进制的 &amp;lt;code&amp;gt;png&amp;lt;/code&amp;gt; 文件&lt;br /&gt;
&lt;br /&gt;
采用 &amp;lt;code&amp;gt;tshark&amp;lt;/code&amp;gt; 进行提取，提取 &amp;lt;code&amp;gt;dns&amp;lt;/code&amp;gt; 中的数据,筛选具体报文形式&amp;lt;code&amp;gt;\w{4,}.asis.io&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tshark -r forensic_175_d78a42edc01c9104653776f16813d9e5 -T fields -e dns.qry.name -e dns.flags|grep 8180|awk &amp;#039;{if ($1~/\w{4,}.asis.io/) print $1}&amp;#039;|awk -F &amp;#039;.&amp;#039; &amp;#039;{print $1}&amp;#039;|tr -d &amp;#039;\n&amp;#039; &amp;amp;gt; png&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Step 3&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; 进制还原图片&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;xxd -p -r png flag&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 自定义协议 ==&lt;br /&gt;
&lt;br /&gt;
提取数据存在一类特殊情况，即传输的数据本身使用自定义协议，下面用 &amp;lt;code&amp;gt;HITCON 2018&amp;lt;/code&amp;gt; 的两道 Misc 为例说明。&lt;br /&gt;
&lt;br /&gt;
=== 例题分析 ===&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/ctf-wiki/ctf-challenges/tree/master/misc/cap/2018HITCON-ev3-basic HITCON-2018 : ev3 basic]&lt;br /&gt;
* [https://github.com/ctf-wiki/ctf-challenges/tree/master/misc/cap/2018HITCON-ev3-scanner HITCON-2018 : ev3 scanner]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ev3 basic&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== 确定数据 ====&lt;br /&gt;
&lt;br /&gt;
对于这类题目，首先分析有效数据位于哪些包中。观察流量，通讯双方为 &amp;lt;code&amp;gt;localhost&amp;lt;/code&amp;gt; 和 &amp;lt;code&amp;gt;LegoSystem&amp;lt;/code&amp;gt; 。其中大量标为 &amp;lt;code&amp;gt;PKTLOG&amp;lt;/code&amp;gt; 的数据包都是日志，此题中不需关注。简单浏览其余各个协议的流量，发现仅 &amp;lt;code&amp;gt;RFCOMM&amp;lt;/code&amp;gt; 协议中存在没有被 &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; 解析的 &amp;lt;code&amp;gt;data&amp;lt;/code&amp;gt; 段，而 &amp;lt;code&amp;gt;RFCOMM&amp;lt;/code&amp;gt; 正是蓝牙使用的[https://en.wikipedia.org/wiki/List_of_Bluetooth_protocols#Radio_frequency_communication_(RFCOMM) 传输层协议]之一。&lt;br /&gt;
&lt;br /&gt;
由前述 &amp;lt;code&amp;gt;tshark&amp;lt;/code&amp;gt; 相关介绍，可以通过以下命令提取数据：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;tshark -r .\ev3_basic.pklg -T fields -e data -Y &amp;amp;quot;btrfcomm&amp;amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 分析协议 ====&lt;br /&gt;
&lt;br /&gt;
找到数据后，需要确定数据格式。如何查找资料可以参考 &amp;lt;code&amp;gt;信息搜集技术&amp;lt;/code&amp;gt; 一节，此处不再赘述。总之由 &amp;lt;code&amp;gt;ev3&amp;lt;/code&amp;gt; 这个关键词出发，我们最终知道这种通信方式传输的内容被称之为 [http://ev3directcommands.blogspot.com/2016/01/no-title-specified-page-table-border_94.html Direct Command]，所使用的是乐高自定义的一种[https://le-www-live-s.legocdn.com/sc/media/files/ev3-developer-kit/lego%20mindstorms%20ev3%20communication%20developer%20kit-f691e7ad1e0c28a4cfb0835993d76ae3.pdf?la=en-us 简单应用层协议]，`Command` 本身格式由乐高的手册 [http://www.lego.com/en-gb/mindstorms/downloads EV3 Firmware Developer Kit] 定义。&amp;#039;&amp;#039;（查找过程并不像此处简单而直观，也是本题的关键点之一。）&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
在乐高的协议中，发送和回复遵从不同格式。在 &amp;lt;code&amp;gt;ev3 basic&amp;lt;/code&amp;gt; 中，所有回复流量都相同，通过手册可知内容代表 &amp;lt;code&amp;gt;ok&amp;lt;/code&amp;gt; ，没有实际含义，而发送的每个数据包都包含了一条指令。由协议格式解析出指令的 &amp;lt;code&amp;gt;Opcode&amp;lt;/code&amp;gt; 均为 &amp;lt;code&amp;gt;0x84&amp;lt;/code&amp;gt; ，代表 &amp;lt;code&amp;gt;UI_DRAW&amp;lt;/code&amp;gt; 函数，且 &amp;lt;code&amp;gt;CMD&amp;lt;/code&amp;gt; 是 &amp;lt;code&amp;gt;0x05&amp;lt;/code&amp;gt; ，代表 &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; 。之后是四个参数，&amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;X0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Y0&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;STRING&amp;lt;/code&amp;gt; 。此处需要注意乐高的单个参数字节数并不固定，即便手册上标明了数据类型是 &amp;lt;code&amp;gt;DATA16&amp;lt;/code&amp;gt; ，仍然可能使用一个字节长度的参数，需要参照手册中 &amp;lt;code&amp;gt;Parameter encoding&amp;lt;/code&amp;gt; 一节及[http://ev3directcommands.blogspot.com/2016/01/ev3-direct-commands-lesson-02-pre.html 相关文章]。&lt;br /&gt;
&lt;br /&gt;
尝试分析几个命令，发现每个指令都会在屏幕特定位置打印一个字符，这与提供的图片相符。&lt;br /&gt;
&lt;br /&gt;
==== 处理结果 ====&lt;br /&gt;
&lt;br /&gt;
理解数据内容后，通过脚本提取所有命令并解析参数，需要注意单个参数的字节数不固定。&lt;br /&gt;
&lt;br /&gt;
得到所有命令的参数后，可以将每个字符其按照坐标绘制在屏幕上。较简单的做法是先按 &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; 后按 &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; 排序，直接输出即可。&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;ev3 scanner&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
第二题的做法与第一题基本相同，难度增加的地方在于：&lt;br /&gt;
&lt;br /&gt;
* 发送的命令不再单一，包括读取传感器信息、控制 ev3 运动&lt;br /&gt;
* 回复也包含信息，主要是传感器读取的内容&lt;br /&gt;
* 函数的参数更复杂，解析难度更大&lt;br /&gt;
* 解析命令得到的结果需要更多处理&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ev3 scanner&amp;lt;/code&amp;gt; 此处不再提供详细方法，可作为练习加深对这一类型题目的理解。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span id=&amp;quot;python-script&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
=== Python Script ===&lt;br /&gt;
&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>127.0.0.1</name></author>
	</entry>
</feed>