Angr例項分析 layer7 onlyone

2021-08-20 15:10:59 字數 3018 閱讀 9004

本部落格由閒散白帽子

胖胖鵬鵬胖胖鵬

這周我們依舊繼續進行angr的例項解析,我在使用angr的過程中,發現了需要hook函式的地方,就看了下angr-doc中提供的幾種用法。這裡layer7_onlyone為例,簡單介紹下使用hook的正確姿勢。本文涉及的ctf題目及相關的求解**在這

首先是開啟軟體看下,要求我們輸入字串,我們隨便輸入一下,shell關閉,生成了乙個密文文件,看來是要我們解密出來這個檔案了。把exe拖到ida裡面,找到main函式。

乏善可陳。。。。v7是我們輸入的字串,sub_4010e0是strlen,看來主要的解密就在sub_401000裡面了。

import angr

import logging

def decrypt(state):

buf = state.regs.edx # 選擇第二個入參

# 跳過了真正的解密流程,並且直接返回正確的值(太懶了吧)

state.memory.store(buf, state.solver.bvv(int('layerseven\x00'.encode('hex'), 16), 88))

def main():

# 載入檔案

p = angr.project("onlyone.exe", use_sim_procedures=true)

# hook malloc函式,這裡使用標準庫函式

p.hook(0x2398, angr.sim_procedures['libc']['malloc'])

# hook decrypthook函式,因為我們不支援指數pow/開方sqrt/向下取證floor

p.hook(0x401038, decrypt, length=5)

# 這是 'encrypted' 檔案的內容

# 我們輸入的字串加密之後應該和檔案中的內容相同

encrypted = "253e315126363a2e551c".decode('hex')

# 因為前面的內容都沒有什麼意義,所以我們從目標函式開始執行

initial_state = p.factory.blank_state(addr=0x401000)

# 這裡是我們的輸入字串的位址(這裡字串的位址我有些疑問,不知道為什麼是這樣,也許是隨機選的)

str_ptr = 0x800000

# 載入輸入字串,並且確保字串不為空

content = initial_state.memory.load(str_ptr, len(encrypted))

for i in xrange(0, len(content), 8):

initial_state.add_constraints(content[i + 7 : i] != 0)

# 確保輸入字串以\0結尾

zero = initial_state.memory.load(str_ptr + len(encrypted), 1)

initial_state.add_constraints(zero == 0)

# 把字串位址push放到棧上

initial_state.stack_push(initial_state.solver.bvv(str_ptr, 32))

# push返回位址

initial_state.stack_push(initial_state.solver.bvv(0, 32))

# 建立初始路徑

# 呼叫explorer執行函式

# 注意veritesting很重要,因為我們想要避免不需要的分支,緩解路徑**

ex = angr.surveyors.explorer(p, start=initial_state, find=(0x4010c9, ), enable_veritesting=true)

print "executing..."

angr.surveyors.explorer.l.setlevel(logging.debug)

angr.surveyors.surveyor.l.setlevel(logging.debug)

r = ex.run()

if r.found:

final_state = r.found[0]

else:

final_state = r.errored[0].previous_run.initial_state

# 讀取最後加密的字串,並且約束使得string等於加密後的字串

buf_ptr = final_state.memory.load(final_state.regs.ebp - 0x18, 4, endness=p.arch.memory_endness)

for i in xrange(0, len(encrypted)):

final_state.add_constraints(final_state.memory.load(buf_ptr + i, 1) == ord(encrypted[i]))

# 最後求解得到我們的正確輸入

input_string = final_state.memory.load(str_ptr, 10)

print "solving..."

candidates = final_state.solver.eval_upto(input_string, 2)

assert len(candidates) == 1

return hex(candidates[0])[2 : -1].decode('hex')

def test():

assert main() == 'i_h4te_x0r'

if __name__ == "__main__":

print main()

以上就是求解的**,用了這麼多angr,給我的感覺是,還是離不開人工分析,包括decrypt函式都是我們需要進行主動hook的,不熟悉angr之前覺得很好用,但是熟悉之後,覺得還是需要大量的人工分析的。

8 2 5 例項分析

下面對以上 作簡要說明 1 按照常規步驟建立並拷貝 matrix rect 的matrx var mymatrix matrix matrix rect.transform.matrix 此處應該注意大小寫,transform 內部並不存在 matrix 物件。matrix 是矩陣類的名字,matr...

分析函式例項

具體的分析函式的語法和函式列表見 資料準備 以oracle樣例的sh模式為實驗資料 建立實驗資料表 sales fact create table sales fact as select country name country,country subregion region,prod name...

AsyncTask例項分析

生成該類的物件,並呼叫execute方法之後 首先執行的是onproexecute方法 其次執行doinbackgroup方法 public class progressbarasynctask extends asynctask 這裡的integer引數對應asynctask中的第乙個引數 這裡的...