分享到plurk 分享到twitter 分享到facebook

版本 e0c5b2b568ea446347c576990746cd6f40dfceb1

embedded/Lab43

Changes from e0c5b2b568ea446347c576990746cd6f40dfceb1 to current

---
title: Lab43: Runtime Behavior
toc: no
...

預期目標
------------

* 複習 ARM 處理器和指令集,並深入 stack 和執行時期的行為
* 熟悉 objdump、gdb 等工具,並利用上述工具分析執行檔

Part 1
------------
目標:

   * 利用 gdb 與 objdump 分析執行檔

步驟:

   1. 下載作業[檔案 (bomb.tar.gz)](/embedded/Lab34/bomb.tar.gz)
   2. 解壓縮後閱讀 README 查看執行方式,並且開始 Hacking!!
```
    tar -xzvf bomb.tar.gz
    cat README
```

使用 GDB 分析
---------------------

* 假設 [檔案 (bomb.tar.gz)](/embedded/Lab34/bomb.tar.gz) 已經解開在 ``/tmp/bomb`` 目錄,先開啟兩個終端機
* 在其中一個執行以下命令:
```
     qemu-arm -g 1234 -L /usr/arm-linux-gnueabihf ./bomb
```

* 在另一個終端機執行以下命令:
```
    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)](/embedded/Lab43/bomb2.tar.gz),其餘步驟同上
    2. 提示:回顧並熟悉上方及之前上課的內容

參考資料

  * [hwswinterface lab2](https://class.coursera.org/hwswinterface-002/assignment/view?assignment_id=7) (請先註冊 [Coursera](https://www.coursera.org/) 帳號並登入)
  * [Lab34: Buffer overflow](/embedded/Lab34)
  * [Debugging with GDB (入門篇)](http://www.study-area.org/goldencat/debug.htm)
  * [一個練習組合語言的小遊戲 -- Defusing bomb (part 1)](http://albert-oma.blogspot.tw/2015/02/embedded-defusing-bomb-part-1.html)

Part 2
-------------
目標:

   * 瞭解 buffer overflow 的原理,並且利用這項技巧攻擊程式

步驟:

* 假設 [Lab-39](/embedded/Lab39) 的  [qemu_stm32](https://github.com/beckus/qemu_stm32) 放在 ``$HOME/workspace`` 目錄下
```
   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 "<Your codes here>" > exploit.str
   make exploit
   make qemu
```

在 FreeRTOS shell (QEMU 視窗),輸入以下命令:
```
   bufbomb
```

程式說明:

   * bufbomb 會利用 [ARM semihosting](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205g/Bgbjhiea.html) 讀取由 ``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](https://class.coursera.org/hwswinterface-002/assignment/view?assignment_id=9) (請先註冊 [Coursera](https://www.coursera.org/) 帳號並登入)
  * [IA32 Linux Buffer Overflow](https://d396qusza40orc.cloudfront.net/hardware/lecture_slides/tutorials/buffoverflow.pdf)
  * [一個練習組合語言的小遊戲 -- Defusing bomb (part 2)](http://albert-oma.blogspot.tw/2015/02/embedded-defusing-bomb-part-2.html)

繳交作業
-------------
* 截止日期:
  - May 2, 2015 (含) 之前

* 更新解題過程到共筆網站: [Lab 43 / 作業共筆](https://embedded2015.hackpad.com/Lab43),需要標注自己的 ID