Misc简介
Misc 是英文 Miscellaneous 的前四个字母,杂项、混合体、大杂烩的意思。
在国内CTF中,除了Web,Reverse,Pwn,Crypto外的所有项目都被统一划分入 Misc 领域,有时 Crypto(尤其是古典密码)也被划入其中。
在Misc这一块,主要分为以下知识点:
- 信息收集技术(Recon)
- 编码分析&转换(Encode)
- 数字取证 & 隐写分析(Forensic & Stego)
Misc 是切入 CTF 竞赛领域、培养兴趣的最佳入口。Misc 考察基本知识,对安全技能的各个层面都有不同程度的涉及,可以在很大程度上启发思维。
编码分析&转换
通信领域常用编码
Morse 编码
特点
- 只有
.
和-
- 最多 6 位
- 也可以使用 01 串表示
工具
例题
bugku_滴答~滴
-... -.- -.-. - ..-. -- .. ... -.-.
答案格式KEY{xxxxxxxxx}
敲击码
敲击码(Tap code)是一种以非常简单的方式对文本信息进行编码的方法。因该编码对信息通过使用一系列的点击声音来编码而命名,敲击码是基于 5 ×5 方格波利比奥斯方阵来实现的,不同点是是用 K 字母被整合到 C 中。
Tap Code | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | A | B | C/K | D | E |
2 | F | G | H | I | J |
3 | L | M | N | O | P |
4 | Q | R | S | T | U |
5 | V | W | X | Y | Z |
明文 | F | O | X |
---|---|---|---|
位置 | 2,1 | 3,4 | 5,3 |
敲击码 | .. . | ... .... | ..... ... |
例题
实验吧_The Flash-14
54 43 32 52 22 44 55 34 22 51 52 22 44 34 22 23 11 34 12
对应敲击码表解出:ysmwgtzogvwgtoghaob
再利用凯撒密码解密:keyisflashisfastman
计算机相关的编码
字母表编码
-
A-Z
/a-z
对应 1-26 或者 0-25
ASCII 编码
特点
我们一般使用的 ascii 编码的时候采用的都是可见字符,而且主要是如下字符
-
0-9
, 49-57 -
A-Z
, 65-90 -
a-z
, 97-122 -
{
}
,123/125
Base 编码
Base64
Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于 ,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
在Base64中的可打印字符包括字母A-Z
、a-z
、数字0-9
,这样共有62个字符。若原数据长度不是3的倍数时且剩下1个输入数据,则在编码结果后加2个=
;若剩下2个输入数据,则在编码结果后加1个=
。
它可用来作为电子邮件的传输编码。使用时,在传输编码方式中指定Base64。使用的字符包括大小写拉丁字母各26个、数字10个、加号+
和斜杠/
,共64个字符,等号=用来作为后缀用途。
例子
Base64编码字符串:
原文本:hello world!
经过Base64编码后:aGVsbG8gd29ybGQh
原文本:hello world
经过Base64编码后:aGVsbG8gd29ybGQ=
Base64编码图片:
编码结果:
data:image/jpg;base64,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
Base32
和Base64原理相似。由于 ,所以每5个比特为一个单元,对应某个可打印字符。5个字节有40个比特,对应于8个Base32单元,即5个字节可由8个可打印字符来表示。
在Base64中的可打印字符包括字母A-Z
、数字2-7
,这样共有32个字符。若原数据长度不是5的倍数时且剩下1个输入数据,则在编码结果后加4个=
;若剩下2个输入数据,则在编码结果后加3个=
,以此类推。
例子
原文本:hello world!
经过Base64编码后:NBSWY3DPEB3W64TMMQQQ====
原文本:hello world
经过Base64编码后:NBSWY3DPEB3W64TMMQ======
Base16
由于 ,所以每4个比特为一个单元,对应某个可打印字符。1个字节有8个比特,对应于8个Base16单元,即1个字节可由2个可打印字符来表示。
在Base64中的可打印字符包括字母A-F
、数字0-9
,这样共有16个字符。
例子
原文本:hello world!
经过Base64编码后:68656C6C6F20776F726C64EFBC81
Base工具
在线解码
python base64库
加密:
import base64
print base64.b64encode('hello world!')
print base64.b32encode('hello world!')
print base64.b16encode('hello world!')
解密:
import base64
print base64.b64decode('aGVsbG8gd29ybGQh')
print base64.b32decode('NBSWY3DPEB3W64TMMQQQ====')
print base64.b16decode('68656C6C6F20776F726C6421')
哈夫曼编码
简介
霍夫曼编码(英语:Huffman Coding),又译为哈夫曼编码、赫夫曼编码,是一种用于无损数据压缩的熵编码(权编码)算法。由美国计算机科学家大卫·霍夫曼(David Albert Huffman)在1952年发明。
在计算机数据处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现几率的方法得到的,出现几率高的字母使用较短的编码,反之出现几率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。
霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。
例子
字母 | 频率 | 编码 |
---|---|---|
space | 7 | 111 |
a | 4 | 010 |
e | 4 | 000 |
f | 3 | 1101 |
h | 2 | 1010 |
i | 2 | 1000 |
m | 2 | 0111 |
n | 2 | 0010 |
s | 2 | 1011 |
t | 2 | 0110 |
l | 1 | 11001 |
o | 1 | 00110 |
p | 1 | 10011 |
r | 1 | 11000 |
u | 1 | 00111 |
x | 1 | 10010 |
python脚本
#-*- coding: utf-8 -*-
# 树节点类构建
class TreeNode(object):
def __init__(self, data):
self.val = data[0]
self.priority = data[1]
self.leftChild = None
self.rightChild = None
self.code = ""
# 创建树节点队列函数
def creatnodeQ(codes):
q = []
for code in codes:
q.append(TreeNode(code))
return q
# 为队列添加节点元素,并保证优先度从大到小排列
def addQ(queue, nodeNew):
if len(queue) == 0:
return [nodeNew]
for i in range(len(queue)):
if queue[i].priority >= nodeNew.priority:
return queue[:i] + [nodeNew] + queue[i:]
return queue + [nodeNew]
# 节点队列类定义
class nodeQeuen(object):
def __init__(self, code):
self.que = creatnodeQ(code)
self.size = len(self.que)
def addNode(self,node):
self.que = addQ(self.que, node)
self.size += 1
def popNode(self):
self.size -= 1
return self.que.pop(0)
# 各个字符在字符串中出现的次数,即计算优先度
def freChar(string):
d ={}
for c in string:
if not c in d:
d[c] = 1
else:
d[c] += 1
return sorted(d.items(),key=lambda x:x[1])
# 创建哈夫曼树
def creatHuffmanTree(nodeQ):
while nodeQ.size != 1:
node1 = nodeQ.popNode()
node2 = nodeQ.popNode()
r = TreeNode([None, node1.priority+node2.priority])
r.leftChild = node1
r.rightChild = node2
nodeQ.addNode(r)
return nodeQ.popNode()
codeDic1 = {}
codeDic2 = {}
# 由哈夫曼树得到哈夫曼编码表
def HuffmanCodeDic(head, x):
global codeDic, codeList
if head:
HuffmanCodeDic(head.leftChild, x+'0')
head.code += x
if head.val:
codeDic2[head.code] = head.val
codeDic1[head.val] = head.code
HuffmanCodeDic(head.rightChild, x+'1')
# 字符串编码
def TransEncode(string):
global codeDic1
transcode = ""
for c in string:
transcode += codeDic1[c]
return transcode
# 字符串解码
def TransDecode(StringCode):
global codeDic2
code = ""
ans = ""
for ch in StringCode:
code += ch
if code in codeDic2:
ans += codeDic2[code]
code = ""
return ans
# 举例
string = "this is an example of a huffman tree"
t = nodeQeuen(freChar(string))
tree = creatHuffmanTree(t)
HuffmanCodeDic(tree, '')
print(codeDic1,codeDic2)
a = TransEncode(string)
print(a)
aa = TransDecode(a)
print(aa)
XXencode编码
XXencode 将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有 24 个 Bit,以 6bit 为单位分为 4 个组,每个组以十进制来表示所出现的数值只会落在 0 到 63 之间。以所对应值的位置字符代替。它所选择的可打印字符是:+``-``0-9``A-Z``a-z
,一共64个字符。跟base64打印字符相比,就是uuencode多一个-
字符,少一个/
字符。但是,它里面字符顺序与base64完全不一样。
特点
- 数字,大小写字母
-
+
号,-
号。
工具
例子
原文本:this is XXencode
XXencode编码后:ER4VdQm-dQm-MK4JiMqxYNE++
UUencode编码
Uuencode将输入资料以每三个字节为单位进行编码,如此重复进行。如果最后剩下的资料少于三个字节,不够的部份用零补齐。这三个字节共有24个Bit,以6-bit为单位分为4个群组,每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32,所产生的结果刚好落在ASCII字符集中可打印字符(32-空白…95-底线)的范围之中。每60个编码输出(相当于45个输入字节)将输出为独立的一行,每行的开头会加上长度字符,除了最后一行之外,长度字符都应该是’M’这个ASCII字符(77=32+45),最后一行的长度字符为32+剩下的字节数目这个ASCII字符。如果是一个 0字节那它应该被转换为0×60而不是0×20,因为(前引用’')优于 0×20(空格’ ‘)。
工具
例子
原文本:this is UUencode
XXencode编码后:0=&AI<R!I<R!5565N8V]D90
URL 编码
url编码又叫百分号编码,是统一资源定位(URL)编码方式。URL地址(常说网址)规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx编码处理。 现在已经成为一种规范了,基本所有程序语言都有这种编码。编码方法很简单,在该字节ascii码的的16进制字符前面加%. 如 空格字符,ascii码是32,对应16进制是'20',那么urlencode编码结果是:%20。
特点
- 大量的
%
工具
例子
原文本:this is URLcode
URLcode编码后:%74%68%69%73%20%69%73%20%55%52%4c%63%6f%64%65
Unicode 编码
Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得计算机可以用更为简单的方式来呈现和处理文字。
工具
例子
Unicode编码有四种编码方式:
原文本:this is Unicode
&#x [Hex]:this is Unicode
&# [Decimal]:this is Unicode
\U [Hex]:\U0074\U0068\U0069\U0073\U0020\U0069\U0073\U0020\U0055\U006E\U0069\U0063\U006F\U0064\U0065
\U+ [Hex]:\U+0074\U+0068\U+0069\U+0073\U+0020\U+0069\U+0073\U+0020\U+0055\U+006E\U+0069\U+0063\U+006F\U+0064\U+0065
现实世界中常用的编码
条形码
特征
- 宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符
- 国际标准
- EAN-13 商品标准,13 位数字
- Code-39:39 字符
- Code-128:128 字符
工具
在线识别
二维码
特征
- 用某种特定几何图形按一定规律在平面分步的黑白相间的图形记录数据符号信息
- 堆叠式 / 行排式二维码:Code 16 k、Code 49、PDF417
- 矩阵式二维码:QR CODE