angr使用學習(持續更新)

首先我是直接在kali中安裝的,也是邊練邊學的。

嗯,要在純凈python環境,所以是在?virtualenv 虛擬環境里,也不是特別會用這個,按照教程一步步做的

source venv/bin/activate

進入了對應環境

退出是

deactivate

?en,ipython交互性確實好一些

00_angr

import angr
p=angr.Project('./dist/00_angr_find')
init_state=p.factory.entry_state()
sm=p.factory.simulation_manager(init_state)
sm.explore(find=0x8048678)
# sm.found[0]
found_state=sm.found[0]
found_state.posix.dumps(0)

得到正確字符串?

01_angr

嗯,最好都加一個 avoid=? ,也可以加快模擬

02_angr

sm.explore( )參數也可以是字符串。

不知道為什么寫地址跑不出來。

import angr
p=angr.Project('./dist/02_angr_find_condition')
init_state=p.factory.entry_state()
sm=p.factory.simulation_manager(init_state)
def is_good(state):return b'Good Job' in state.posix.dumps(1)
def is_bad(state):return b'Try again' in state.posix.dumps(1)
sm.explore(find=is_good,avoid=is_bad)
if sm.found:found_state=sm.found[0]print(found_state.posix.dumps(0))

使用指定地址作為目標(find=address)沒有預期的效果,但使用字符串匹配時卻可以正常工作。這可能是由于以下幾種原因:

  1. 路徑爆炸angr在分析復雜的二進制程序時可能會遇到路徑爆炸問題,即存在大量的執行路徑。設置特定地址作為目標可能無法讓angr找到正確的路徑,因為它可能在其他路徑上花費太多時間或資源。

  2. 目標地址不可達:目標地址可能并不是代碼執行的直接目標。例如,如果目標地址在特定條件下才能被執行,而條件不滿足,angr就無法到達該地址。

  3. 代碼優化或跳轉:編譯器的優化可能導致目標地址的直接訪問變得復雜,例如內聯函數或跳轉指令。字符串匹配可能會更直接地找到這些代碼片段。

  4. 符號執行約束angr依賴于符號執行來探索程序的執行路徑。如果約束條件太復雜或過于松散,可能無法正確解析所有可能的執行路徑。

03_angr

是有三個輸入,angr好像不支持多個輸入

定義為符號變量(BVS)并表示為比特向量(bit vectors)

嗯,就是起始位置可以自定義,變量可以自己通過寄存器設置

存儲在寄存器中了

import angr
import claripy
p=angr.Project('./dist/03_angr_symbolic_registers')
state_addr=0x08048980
init_state=p.factory.blank_state(addr=state_addr)
pass1=claripy.BVS('pass1',32)
pass2=claripy.BVS('pass2',32)
pass3=claripy.BVS('pass3',32)
init_state.regs.eax=pass1
init_state.regs.ebx=pass2
init_state.regs.edx=pass3sm=p.factory.simulation_manager(init_state)
def is_good(state):return b'Good Job' in state.posix.dumps(1)
def is_bad(state):return b'Try again' in state.posix.dumps(1)sm.explore(find=is_good,avoid=is_bad)
if sm.found:found_state=sm.found[0]password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)password3=found_state.solver.eval(pass3)# input hex(not dos)print("Solution: {:x} {:x} {:x}".format(password1,password2,password3))
else:raise Exception("No Solution")

是要十六進制的輸入

04_angr

變量在堆棧中,需要先模擬堆棧

那個ebp是父ebp,保存完父函數ebp才開辟本函數棧空間,當函數執行完以后會有一個pop ebp恢復父函數ebp,但是因為我們要執行的代碼與父函數無關,只用執行到find的地方就可以了,不用返回父函數接著執行,所以保存不保存父函數ebp都無所謂

import angr
p=angr.Project('./dist/04_angr_symbolic_stack')
state_addr=0x08048697
init_state=p.factory.blank_state(addr=state_addr)# 布局堆棧
padding_size=8
init_state.stack_push(init_state.regs.ebp)
init_state.regs.ebp=init_state.regs.esp
init_state.regs.esp-=padding_size# 變量
pass1=init_state.solver.BVS('pass1',32)
pass2=init_state.solver.BVS('pass2',32)
init_state.stack_push(pass1)
init_state.stack_push(pass2)sm=p.factory.simgr(init_state)
#==sm=p.factory.simulation_manager(init_sate)
def is_good(state):return b'Good Job' in state.posix.dumps(1)
def is_bad(state):return b'Try again' in state.posix.dumps(1)sm.explore(find=is_good,avoid=is_bad)if sm.found:found_state=sm.found[0]password1=found_state.solver.eval(pass1)password2=found_state.solver.eval(pass2)print("Solution: {} {}".format(password1,password2))
else:raise Exception("Solution not find")

05_angr

變量寫在內存中

scanf('%8s',unk_404233)? 大小 8 個字節

import angr
p=angr.Project('./dist/05_angr_symbolic_memory')
state_addr=0x08048601
init_state=p.factory.blank_state(addr=state_addr)
p1=init_state.solver.BVS('p1',64)
p2=init_state.solver.BVS('p2',64)
p3=init_state.solver.BVS('p3',64)
p4=init_state.solver.BVS('p4',64)
p1_addr=0x0A1BA1C0
p2_addr=0x0A1BA1C8
p3_addr=0x0A1BA1D0
p4_addr=0x0A1BA1D8
init_state.memory.store(p1_addr,p1)
init_state.memory.store(p2_addr,p2)
init_state.memory.store(p3_addr,p3)
init_state.memory.store(p4_addr,p4)sm=p.factory.simgr(init_state)
def is_good(state):return b'Good Job' in state.posix.dumps(1)
def is_bad(state):return b'Try again' in state.posix.dumps(1)
sm.explore(find=is_good,avoid=is_bad)if sm.found:found_state=sm.found[0]pass1=found_state.solver.eval(p1,cast_to=bytes)pass2=found_state.solver.eval(p2,cast_to=bytes)pass3=found_state.solver.eval(p3,cast_to=bytes)pass4 = found_state.solver.eval(p4, cast_to=bytes)print("Solution: {} {} {} {}".format(pass1.decode('utf-8'),pass2.decode('utf-8'),pass3.decode('utf-8'),pass4.decode('utf-8')))print("Solution: {} {} {} {}".format(pass1,pass2,pass3,pass4))
else:raise Exception('no solution')
#Solution: NAXTHGNR JVSFTPWE LMGAUHWC XMDCPALU
#Solution: b'NAXTHGNR' b'JVSFTPWE' b'LMGAUHWC' b'XMDCPALU'

符號變量 p1 等被定義為 64 位比特向量。cast_to=bytes 可以將這些比特向量轉化為對應的字節表示。否則,默認情況下,eval 可能返回一個整數表示。?

06_angr

動調分配內存-->指定一塊內存給他用

import angr
p=angr.Project('./dist/06_angr_symbolic_dynamic_memory')
state_addr=0x08048699
init_state=p.factory.blank_state(addr=state_addr)
# open space
print('ESP:',init_state.regs.esp)
# 0x7fff0000 not started
buffer0=0x7fff0000-100
buffer1=0x7fff0000-200
# buffer==pointer
buffer0_addr=0x0ABCC8A4
buffer1_addr=0x0ABCC8AC
init_state.memory.store(buffer0_addr,buffer0,endness=p.arch.memory_endness)
init_state.memory.store(buffer1_addr,buffer1,endness=p.arch.memory_endness)
p1=init_state.solver.BVS('p1',64)
p2=init_state.solver.BVS('p2',64)
init_state.memory.store(buffer0,p1)
init_state.memory.store(buffer1,p2)sm=p.factory.simgr(init_state)
def is_good(state):return b'Good Job' in state.posix.dumps(1)
def is_bad(state):return b'Try again' in state.posix.dumps(1)
sm.explore(find=is_good,avoid=is_bad)
if sm.found:found_state=sm.found[0]pass1=found_state.solver.eval(p1,cast_to=bytes)pass2=found_state.solver.eval(p2,cast_to=bytes)print("Solution: {} {} ".format(pass1.decode('utf-8'),pass2.decode('utf-8')))
else:raise Exception('no solution')

那個endness 好像是端序問題

07_angr

有一個對文件讀取的操作,ignore應該是要avoid的,但不是好像

首先,文件名也可符號化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16985.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DataGrip軟件執行已將創建好的sql文件步驟

一、在需要導入sql文件上右擊找到SQLScript ,然后點擊 Run SQL Script 二、找到sql文件,點擊OK就可以了

Day01-01-git

Day01-01-git Content List0. 運維發展過程1. ci-cd-co基礎1.1 軟件的生命周期1)軟件的聲明周期:軟件從0-->1-->0過程2)ci/cd3)Devops4) 小結 1.2 什么是環境1.3 什么是代碼部署1.4 代碼發布方式 3. DevSecOpt之Git極速入門…

海外專線網絡的定義和發展

近年來,隨著全球經濟的快速增長和國際貿易的不斷擴展,海外專線網絡已經成為企業在國際交流和合作中不可或缺的工具。所謂海外專線網絡,是指一種連接國際網絡的專用線路,它能提供更穩定、更快速的網絡連接,確保用戶之間…

Unity UGUI實現無限滾動列表

Demo鏈接???https://download.csdn.net/download/qq_41973169/89364284http://Unity UGUI無限滾動列表 在游戲開發中,列表視圖是一個常見的UI組件。實現一個高效的列表視圖尤其重要,尤其是在需要展示大量數據時。本文將介紹如何在Unity中實現一個高效…

SRM系統在企業采購中的解決方案及系統供應商推薦

供應商關系管理系統(Supplier Relationship Management)是一種用于管理企業與供應商之間關系的軟件工具。企業通過SRM系統能夠優化采購流程、提高采購效率、減少成本,并增強與供應商的合作關系。本文將探討SRM系統能夠解決的企業采購問題&…

手動操作很麻煩?試試這個自動加好友神器吧!

你是不是也覺得手動逐一輸入號碼或是微信號,再搜索添加很麻煩?試試這個自動加好友神器——個微管理系統,幫助你省去繁瑣的手工操作,節省時間和精力。 首先,在系統上登錄微信號,無論你有多少個微信號&#…

組合慣導串口數據解析

首先是給串口usb以權限: sudo chmod 666 /dev/ttyUSB0但是不能每次啟動都執行一次,所以需要給一個永久的權限指令: sudo gedit /etc/udev/rules.d/70-ttyusb.rulesKERNEL“ttyUSB[0-9]*”, MODE“0666”然后就能讓ttyUSB0-ttyUSB9默認的權限…

2024/5/27 ARMday9SPI實驗八段數碼管顯示

main.c #include "spi.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); } //保存0-9編碼的數組 int num[10] {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6}; int main…

2024年上半年軟件設計師試題及答案(回憶版)--選擇題

基礎知識選擇題 基礎知識選擇題 1,2,3][4,5,6][1,2,3,4,5,6] &#xff08;總&#xff1a;1分&#xff09; &#xff08;注意&#xff1a;括號內的是截止當前題目總分&#xff09; vlan不能隔絕內外網 &#xff08;2分&#xff09; 鏈路層使用交換機&#xff0c;…

智慧樹下做游戲

游戲開發工程師致力于游戲總體設計 &#xff0c;負責游戲開發工具和運營維護工具的設計與開發 &#xff0c;并配合主程序完成游戲架構及各大功能的設計、開發、調試和其他技術支持 就業方向&#xff1a; 一般有客戶端游戲開發和服務器游戲開發 客戶端開發&#xff1a; 主要負…

光伏開發是用什么工具提高效率?

隨著全球對可再生能源的日益重視&#xff0c;光伏產業作為其中的佼佼者&#xff0c;已經取得了長足的發展。然而&#xff0c;如何提高光伏開發的效率&#xff0c;降低成本&#xff0c;成為了業內關注的焦點。本文將探討光伏開發過程中所使用的工具&#xff0c;以及這些工具如何…

【軟件設計師】——11.多媒體

目錄 11.1 多媒體種類和數據壓縮 11.2 音頻 11.3 圖像 11.4 視頻 11.1 多媒體種類和數據壓縮 多媒體種類 感覺媒體&#xff1a;人接觸信息的感覺形式&#xff0c;直接作用于人的感覺器官&#xff0c;使人產生直接感覺的媒體。如視覺、聽覺、觸覺、嗅覺、味覺等 顯示媒體/表…

設計軟件有哪些?建模和造型工具篇(2),渲染100邀請碼1a12

之前介紹了一批建模工具&#xff0c;這次我們繼續介紹。 1、Forest Pack Forest Pack是由iToo Software公司開發的3ds Max插件&#xff0c;專門用于創建大規模自然環境。它提供了豐富的植被和物體庫&#xff0c;用戶可以快速創建樹木、植物、巖石等元素&#xff0c;并將它們分…

STM32HAL(一)外設驅動框架與回調函數應用

前言&#xff1a;這段時間開始學習STM32F4&#xff0c;同時為了以后的便捷性性就開始學HAL庫了 目錄 HAL庫文件 基本文件結構 API命名規則 HAL庫回調函數 HAL_ XXX _MspInit() / _MspDeInit() HAL_PPP_MspInit() HAL_PPP_MspDeInit() HAL_PPP_ProcessCpltCallback HA…

剛上手Java會踩的坑

1. 用號比較的坑 對Integer類型的兩個參數使用號比較是否相等&#xff0c;或者使用String類型的兩個變量進行比較&#xff0c;天真的認為他們是理所應當的。 其實操作只適用于基本數據類型如int , byte, boolean, short, char, long, float, double這些基本數據類型。 其它…

instanceof 關鍵字的作用

instanceof 嚴格來說是 Java 中的一個雙目運算符&#xff0c;用來測試一個對象是否為一個類的實例&#xff0c;用法為&#xff1a; boolean result obj instanceof Class其中 obj 為一個對象&#xff0c;Class 表示一個類或者一個接口&#xff0c;當 obj 為 Class 的對象&…

JavaEE-JPA(相關概念及Spring JPA)

JPA JPA 相關概念 ORM 框架 (Object Relational Mapping) 建立 Java 程序實體類與數據庫表之間的映射關系。使用 ORM 框架進行編程 Java 程序會根據開發者配置&#xff0c;在運行時自動把數據對象持久化到數據庫中&#xff0c;比直接使用 JDBC 編程更為方便和強大。 常見的 …

Android面試題之Kotlin常見集合操作技巧

本文首發于公眾號“AntDream”&#xff0c;歡迎微信搜索“AntDream”或掃描文章底部二維碼關注&#xff0c;和我一起每天進步一點點 list 創建和修改 不可變list,listOf var list listOf("a","d","f") println(list.getOrElse(3){"Unkn…

Kubernetes可視化界面之DashBoard

1.1 DashBoard Kubernetes Dashboard 是 Kubernetes 集群的一個開箱即用的 Web UI&#xff0c;提供了一種圖形化的方式來管理和監視 Kubernetes 集群中的資源。它允許用戶直接在瀏覽器中執行許多常見的 Kubernetes 管理任務&#xff0c;如部署應用、監控應用狀態、執行故障排查…

用循環神經網絡預測股價

循環神經網絡可以用來對時間序列進行預測&#xff0c;之前我們在介紹循環神經網絡RNN,LSTM和GRU的時候都用到了正弦函數預測的例子&#xff0c;其實這個例子就是一個時間序列。而在眾多的時間序列例子中&#xff0c;最普遍的就是股價的預測了&#xff0c;股價序列是一種很明顯的…