angr 文件 - 狀態、路徑、模擬程序:路徑是如何往下走一步?

前陣子在趕自己的一些進度,雖然有持續研究,但卻沒時間記錄下來,趁現在連假,來做個筆記。

最近看了一些有趣的東西,像是有人爬 angr 原始碼然後做了一個 api 文件、還有 UCSB 發了一篇 Driller 論文等等(他結合了 fuzzing & concolic execution 來找出更多漏洞的方法),在這裡留個連結方便點閱。

回到標題,先來個關於 angr 路徑的前情提要,之前的angr 文件 - 分析 PathGroup 類別裡面,寫到 path_group 是怎麼管理一堆分支出來的路徑,裡面 _one_path_step 只講到呼叫路徑這個類別裡本身有的方法 step 來讓路徑往下走一步,這裡想看的,就是這個 step 方法裡做了什麼事情。

angr 參數 - path_group 宣告、探索時的參數配置

繼上一篇angr 文件 - 分析 PathGroup 類別,大致了解 PathGroup 類別的架構後,就來看他可以調整哪些有用的參數。這裡列出path_group 宣告時以及使用 explore 探索路徑時這兩個方法可以下的參數有哪些。

先來回顧一下使用 path_group 時是怎麼呼叫的,一般比較常用的作法會是:

1
2
3
# in our script
pg = prog.factory.path_group(initial_stage, immutable=False)
pg.explore(find=(0x4004e3,), avoid=())

完整的基本用法,可以參考編寫 angr 腳本初體驗

我們呼叫 factorypath_group 這個方法,這個方法其實就是宣告 PathGroup 類別並把參數放入:

1
2
3
4
# angr/factory.py
def path_group(self, thing=None, **kwargs):
...
return PathGroup(self._project, active_paths=thing, **kwargs)

上面是位於 factory.py 的程式碼片段,至於剛剛放的 immutable 參數是什麼,是我們這次要講的,讓我們來看看 PathGroup 這個類別的程式碼:

angr 文件 - 分析 PathGroup 類別

在之前編寫 angr 腳本初體驗裡,常用的幾乎會用到 path_group 這個方法,先來回顧一下 path_group 的用法:

1
2
3
4
5
6
initial_state = p.factory.entry_state(args=[p.filename, args], add_options={'BYPASS_UNSUPPORTED_SYSCALL'})
pg = p.factory.path_group(initial_state, immutable=False)

find_addrs = (0x400546, )
avoid_addrs = ()
pg.explore(find=find_addrs, avoid=avoid_addrs)

一開始在 path_group 設定了狀態之後,就會執行 pg.explore(find=find_addrs, avoid=avoid_addrs) 這行,進而探索(explore)每條路徑所有可能的情況,至於他是怎麼做的,就是這篇的重點,主要是追蹤 path_group.py 的程式碼後的筆記。

一個大致的虛擬碼流程如下:

angr 參數 - Project

任何 angr 腳本必寫的一行,就是用 angr.Project(),其中他有不少參數可以設定,一個常見的形式是:

1
p = angr.Project('./vul', load_options={'auto_load_libs': False})

有個奇怪的東西叫 load_options,這個統一列在下面解釋,先來看 Project 的程式碼看有多少參數:

編寫 angr 腳本初體驗

經過一番時間研究 angr 官方文件後,打算自己來寫個簡單的腳本來測試,但一開始連怎麼設定符號變數(symbolic variable)都不知道,一直到研究完後才把這些方法記錄下來,剛使用 angr 時比較會用到的方法如下:

  • Surveyors
  • Path group
  • Symbolic args
  • Symbolic input
  • Breakpoint
  • Hook

前兩種是做符號執行時會用的方法,後四種則是一些輔助的方法,像是放程式執行參數或是除錯的技巧等等,這裡來一一說明。

First

架站首 PO,參考了不少東西,還有一些改動的方式,列在這邊當筆記。

優化

先列一些架 hexo 時參考的網頁,主要是一些優化的部份: