angr使用指南

1.angr环境配置

1.windows环境

1.建议挂梯子(不然慢的很,可有可能没法配置)

2.终端依次执行下面的指令

pip install pyvex
pip install unicorn
pip install simuvex
pip install angr

3.import angr验证

C:\Users\26612>python
Python 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:18:16) [MSC v.1928 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import angr

2.kali环境

1.配置最新的virtualenvwrapper(否则可能不支持报错)

pip install virtualenvwrapper==4.0

2.配置环境变量

export WORKON_HOME=$HOME/Python-workhome

3.启动环境virtualenvwrapper.sh脚本(确保已经安装)

source /usr/local/bin/virtualenvwrapper.sh
1.这里寻找这个脚本可以以下指令(均可以)
find / -name virtualenvwrapper.sh 2>/dev/null
locate virtualenvwrapper.sh
2.如果没有配置好,这使用以下指令安装
sudo apt-get update
sudo apt-get install virtualenvwrapper
3.安装后配置环境
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

4.创建虚拟环境

mkvirtualenv angr

5.进入虚拟环境后安装angr

建议proxychains挂梯子安装

pip install angr

2.用法简析

1.anger find

import angr
import sys
def main(argv): #定义主函数
path_to_binary = '/home/yuan/ctf/angr/angr0/00_angr_find' #被执行文件路径
project = angr.Project('/home/yuan/ctf/angr/angr0/00_angr_find')#以被执行文件路径创建项目

initial_state = project.factory.entry_state() #通过entry_state()创建一个默认初始状态,这个状态是为了告诉
#angr该从哪里开始,此处为main()

simulation = project.factory.simgr(initial_state) #以该状态创建一个模拟管理器,这个模拟管理器里有许多工
#具可以帮助搜索和执行二进制文件
#或者simulation = project.factory.simulation_manager(initial_state),二者没有区别,只是前者更加方便写代码。。。

print_good_address = 0x0804867D #希望得到的输出的虚拟地址

simulation.explore(find=print_good_address) #开始执行直到到达希望的解决方案或者探索完所有的可能的路径
#simulation.explore()方法将会建立一个名为simulation.found
#状态列表来表示可以找到我们所希望的输出。如过没有找到,则
#该列表会被置为false,反之为true
if simulation.found: #检查是否发现了解决方案
solution_state = simulation.found[0]
print(solution_state.posix.dumps(sys.stdin.fileno())) #打印出angr执行到这个状态时的输入,也就是我们所希望的flag

else:
raise Exception('Cannot find')

if __name__ == '__main__':
main(sys.argv)

2.angr avoid

import angr
import sys

def main(argv):
p = angr.Project('/home/yuan/ctf/angr/angr1/01_angr_avoid')
initial_state = p.factory.entry_state()
sm = p.factory.simgr(initial_state)

good_addr = 0x080485e5 #因为一般来讲一个二进制文件执行时是不会只有一个分支语句的
#所以为了节省时间和对计算资源的浪费,需要添加约束来避免对一些无用语句的执行
bad_addr = 0x080485f2 #此处即为输出为“Try again”的地址

sm.explore(find=good_addr, avoid=bad_addr) #avoid就是.explore()里的第二个参数,也就是不想要执行到这里

if sm.found:
flag = sm.found[0]
print(flag.posix.dumps(sys.stdin.fileno()))
else:
raise Exception('Cannot find')
if __name__ == '__main__':
main(sys.argv)

3.angr find condition (常用一些)

import angr

# 加载要分析的程序
p = angr.Project('/home/yuan/ctf/angr/angr2/02_angr_find_condition')

# 创建程序的初始状态,并指定初始输入
initial_input = b'A' * 20 # 为示例简单起见,这里假设初始输入是20个字符 'A'
state = p.factory.entry_state(args=[initial_input])

# 创建符号执行管理器
sm = p.factory.simulation_manager(state)

# 定义函数,用于检查是否得到期望的输出
def good(state):
return b'Good Job.' in state.posix.dumps(1) #希望得到的输出

# 定义函数,用于检查是否避免不希望的输出
def bad(state):
return b'Try again.' in state.posix.dumps(1) #不希望得到的输出

# 开始符号执行,寻找满足条件的路径,并避免不希望的路径
sm.explore(find=good, avoid=bad)

if sm.found:
find_state = sm.found[0]
flag = find_state.posix.dumps(0)
print(str(flag, 'utf-8'))
else:
print("NO!!!!!!!!")
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇