iT邦幫忙

2024 iThome 鐵人賽

DAY 15
0

進入下一個主題分類啦 ~ 接下來我們會練習一些 Reverse 的題型。今天會從簡單的內容切入,只需要觀察能解的題目。

UTF-8

8 位元的 Unicode 轉換格式是當前全球最廣泛使用的字元編碼標準之一。它將 Unicode 字元集中的每個字元編碼為 1 到 4 個位元組,解決了跨平台顯示多語言文本的問題,並在網路及軟體開發中扮演著不可或缺的角色。

起源

隨著網際網路的崛起和全球化的推動,單一語言的字元編碼方式如我們曾在 Day8 中提到 ASCII 編碼,以及其他區域性編碼系統,逐漸無法滿足多語言文本的需求。為了統一不同語言的字元表示,創建 Unicode 字元集,目的是為每種語言的每個字元提供唯一的碼點。

UTF-8Ken ThompsonRob Pike 於 1992 年設計的。將 Unicode 字元以 8 位元序列的方式進行編碼,兼具效率和向後相容性,因此成為目前最流行的編碼標準。

UTF-8 的編碼方式

UTF-8 是一種可變長度的編碼方式,依據字元的範圍,使用 1 到 4 個位元組來表示不同的 Unicode 字元:

  • 1 個位元組:用於 ASCII 字元(範圍 0x00 到 0x7F),確保與 ASCII 完全相容。
  • 2 個位元組:用於擴展拉丁字母等(範圍 0x80 到 0x7FF)。
  • 3 個位元組:用於常見的亞洲語言字元,如中文、日文、韓文(範圍 0x800 到 0xFFFF)。
  • 4 個位元組:用於罕見字元,例如歷史文字符號或表情符號(範圍 0x10000 到 0x10FFFF)。

這種可變長度編碼確保常見字元能以最少的位元組表示,提升了儲存和傳輸的效率。

UTF-8 的優點

相容性: UTF-8 的前 128 個字元與 ASCII 相同,因此能夠無縫處理所有 ASCII 文本,並且無需對現有系統進行大幅修改。

儲存空間效率提升: 相較於固定長度編碼(如 UTF-16 或 UTF-32),UTF-8 在處理英文的文件時更為節省空間。

支援全球語言: UTF-8 能夠編碼所有 Unicode 字元,成為支援多語言應用的好選擇。

廣泛相容性: 由於 UTF-8 與 ASCII 的相容性,許多現有系統可以輕鬆過渡到 UTF-8,減少了技術成本。

應用

  • 網頁開發:UTF-8 是 HTML 和 XML 的默認字元編碼標準,保證了網站能正確顯示全球各地的多語言文本。
  • API與數據傳輸:多數網路協議(如 HTTP、WebSocket)使用 UTF-8 進行數據編碼,確保不同平台之間通訊一致。
  • 操作系統與檔案系統:現代作業系統(如 Linux 與 macOS)使用 UTF-8 來編碼檔案名稱、路徑及內容,支援多語言檔案操作。

UTF-8 編碼處理不同字元:

  1. ASCII字元:
    字元:A
    Unicode 編碼:U+0041
    UTF-8 編碼:41(1 個位元組)

  2. 非 ASCII 拉丁字元:
    字元:ñ(西班牙語)
    Unicode 編碼:U+00F1
    UTF-8 編碼:C3 B1(2 個位元組)

  3. 中文字元:
    字元:
    Unicode 編碼:U+4F60
    UTF-8 編碼:E4 BD A0(3 個位元組)

  4. 表情符號:
    字元:😊
    Unicode 編碼:U+1F60A
    UTF-8 編碼:F0 9F 98 8A(4 個位元組)

開始今天的練習 ~

Lab_1 - Transformation

https://ithelp.ithome.com.tw/upload/images/20240929/20169462QP3amHLNCz.png

打開 enc 檔案後發現一串看不懂的字 灩捯䍔䙻ㄶ形楴獟楮獴㌴摟潦弸強㕤㐸㤸扽,可以推斷可能出跟UTF 的編碼有關

再看看題目的敘述 ''.join([chr((ord(flag[i]) << 8) + ord(flag[i + 1])) for i in range(0, len(flag), 2)])。意思是將 flag 字串每個字元編碼往左邊移八位。具體來說,就是將兩個字元的數值合併成一個整數。例如,對於 flag[i] = 'A' 和 flag[i + 1] = 'B',ord('A') = 65,ord('B') = 66,結果是 (65 << 8) + 66 = 16706。(65*8 + 66 = 16706)
等於兩個八位元的字元組合成一個十六位元的字元,試試看 UTF-16

用這個酷酷的解碼工具 Character Encoder / Decoder Tool 讓他幫我們解碼回去成 flag 原本的模樣

https://ithelp.ithome.com.tw/upload/images/20240929/20169462nGo0fvHaUA.png

Lab_2 - Reverse

https://ithelp.ithome.com.tw/upload/images/20240929/20169462CbGkeHJ3Z6.png

這題我們會用到一個會很常使用到的指令 strings

strings 指令是 Unix/Linux 系統中的一個工具,主要用於從二進位檔案中提取可讀的文字字串。用來分析二進位檔案、可執行檔案或其他資料檔案,快速找出其中的可讀內容。

  1. 提取可讀文字字串: strings 指令會掃描二進位檔案,並顯示其中的可讀 ASCII 或 Unicode 字串。這些字串通常由於編程需求被嵌入在檔案中,比如日誌訊息、錯誤提示、路徑、檔案名稱等。
  2. 分析二進位檔案: 開發者、逆向工程師或資安研究人員可以使用 strings 來分析二進位檔案,嘗試發現其中的有用資訊,特別是在進行逆向工程、惡意程式分析或 CTF 比賽中。
  3. 快速檢查資料檔案: 當不確定檔案的內容時,可以使用 strings 查看該檔案是否包含可讀文字、檔案類型或其他線索。

我們對題目附上的檔案 ret 使用 strings ret 這個指令,印出所有可讀的字串。

https://ithelp.ithome.com.tw/upload/images/20240929/20169462efCtUxpZoM.png

今天的練習就到這邊,以下是參考資料,請搭配服用:

UTF-8
UTF-8 編碼原理
位元組順序
strings 指令

內文如有錯誤,還請不吝指教~


上一篇
Day14 - [Pwn] Buffer Overflow
下一篇
Day16 - [Reverse] 程式碼分析
系列文
新手村預備,CTF 小菜雞跌跌撞撞的旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言