成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

符號執行:利用Angr進行簡單CTF逆向分析

安全 應用安全
Angr是一個利用python開發的二進制程序分析框架,我們可以利用這個工具嘗試對一些CTF題目進行符號執行來找到正確的解答,即flag。

一、符號執行概括

簡單的來說,符號執行就是在運行程序時,用符號來替代真實值。符號執行相較于真實值執行的優點在于,當使用真實值執行程序時,我們能夠遍歷的程序路徑只有一條,而使用符號進行執行時,由于符號是可變的,我們就可以利用這一特性,盡可能的將程序的每一條路徑遍歷,這樣的話,必定存在至少一條能夠輸出正確結果的分支,每一條分支的結果都可以表示為一個離散關系式,使用約束求解引擎即可分析出正確結果,這就是符號執行的簡單闡述。

[[207174]]

Angr是一個利用python開發的二進制程序分析框架,我們可以利用這個工具嘗試對一些CTF題目進行符號執行來找到正確的解答,即flag。當然,要注意的是符號執行的路徑選擇問題到現在依舊是一個很大的問題,換句話說也就是當我們的程序存在循環時,因為符號執行會盡量遍歷所有的路徑,所以每次循環之后會形成至少兩個分支,當循環的次數足夠多時,就會造成路徑爆炸,整個機器的內存會被耗盡。

二、Angr使用

個人感覺Angr在求解REVERSE題目時很有用,但在處理PWN題目時,多用在一些輔助的位置,比如尋找 strcmp 等敏感的函數等,這次我們簡單的講解一下如何使用Angr進行REVERSE題目的分析求解。我首先講解一下Angr在實踐中的幾步關鍵操作,之后會使用一個簡單的CTF題目進行實踐。推薦大家使用ipython進行簡單的實踐,ipython的tab補全可以讓你看到Angr中很多奇妙的函數。

1. 運行程序

我們在得到一個程序時,首先需要對此程序創建一個Angr工程。

  1. p = angr.Project(‘program’) 

我們可以通過這個工程得到程序的一些信息,比如程序名p.filename等等。

然后需要將這個程序運行起來,并且處理程序的一些輸入,前面已經說過,在符號執行時,我們使用的并不是真實值,而是一個個符號,可以簡單的理解為變量,所以我們需要構造一個Angr中的符號來當做程序的輸入。

(1) 命令行參數

當程序要求命令行參數時,我們首先需要使用claripy這個模塊來定義抽象的數據。

  1. import claripy 

claripy的BVS函數可以創建一個指定長度的抽象數據,BVS函數要求兩個參數,***個參數為變量名,第二個參數為變量長度。

  1. argv = [p.filename,]  
  2. arg = claripy.BVS(‘arg1′, 8)argv.append(arg1) 

這樣,我們就創建好了一個命令行參數,我們現在可以將程序運行到程序入口處,并獲得當前的一個狀態。

  1. state = p.factory.entry_state(args=argv

P.factory是工廠函數的一個集合,在這里面可以調用各種各樣的函數來進行符號執行,其中entry_state()函數接收一個list作為程序的命令行參數并且返回程序入口的狀態(這個狀態將在2.2節講解)。

(2) 標準輸入

當程序需要從標準輸入處讀取數據時,需要使用read_from()函數,要注意,這個函數位于狀態中,并且我們可以對輸入進行一些約束以減少符號執行遍歷的路徑。

  1. for _ in xrange(5):   
  2.     k = state.posix.files[0].read_from(1) 
  3.     state.se.add(k!=10) 

這表示我們從標準輸入讀入了5個字節,并且每個字節都不為換行符。

2. Angr中程序的幾種狀態

我們在之前提到了獲取程序入口點的狀態,狀態在Angr中表示著程序符號執行后的幾種結果,在Angr中,當獲取到程序入口點的狀態后,我們需要使用Angr的Simgr模擬器來進行符號執行

  1. sm = p.factory.simgr(state) 

表示從入口點出創建一個模擬器來進行符號執行。

在 Angr 尋找路徑時,程序的當前狀態有多種表示。

  • step()表示向下執行一個block(42bytes),step()函數產生active狀態,表示該分支在執行中;
  • run()表示運行到結束,run()函數產生deadended狀態,表示分支結束;
  • explore()可以對地址進行限制以減少符號執行遍歷的路徑。例如
  • sm.explore(find=0x400676,avoid=[0x40073d])
  • explore()產生found狀態,表示探索的結果等等

3. 獲取輸出

當符號執行遍歷玩路徑后,會產生大量的狀態,我們則需要從這些狀態中找出我們所需要的一條路徑。

我們可以獲取當前狀態程序的輸出

  1. print sm.found.posix.dumps(1) 

命令行參數

  1. print sm.found.solver.eval(arg1,cast_to = str

標準輸入

  1. inp = sm.found.posix.files[0].all_bytes()   
  2. print sm.found.solver.eval(inp,cast_to = str)z 

在求解命令行參數和標準輸入的值時,我們使用了約束求解引擎來進行求解

3. Angr實踐

bin(re50)下載:

http://oj.xctf.org.cn/web/practice/defensetrain/465f6bb8f4ad4d65a70cce2bd69dfacf/

腳本編寫

  1. import angr 
  2. import sys 
  3. print "[*]start------------------------------------" 
  4. p = angr.Project(sys.argv[1])  # 建立工程初始化二進制文件 
  5. state = p.factory.entry_state() # 獲取入口點處狀態 
  6.   
  7. ''' 
  8. state.posix.files[0].read_from(1)表示從標準輸入讀取一個字節 
  9. ''' 
  10.   
  11. for _ in xrange(int(sys.argv[2])):  # 對輸入進行簡單約束(不為回車) 
  12.     k = state.posix.files[0].read_from(1) 
  13.     state.se.add(k!=10) 
  14.   
  15. k = state.posix.files[0].read_from(1) 
  16. state.se.add(k==10)  # 回車為結束符 
  17.   
  18. state.posix.files[0].seek(0) 
  19. state.posix.files[0].length = int(sys.argv[2])+1 # 約束輸入長度(大于實際長度也可) 
  20.   
  21. print "[*]simgr start-------------------------------" 
  22.   
  23. sm = p.factory.simgr(state)   # 初始化進程模擬器 
  24. sm.explore(find=lambda s:"correct!" in s.posix.dumps(1)) # 尋找運行過程中存在 “correct!”的路徑,并丟棄其他路徑 
  25. print "[*]program excuted---------------------------" 
  26.   
  27. for pp in sm.found: 
  28.     out = pp.posix.dumps(1)   # 表示程序的輸出 
  29.     print out 
  30.     inp = pp.posix.files[0].all_bytes()  # 取輸入的變量 
  31.     print pp.solver.eval(inp,cast_to = str)  # 利用約束求解引擎求解輸入 

運行

  1. root@kali:~# python re50.py ppp 4 
  2. [*]start------------------------------------ 
  3. /usr/local/lib/python2.7/dist-packages/cle/loader.py:729: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
  4.   if ilibname.strip('.0123456789') == spec.strip('.0123456789'): 
  5. [*]simgr start------------------------------- 
  6. [*]program excuted--------------------------- 
  7. please input the key:correct! 
  8.   
  9. 9563 
  10.   
  11. root@kali:~# 

我們就得到了正確的key值 9563

責任編輯:趙寧寧 來源: FreeBuf
相關推薦

2017-01-23 08:40:33

動態符號代碼覆蓋測試

2021-04-21 10:01:18

漏洞KLEE網絡攻擊

2025-05-14 02:22:00

符號工具Angr

2022-04-19 09:24:18

QtC++框架

2021-05-26 08:51:50

漏洞漏洞掃描符號執行

2022-07-26 13:00:01

安全符號源代碼

2020-12-25 15:24:24

人工智能

2009-02-04 10:30:47

2022-09-27 14:46:03

網絡安全計算機惡意軟件

2023-09-11 08:40:34

AOTVMP代碼

2020-09-21 09:58:01

Frida

2016-09-29 14:37:39

ImageMagick漏洞分析

2009-07-04 21:19:04

2021-01-20 08:30:00

數據分析機器學習IT

2020-10-21 09:49:31

Ghidra逆向分析

2017-08-22 13:45:27

2020-10-19 11:35:47

Ghidra逆向分析G

2020-12-17 09:45:54

數據分析互聯網大數據

2024-07-26 21:36:43

2017-02-09 20:56:40

iOS符號表支付寶
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 粉嫩国产精品一区二区在线观看 | 成人精品高清 | 亚洲天堂日韩精品 | 日本不卡一区二区三区在线观看 | 四虎永久影院 | 亚洲天堂av一区 | 国产精品免费一区二区 | 久久久久久久久久久久91 | 97色在线观看免费视频 | 免费成年网站 | 免费观看黄网站 | 午夜一区二区三区 | 毛片在线免费 | 日韩一区二区不卡 | 最新国产精品视频 | 国产一级网站 | 欧洲尺码日本国产精品 | 精品久久精品 | 日韩手机在线视频 | 欧美一区二区黄 | 亚洲日本国产 | 天堂精品| 一二三区av | 久久精品视频在线免费观看 | 国际精品鲁一鲁一区二区小说 | 在线伊人网 | 亚洲欧美激情精品一区二区 | 国产永久免费 | 青青操91| 天天干天天操天天看 | 国产不卡一 | 有码在线| 亚洲视频中文字幕 | 粉嫩一区二区三区四区公司1 | 亚洲精品二区 | 日韩黄色免费 | 日韩视频一区二区 | 久久久久久国产精品 | 午夜成人免费视频 | 成人亚洲精品久久久久软件 | 在线四虎 |