計算機相關編碼

出自gamedev
於 2023年7月3日 (一) 11:42 由 127.0.0.1對話 所做的修訂 (创建页面,内容为“{{Ctf_Wiki}} = 计算机相关的编码 = 本节介绍一些计算机相关的编码。 == 字母表编码 == * A-Z/a-z 对应 1-26 或者 0-25 <span id="ascii-编码"></span> == ASCII 编码 == [[File:./figure/ascii.jpg|ascii]] === 特点 === 我们一般使用的 ascii 编码的时候采用的都是可见字符,而且主要是如下字符 * 0-9, 48-57 * A-Z, 65-90 * a-z, 97-122 === 变形 === ==== 二进制编码 ==== 将 ascii 码对应的数字…”)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

{{#tree:

}}

計算機相關的編碼[編輯]

本節介紹一些計算機相關的編碼。

字母表編碼[編輯]

  • A-Z/a-z 對應 1-26 或者 0-25

ASCII 編碼[編輯]

[[File:./figure/ascii.jpg|ascii]]

特點[編輯]

我們一般使用的 ascii 編碼的時候採用的都是可見字符,而且主要是如下字符

  • 0-9, 48-57
  • A-Z, 65-90
  • a-z, 97-122

變形[編輯]

二進制編碼[編輯]

將 ascii 碼對應的數字換成二進制表示形式。

  • 只有 0 和 1
  • 不大於 8 位,一般 7 位也可以,因為可見字符到 127。
  • 其實是另一種 ascii 編碼。

十六進制編碼[編輯]

將 ascii 碼對應的數字換成十六進制表示形式。

  • A-Z-->0x41~0x5A
  • a-z-->0x61~0x7A

工具[編輯]

例子[編輯]

[[File:./figure/ascii-example.png|ascii]]

2018 DEFCON Quals ghettohackers: Throwback[編輯]

題目描述如下

Anyo!e!howouldsacrificepo!icyforexecu!!onspeedthink!securityisacomm!ditytop!urintoasy!tem!

第一直覺應該是我們去補全這些嘆號對應的內容,從而得到 flag,但是補全後並不行,那麼我們可以把源字符串按照 ! 分割,然後字符串長度 1 對應字母a,長度 2 對應字母 b,以此類推

ori = 'Anyo!e!howouldsacrificepo!icyforexecu!!onspeedthink!securityisacomm!ditytop!urintoasy!tem!'
sp = ori.split('!')
print repr(''.join(chr(97 + len(s) - 1) for s in sp))

進而可以得到,這裏同時需要假設 0 個字符為空格。因為這正好使得原文可讀。

dark logic

題目[編輯]

  • Jarvis-basic-德軍的密碼

Base 編碼[編輯]

base xx 中的 xx 表示的是採用多少個字符進行編碼,比如說 base64 就是採用以下 64 個字符編碼,由於 2 的 6 次方等於 64,所以每 6 個比特為一個單元,對應某個可打印字符。3個字節就有 24 個比特,對應於 4 個 Base64 單元,即 3 個字節需要用 4 個可打印字符來表示。它可用來作為電子郵件的傳輸編碼。在 Base64 中的可打印字符包括字母 A-Z、a-z、數字 0-9,這樣共有 62 個字符,此外兩個可打印符號在不同的系統中而不同。

[[File:./figure/base64.png|base64]]

具體介紹參見 Base64 - 維基百科

編碼 man

[[File:./figure/base64_man.png|base64 編碼 MAN]]

如果要編碼的字節數不能被 3 整除,最後會多出 1 個或 2 個字節,那麼可以使用下面的方法進行處理:先使用 0 值在末尾補足,使其能夠被 3 整除,然後再進行 base64 的編碼。在編碼後的 base64 文本後加上一個或兩個 = 號,代表補足的字節數。也就是說,當最後剩餘一個八位字節(一個 byte)時,最後一個 6 位的 base64 字節塊有四位是 0 值,最後附加上兩個等號;如果最後剩餘兩個八位字節(2 個 byte)時,最後一個 6 位的 base 字節塊有兩位是 0 值,最後附加一個等號。參考下表:

[[File:./figure/base64_0.png|base64 補 0]]

由於解碼時補位的 0 並不參與運算,可以在該處隱藏信息。

與 base64 類似,base32 使用 32 個可見字符進行編碼,2 的 5 次方為 32,所以每 5 bit 為 1 個分組。5 字節為 40 bit,對應於 8 個 base32 分組,即 5 個字節用 8 個 base32 中字符來表示。但如果不足 5 個字節,則會先對第一個不足 5 bit 的分組用 0 補足了 5 bit ,對後面剩餘分組全部使用 「=」 填充,直到補滿 5 個字節。由此可知,base32 最多只有 6 個等號出現。例如:

[[File:./figure/base32.png|base32]]

特點[編輯]

  • base64 結尾可能會有 = 號,但最多有 2 個
  • base32 結尾可能會有 = 號,但最多有 6 個
  • 根據 base 的不同,字符集會有所限制
  • 有可能需要自己加等號
  • =也就是 3D
  • 更多內容請參見 base rfc

工具[編輯]

例子[編輯]

題目描述參見 ctf-challengemisc 分類的 base64-stego 目錄中的 data.txt 文件。

使用腳本讀取隱寫信息。

import base64

def deStego(stegoFile):
    b64table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    with open(stegoFile,'r') as stegoText:
        message = ""
        for line in stegoText:
            try:
                text = line[line.index("=") - 1:-1]
                message += "".join([ bin( 0 if i == '=' else b64table.find(i))[2:].zfill(6) for i in text])[2 if text.count('=') ==2 else 4:6]  
            except:
                pass
    return "".join([chr(int(message[i:i+8],2)) for i in range(0,len(message),8)])

print(deStego("text.txt"))

輸出:

     flag{BASE64_i5_amaz1ng}

題目[編輯]

霍夫曼編碼[編輯]

參見 霍夫曼編碼

XXencoding[編輯]

XXencode 將輸入文本以每三個字節為單位進行編碼。如果最後剩下的資料少於三個字節,不夠的部份用零補齊。這三個字節共有 24 個 Bit,以 6bit 為單位分為 4 個組,每個組以十進制來表示所出現的數值只會落在 0 到 63 之間。以所對應值的位置字符代替。

           1         2         3         4         5         6
 0123456789012345678901234567890123456789012345678901234567890123
 |         |         |         |         |         |         |
 +-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

具體信息參見維基百科

特點[編輯]

  • 只有數字,大小寫字母
  • +號,-號。

工具[編輯]

題目[編輯]

URL 編碼[編輯]

參見URL 編碼 - 維基百科

特點[編輯]

  • 大量的百分號

工具[編輯]

題目[編輯]

Unicode 編碼[編輯]

參見Unicode - 維基百科

注意,它有四種表現形式。

例子[編輯]

源文本: The

&#x [Hex]: &#x0054;&#x0068;&#x0065;

&# [Decimal]: &#00084;&#00104;&#00101;

\U [Hex]: \U0054\U0068\U0065

\U+ [Hex]: \U+0054\U+0068\U+0065

工具[編輯]

題目[編輯]

HTML 實體編碼[編輯]