--- title: Lab43: Runtime Behavior toc: no ... 預期目標 ------------ * 複習 ARM 處理器和指令集,並深入 stack 和執行時期的行為 * 熟悉 objdump、gdb 等工具,並利用上述工具分析執行檔 Part 1 ------------ 目標: * 利用 gdb 與 objdump 分析執行檔 步驟: 1. 下載作業`檔案 (bomb.tar.gz)`_ 2. 解壓縮後閱讀 README 查看執行方式,並且開始 Hacking!! .. code-block:: prettyprint tar -xzvf bomb.tar.gz cat README .. 使用 GDB 分析 --------------------- * 假設 `檔案 (bomb.tar.gz)`_ 已經解開在 ``/tmp/bomb`` 目錄,先開啟兩個終端機 * 在其中一個執行以下命令: .. code-block:: prettyprint qemu-arm -g 1234 -L /usr/arm-linux-gnueabihf ./bomb * 在另一個終端機執行以下命令: .. code-block:: prettyprint arm-none-eabi-gdb ./bomb * 在 gdb 的畫面中依序輸入以下命令: - ``target remote :1234`` - ``b phase_0`` - ``b phase_1`` - ``b phase_2`` - ``b phase_3`` - ``info breakpoints`` - ``c`` * 切換到執行 QEMU 的終端機,可見到要求輸入字串,輸入 ``help`` 並按下 Enter,這時可在 GDB 的視窗看到 ``Breakpoint 1`` 的訊息 程式說明 (上): * bomb 這支程式會從標準輸入讀取字串,請利用上述的工具找出正確的字串輸入 * 總共有 5 個階段,第 0 個階段是範例,密碼是``help`` * 溫馨小提示,不同階段可以從不同的方向去想 - 階段 1 - 比較 - 階段 2 - 迴圈 - 階段 3 - switch - 階段 4 - 遞迴 程式說明 (下): 1. 下載`檔案 (bomb2.tar.gz)`_,其餘步驟同上 2. 提示:回顧並熟悉上方及之前上課的內容 參考資料 * `hwswinterface lab2`_ (請先註冊 `Coursera`_ 帳號並登入) * `Lab34: Buffer overflow`_ * `Debugging with GDB (入門篇)`_ * `一個練習組合語言的小遊戲 -- Defusing bomb (part 1)`_ Part 2 ------------- 目標: * 瞭解 buffer overflow 的原理,並且利用這項技巧攻擊程式 步驟: * 假設 `Lab-39`_ 的 `qemu_stm32`_ 放在 ``$HOME/workspace`` 目錄下 .. code-block:: prettyprint cd ~/workspace git clone https://github.com/embedded2015/freertos-bufbomb.git || git clone git@github.com:embedded2015/freertos-bufbomb.git cd freertos-bufbomb && make echo "" > exploit.str make exploit make qemu 在 FreeRTOS shell (QEMU 視窗),輸入以下命令: .. code-block:: prettyprint bufbomb .. 程式說明: * bufbomb 會利用 `ARM semihosting`_ 讀取由 ``make exploit`` 產生的 ``exploit.byte`` * 觀察 ``bufbomb.c``,找出問題所在,輸入正確的 byte code * ``str2byte`` 這支程式會讀入 hex 並且轉換成二進位檔案,需要注意的是每一行 code 結尾必須是 ``0x0A('\n')`` * 溫馨小提示 - Level 1 - 利用 buffer overflow 覆蓋 local variable 的值 - Level 2 - 利用 buffer overflow 覆蓋堆疊上 link register 的值 - Level 3 - 插入一段 exploit code 並且利用 buffer overflow 覆蓋堆疊上 link register 的值,使其能夠跳轉至 exploit code 修改 global variable 的值 * 在建立 exploit code 的時候可以先寫 C code,編譯後利用 objdump 將 machine code 取出 參考資料: * `hwswinterface lab3`_ (請先註冊 `Coursera`_ 帳號並登入) * `IA32 Linux Buffer Overflow`_ * `一個練習組合語言的小遊戲 -- Defusing bomb (part 2)`_