Misc总结——编码分析&转换

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个可打印字符来表示二进制数据的表示方法。由于 2^{6}=64,所以每6个比特为一个单元,对应某个可打印字符。3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。
在Base64中的可打印字符包括字母A-Za-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原理相似。由于 2^{5}=32,所以每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

由于 2^{4}=16,所以每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在线编码解码

例子

Unicode编码有四种编码方式:
原文本:this is Unicode
&#x [Hex]:&#x0074;&#x0068;&#x0069;&#x0073;&#x0020;&#x0069;&#x0073;&#x0020;&#x0055;&#x006E;&#x0069;&#x0063;&#x006F;&#x0064;&#x0065;
&# [Decimal]:&#00116;&#00104;&#00105;&#00115;&#00032;&#00105;&#00115;&#00032;&#00085;&#00110;&#00105;&#00099;&#00111;&#00100;&#00101;
\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

工具

在线识别

二维码在线识别

QR_Research
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容