Buuctf - 网鼎杯青龙组2020signal 之angr库求解
程序全是switch-case
angr执行到返回地址,测试输入
angr中explore是个关键函数
参数:
find:目标地址或者多个目标地址列表。当执行到这些地址时,它们被认为是成功的状态。
avoid:要避免的地址或者地址列表。如果执行流程到达这些地址,则认为是失败的状态。
start:开始探索的地址。如果不指定,则从项目入口点开始
他可能的参数包括限制探索深度、初始状态配置等。
返回值:通常是一个 SimulationManager 对象,其中包含找到了多少符合 find 或 avoid 条件的状态信息。
# -*- coding: utf-8 -*-
import angr
project = angr.Project("signal.exe") #创建项目,加载二进制文件
state = project.factory.entry_state() #创建state
sm = project.factory.simulation_manager()
sm = sm.explore(find = 0x0040175F,avoid = 0x004016e6)
if sm.found:
final_state = sm.found[0]
print(final_state.posix.dumps(0))
代码原理可以找上一篇博客
贴一篇别人的代码
import angr
project = angr.Project('signal.exe') #创建项目,加载二进制文件
state = project.factory.entry_state() #创建state
sim = project.factory.simgr(state) #创建sim
sim.explore(find=0x40175e,avoid=0x4016e6) # 希望到达的和避免的分支
if sim.found:
res = sim.found[0]
res = res.posix.dumps(0)
print("[+] Success! Solution is: {}".format(res.decode("utf-8")))
写好之后将signal.exe和.py放在同一个文件夹下导入Linux运行
结果:
安装angr
最好在虚拟环境里
# 安装 virtualenv(如果尚未安装)
pip install virtualenv
# 创建虚拟环境
virtualenv myenv
# 激活虚拟环境
# 对于 Linux/macOS:
source myenv/bin/activate
# 对于 Windows:
myenv\Scripts\activate
执行python文件
python +文件名(后缀是.py)

得到flag

浙公网安备 33010602011771号