解码编码和流量分析
流量分析和编码解码
流量分析
概述
流量分析常涉及到解密、协议分析、会话重建等技巧,是考察选手对网络协议及工具熟练掌握程度的一
个重要方向。
流量捕获
通常题目会提供一个
.pcap 文件,它是网络数据包的捕获文件,我们需要分析其中的流量数据。
常用工具介绍
\1. Wireshark:最流行的网络协议分析工具,功能强大,可视化流量,支持各种协议的分析。
\2. tshark:Wireshark的命令行版本,适合自动化处理大规模数据。
\3. tcpdump:命令行网络抓包工具,灵活但需要掌握更多命令。
\4. NetworkMiner:用于分析网络流量并提取文件或会话的工具。
\5. Scapy:Python库,用于生成、分析网络数据包,适合深度定制的场景。
流量分析的常见流程
\6. 初步检查流量文件
使用Wireshark或tshark打开
\7. 协议识别与分析
.pcap 文件,查看流量总量、协议类型、IP地址和端口。
确认流量中的常见协议(TCP、UDP、HTTP、DNS等),理解不同协议的特性,查找异常流
量。
\8. 筛选和过滤数据包
使用Wireshark的过滤器功能,逐步缩小感兴趣的数据包范围。比如,HTTP流量的过滤条件
是http,DNS是
dns ,通过源/目的IP、端口等进一步过滤。
\9. 重建会话和提取内容
如果是HTTP或FTP协议,可以重建数据流,提取文件、图片或文本信息。
可以尝试通过流量中的关键字或payload查找线索,如查找flag。
\10. 查找异常行为或隐藏信息
检查是否存在数据加密、编码、隐藏通信通道(如DNS隧道)。
查找流量中不常见的协议、端口或可疑的数据包,尤其是看上去无意义的流量。
流量分析常见题型
HTTP流量分析
题目常提供HTTP抓包文件,通过重建会话,可以获得flag,或通过特定请求的返回包中的信息来解
决问题。
DNS流量分析
通过DNS隧道或编码方式传递信息,需要通过流量中的域名、数据包内容进行解码,获取有用信
息。
文件传输分析
抓包文件可能包含FTP、SMTP等协议的文件传输,通过提取文件或分析文件内容来解题。
加密或编码流量
流量可能通过某种加密或编码方式传输,利用常见的编码解密工具或自编脚本解密。
编码解码
古典密码
前言:码学的发展大概经历了三个阶段: 古典密码阶段、近代密码阶段、现代密码阶段。
【古典密码】是密码学中的其中一个类型,其大部分加密方式都是利用 替换式密码 或 移项式密码,有时则是两者
的混合。 其于历史中经常使用,但现代已经很少使用,大部分的已经不再使用了。
古典密码通常来说要对算法和密钥保密,因为很多古典密码一旦算法泄露,就不存在秘密而言了。
凯撒密码
它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成
密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
这个加密方法是以罗马共和时期恺撒的名字命名的,当年凯撒曾用此方法与其将军们进行联系。
通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。例如,当偏移
量是左移3的时候(解密时的密钥就是3):
明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ
密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC
使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。
需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如:
明文:HEETIAN LAB
密文:KHHWLDQ ODE
维吉尼亚密码
是由一些偏移量不同的恺撒密码组成。
为了生成密码,需要使用表格法。
这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进
行的,在过程中会不断地变换。
培根密码
培根密码的本质是将字母用一串二进制数替换,但是表示的过程中,没有采取0和1的形式,而使用a和b来代替
加密的过程首先将要加密的内容根据加密表里的内容进行替换, 如a用AAAAA替换,b用AAAAB替换。 替换完之
后,我们可以把A和B当作两个不同的特征(如大写/小写,正体/斜体)带入到一个无关的句子中, 这就得到了我
们加密后的结果。
其本质上是将二进制信息通过样式的区别,加在了正常书写之上。 培根密码所包含的信息可以和用于承载其的文章
完全无关。
栅栏密码
栅栏密码属于古典密码中最经典的移项式密码,同之前讲到的凯撒密码等替换式密码代表了密码学中最重要的两个
概念
以2栏栅栏密码为例来讲解它的加密和解密过程。
加密过程:
解密过程:
那么如何将2栏密码扩展到多栏呢?在之前的明文中,CIPHER这个单词之后加了一个下划线, 目的就是为了让明文
字符串的长度是2的倍数, 栅栏密码的分栏的一个前提就是分的栏数需是明文长度的因数,这样才会使得分出来的
每个栏长度都一样。
希尔密码
Ascll
ASCII码 - 基本ASCII码和扩展ASCII码,中文最全ASCII码对照表0~255 (asciim.cn)
base家族
base16
1.使用16个ASCII可打印字符(数字0-9和字母A-F),对任意字节数据进行编码。称 HEX (十六进制),是不区分
大小写的十六进制编码标准
2.先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来,再按照4比特一组进行切
分,将每组二进制数分别转换成十进制。
3.Base16编码后的数据量是原数据的两倍:1000比特数据需要250个字符(即 250*8=2000 比特)。
流程:给定的字符串根据Ascll标转化成二进制–>重新划分–>再转化为16进制
注:可以看到8比特数据按照4比特切分刚好是两组,所以Base16不可能用到填充符号“=”。 换句话说:
Base16使用两个ASCII字符去编码原数据中的一个字节数据
base32
1.Base32编码是使用32个可打印字符(字母A-Z和数字2-7)对任意字节数据进行编码的方案,编码后的字符串不
用区分大小写并排除了容易混淆的字符,可以方便地由人类使用并由计算机处理。(1和L区分)
2.Base32主要用于编码二进制数据,但是Base32也能够编码诸如ASCII之类的二进制文本。
3.Base32将任意字符串按照字节进行切分,并将每个字节对应的二进制值(不足8比特高位补0)串联起来,按照5
比特一组进行切分,并将每组二进制值转换成十进制来对应32个可打印字符中的一个。
由于数据的二进制传输是按照8比特一组进行(即一个字节),因此Base32按5比特切分的二进制数据必须是40比
特的倍数(5和8的最小公倍数)。
流程:给定的字符串根据Ascll标转化成二进制–>重新划分–>再根据码表转换
重新划分:划分时最后不够5的后面先补0,总体不够40比特的倍数的补等号(一个等号就是5bit)
base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于,所以每6个比特为一个单元,对应某个可
打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
由于数据的二进制传输是按照8比特一组进行(即一个字节),因此Base64按6比特切分的二进制数据必须是24比
特的倍数(8和6的最小公倍数)。
流程:给定的字符串根据Ascll标转化成二进制–>重新划分–>再根据码表转换
重新划分:划分时最后不够6的后面先补0,总体不够24比特的倍数的补等号(一个等号就是6bit)
码表:
例:
base58
Base58 编码是一种用于将数据表示为 ASCII 字符串的编码方法,主要用于简化区块链和加密货币中地址的可读
性。它通过将二进制数据转换为一个较为紧凑的字符串形式,避免了一些在使用其他编码方法(如 Base64)时可
能出现的字符,例如空格和其他容易混淆的字符。以下是 Base58 编码的基本原理和步骤:
1. 字符集
Base58 编码使用以下 58 个字符:
123456789
ABCDEFGHJKLMNPQRSTUVWXYZ
abcdefghijkmnopqrstuvwxyz
其中,字符
淆。
0 (零)、O(大写字母 O)、I(大写字母 I)和 l(小写字母 l)被排除,以避免视觉上的混
2. 编码步骤
Base58 编码的基本过程如下:
1. 将输入数据转换为整数:
将要编码的数据(通常是二进制数据)视为一个大整数。
2. 进行整数除法:
将该整数连续除以 58,并记录余数。
余数将用于查找 Base58 字符集中的相应字符。
3. 构建结果字符串:
继续将整数除以 58,直到结果为 0。
余数对应的字符按相反顺序(从最后一个余数开始)组合成结果字符串。
4. 处理前导零:
在输入数据中,如果有前导零,每个前导零会在结果字符串中增加一个字符
‘1’ 。这样可以保留原始数
据中的零信息。
3. 解码过程
Base58 解码的过程与编码相反,步骤如下:
1. 将 Base58 字符串转换为整数:
通过将每个字符转换为相应的整数值,并用 58 的幂进行加权,计算出对应的大整数。
2. 将整数转换为字节:
将得到的大整数转换回原始的字节数组。
3. 处理前导 ‘1’:
4. 应用
在解码时,如果结果字符串中有前导
‘1’ ,则在字节数组的开头添加相应数量的零字节。
Base58 编码常用于比特币地址、以太坊地址等加密货币中,因为它比 Base64 更易于阅读和手动输入,且减少了
因字符相似而引起的错误。
通过这种方式,Base58 编码在确保数据安全的同时,也增强了可读性和输入的便利性。
(例)Base58 编码过程
输入数据:我们将使用一个简单的字节数组作为示例,假设我们有一个字节序列,其十六进制表示为
0x02 0x03 ,在 Base58 编码中,通常将其表示为十进制数。
1. 转换输入数据为整数
首先,将字节数组转换为一个整数。对于字节
0x00 0x01 0x02 0x03 ,我们可以按以下方式计算:
0x00 * (256^3) + 0x01 * (256^2) + 0x02 * (256^1) + 0x03 * (256^0)
= 0 * 16777216 + 1 * 65536 + 2 * 256 + 3 * 1
= 0 + 65536 + 512 + 3
= 66051
0x00 0x01
2. 进行整数除法
将整数
66051 连续除以
第一次除法:
58 ,并记录余数:
66051 / 58 = 1135 余
33
第二次除法:
1135 / 58 = 19 余
第三次除法:
19 / 58 = 0 余 19
27
这里的余数分别是 33、27 和 19。将这些余数对应到 Base58 字符集:
余数 33 对应字符 6
余数 27 对应字符 3
余数 19 对应字符 R
3. 构建结果字符串
根据余数,从最后一个余数开始组合字符,结果字符串为:
R36
4. 处理前导零
在原始数据中有一个前导零(
终的 Base58 编码结果为:
1R36
0x00 ),在 Base58 编码中,每个前导零会在结果中添加一个
‘1’ 字符。所以最
Base58 解码过程
现在我们将这个编码字符串
1R36 解码回原始字节数组。
1. 将 Base58 字符串转换为整数
根据 Base58 字符集:
‘1’ 对应值 0
‘R’ 对应值 19
‘3’ 对应值 27
‘6’ 对应值 33
将这些字符转换为整数值,并计算总值:
(0 * 58^3) + (19 * 58^2) + (27 * 58^1) + (33 * 58^0)
= 0 + 19 * 3364 + 27 * 58 + 33
= 0 + 63836 + 1566 + 33
= 66051
2. 将整数转换为字节
将
66051 转换回字节数组:
66051 的十六进制表示为
3. 处理前导
‘1’
由于有一个前导
0x00 0x01 0x02 0x03 。
‘1’ ,我们在结果字节数组的前面添加一个零字节,最终得到:
0x00 0x01 0x02 0x03