真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何利用Angr進(jìn)行簡(jiǎn)單CTF逆向分析

如何利用Angr進(jìn)行簡(jiǎn)單CTF逆向分析,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出閻良免費(fèi)做網(wǎng)站回饋大家。

一、符號(hào)執(zhí)行概括

簡(jiǎn)單的來(lái)說,符號(hào)執(zhí)行就是在運(yùn)行程序時(shí),用符號(hào)來(lái)替代真實(shí)值。符號(hào)執(zhí)行相較于真實(shí)值執(zhí)行的優(yōu)點(diǎn)在于,當(dāng)使用真實(shí)值執(zhí)行程序時(shí),我們能夠遍歷的程序路徑只有一條,而使用符號(hào)進(jìn)行執(zhí)行時(shí),由于符號(hào)是可變的,我們就可以利用這一特性,盡可能的將程序的每一條路徑遍歷,這樣的話,必定存在至少一條能夠輸出正確結(jié)果的分支,每一條分支的結(jié)果都可以表示為一個(gè)離散關(guān)系式,使用約束求解引擎即可分析出正確結(jié)果,這就是符號(hào)執(zhí)行的簡(jiǎn)單闡述。

Angr是一個(gè)利用python開發(fā)的二進(jìn)制程序分析框架,我們可以利用這個(gè)工具嘗試對(duì)一些CTF題目進(jìn)行符號(hào)執(zhí)行來(lái)找到正確的解答,即flag。當(dāng)然,要注意的是符號(hào)執(zhí)行的路徑選擇問題到現(xiàn)在依舊是一個(gè)很大的問題,換句話說也就是當(dāng)我們的程序存在循環(huán)時(shí),因?yàn)榉?hào)執(zhí)行會(huì)盡量遍歷所有的路徑,所以每次循環(huán)之后會(huì)形成至少兩個(gè)分支,當(dāng)循環(huán)的次數(shù)足夠多時(shí),就會(huì)造成路徑爆炸,整個(gè)機(jī)器的內(nèi)存會(huì)被耗盡。

二、Angr使用

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

1. 運(yùn)行程序

我們?cè)诘玫揭粋€(gè)程序時(shí),首先需要對(duì)此程序創(chuàng)建一個(gè)Angr工程。

p = angr.Project(‘program’)

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

然后需要將這個(gè)程序運(yùn)行起來(lái),并且處理程序的一些輸入,前面已經(jīng)說過,在符號(hào)執(zhí)行時(shí),我們使用的并不是真實(shí)值,而是一個(gè)個(gè)符號(hào),可以簡(jiǎn)單的理解為變量,所以我們需要構(gòu)造一個(gè)Angr中的符號(hào)來(lái)當(dāng)做程序的輸入。

(1) 命令行參數(shù)

當(dāng)程序要求命令行參數(shù)時(shí),我們首先需要使用claripy這個(gè)模塊來(lái)定義抽象的數(shù)據(jù)。

import claripy

claripy的BVS函數(shù)可以創(chuàng)建一個(gè)指定長(zhǎng)度的抽象數(shù)據(jù),BVS函數(shù)要求兩個(gè)參數(shù),***個(gè)參數(shù)為變量名,第二個(gè)參數(shù)為變量長(zhǎng)度。

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

這樣,我們就創(chuàng)建好了一個(gè)命令行參數(shù),我們現(xiàn)在可以將程序運(yùn)行到程序入口處,并獲得當(dāng)前的一個(gè)狀態(tài)。

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

P.factory是工廠函數(shù)的一個(gè)集合,在這里面可以調(diào)用各種各樣的函數(shù)來(lái)進(jìn)行符號(hào)執(zhí)行,其中entry_state()函數(shù)接收一個(gè)list作為程序的命令行參數(shù)并且返回程序入口的狀態(tài)(這個(gè)狀態(tài)將在2.2節(jié)講解)。

(2) 標(biāo)準(zhǔn)輸入

當(dāng)程序需要從標(biāo)準(zhǔn)輸入處讀取數(shù)據(jù)時(shí),需要使用read_from()函數(shù),要注意,這個(gè)函數(shù)位于狀態(tài)中,并且我們可以對(duì)輸入進(jìn)行一些約束以減少符號(hào)執(zhí)行遍歷的路徑。

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

這表示我們從標(biāo)準(zhǔn)輸入讀入了5個(gè)字節(jié),并且每個(gè)字節(jié)都不為換行符。

2. Angr中程序的幾種狀態(tài)

我們?cè)谥疤岬搅双@取程序入口點(diǎn)的狀態(tài),狀態(tài)在Angr中表示著程序符號(hào)執(zhí)行后的幾種結(jié)果,在Angr中,當(dāng)獲取到程序入口點(diǎn)的狀態(tài)后,我們需要使用Angr的Simgr模擬器來(lái)進(jìn)行符號(hào)執(zhí)行

sm = p.factory.simgr(state)

表示從入口點(diǎn)出創(chuàng)建一個(gè)模擬器來(lái)進(jìn)行符號(hào)執(zhí)行。

在 Angr 尋找路徑時(shí),程序的當(dāng)前狀態(tài)有多種表示。

  • step()表示向下執(zhí)行一個(gè)block(42bytes),step()函數(shù)產(chǎn)生active狀態(tài),表示該分支在執(zhí)行中;

  • run()表示運(yùn)行到結(jié)束,run()函數(shù)產(chǎn)生deadended狀態(tài),表示分支結(jié)束;

  • explore()可以對(duì)地址進(jìn)行限制以減少符號(hào)執(zhí)行遍歷的路徑。例如

  • sm.explore(find=0x400676,avoid=[0x40073d])

  • explore()產(chǎn)生found狀態(tài),表示探索的結(jié)果等等

3. 獲取輸出

當(dāng)符號(hào)執(zhí)行遍歷玩路徑后,會(huì)產(chǎn)生大量的狀態(tài),我們則需要從這些狀態(tài)中找出我們所需要的一條路徑。

我們可以獲取當(dāng)前狀態(tài)程序的輸出

print sm.found.posix.dumps(1)

命令行參數(shù)

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

標(biāo)準(zhǔn)輸入

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

在求解命令行參數(shù)和標(biāo)準(zhǔn)輸入的值時(shí),我們使用了約束求解引擎來(lái)進(jìn)行求解

3. Angr實(shí)踐

bin(re50)下載:

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

腳本編寫

import angr import sys print "[*]start------------------------------------" p = angr.Project(sys.argv[1])  # 建立工程初始化二進(jìn)制文件 state = p.factory.entry_state() # 獲取入口點(diǎn)處狀態(tài)   ''' state.posix.files[0].read_from(1)表示從標(biāo)準(zhǔn)輸入讀取一個(gè)字節(jié) '''   for _ in xrange(int(sys.argv[2])):  # 對(duì)輸入進(jìn)行簡(jiǎn)單約束(不為回車)     k = state.posix.files[0].read_from(1)     state.se.add(k!=10)   k = state.posix.files[0].read_from(1) state.se.add(k==10)  # 回車為結(jié)束符   state.posix.files[0].seek(0) state.posix.files[0].length = int(sys.argv[2])+1 # 約束輸入長(zhǎng)度(大于實(shí)際長(zhǎng)度也可)   print "[*]simgr start-------------------------------"   sm = p.factory.simgr(state)   # 初始化進(jìn)程模擬器 sm.explore(find=lambda s:"correct!" in s.posix.dumps(1)) # 尋找運(yùn)行過程中存在 “correct!”的路徑,并丟棄其他路徑 print "[*]program excuted---------------------------"   for pp in sm.found:     out = pp.posix.dumps(1)   # 表示程序的輸出     print out     inp = pp.posix.files[0].all_bytes()  # 取輸入的變量     print pp.solver.eval(inp,cast_to = str)  # 利用約束求解引擎求解輸入

運(yùn)行

root@kali:~# python re50.py ppp 4 [*]start------------------------------------ /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   if ilibname.strip('.0123456789') == spec.strip('.0123456789'): [*]simgr start------------------------------- [*]program excuted--------------------------- please input the key:correct!   9563   root@kali:~#

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

關(guān)于如何利用Angr進(jìn)行簡(jiǎn)單CTF逆向分析問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


分享題目:如何利用Angr進(jìn)行簡(jiǎn)單CTF逆向分析
本文鏈接:http://weahome.cn/article/pdceph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部