angr使用学习(持续更新)

news2024/9/21 18:56:37

首先我是直接在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=pass3

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]
    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.coloradmin.cn/o/1702422.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重生之 SpringBoot3 入门保姆级学习(06、属性绑定)

重生之 SpringBoot3 入门保姆级学习(06、属性绑定) 2.3.1 使用 ConfigurationProperties2.3.2 使用 EnableConfigurationProperties 2.3.1 使用 ConfigurationProperties application.properties 文件书写相关配置 pig.id1 pig.name王萍 pig.age21方法一…

Sping源码(九)—— Bean的初始化(非懒加载)— ConversionService

序言 经过前面一系列的加载、解析等准备工作,此刻refresh方法的执行已经来到了尾声,接下来我们用几篇文章着重的介绍一下Bean的初始化 代码 着重看refresh()主流程中的finishBeanFactoryInitialization()方法。 finishBeanFactoryInitialization 方法…

python深入探索斐波那契数列:代码示例与不满足的外围条件

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、斐波那契数列的初步实现 二、外围条件的不满足情况 总结 一、斐波那契数列的初步实现 …

二叉树——堆的实现

一.前言 前面我们讲解了二叉树的概念以及二叉树的存储结构:https://blog.csdn.net/yiqingaa/article/details/139224974?spm1001.2014.3001.5502 今天我们主要讲讲二叉树的存储结构,以及堆的实现。 二.正文 1.二叉树的顺序结构及实现 1.1二叉树的顺序…

五款屏幕监控软件测评,哪一款屏幕监控软件适合企业

市场上有多款屏幕监控软件,其中一些因其实用的功能、良好的用户体验和广泛的用户基础而获得了较高的市场占有率和口碑。以下几款是较为受欢迎且功能全面的屏幕监控软件: 1、安企神软件: 领取7天试用版:https://work.weixin.qq.co…

【NumPy】关于numpy.sort()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

一致 VS 正确

“代码命名时,一致大于正确” 本文适合以下小伙伴阅读: 经常会有疑惑:这谁的单词拼错了,我之后要将错就错吗?时常感觉到:项目中的命名好乱啊,明明是一个东西怎么一堆不同的名字 好了&#xf…

企业选择定制化MES管理系统时需要考虑的核心功能

在当今制造业的数字化转型浪潮中,企业对于实现生产现场透明管理的需求愈发迫切。为了满足这一需求,MES管理系统成为了众多企业的首选解决方案。MES管理系统以其高度的灵活性和可定制性,能够根据不同行业的特性,为企业提供量身定制…

告别繁琐!Xinstall助你轻松实现APP地推结算,提升推广效率

随着移动互联网的迅猛发展,APP市场竞争日益激烈。面对线上推广转化率下降、成本上升的挑战,越来越多的APP厂商开始尝试线下地推这一更为直接、有效的推广方式。然而,地推结算过程中的种种问题却让许多企业头痛不已。今天,我们将为…

信息化项目必须进行验收测试吗?软件测试公司验收测试流程分享

信息化项目验收是指在软件开发完成之后,对其进行独立检查和确认,以确定它是否达到了预期的质量和功能需求。在进行验收之前,必须进行验收测试,这是非常重要的一步。 为什么要进行验收测试呢?好处可不少哦!…

【uniapp】CSS实现多行文本展开收起的文字环绕效果

1. 效果图 收起状态 展开状态 2. 代码实现 <view class"word-wrap" id"descriptionTxt"><view class"fold-text" v-if"isFold"><text class"fold-btn" click"changFold">全文</text&g…

人工智能应用层岗位—AI项目经理/AI产品经理

AI是一门技术&#xff0c;最终落实成产品才能具备商业价值 应用层&#xff0c;就是面向特定应用场景&#xff0c;形成人工智能软硬件产品或解决方案。主要包括行业AI解决方案和热门产品&#xff0c;如自动驾驶、机器人、智能家居、可穿戴的智能设备等 相应的&#xff0c;就会…

猫狗分类识别模型建立①数据标记

一、labelImg库说明 LabelImg是一款非常流行的图像标注工具&#xff0c;广泛用于机器学习和计算机视觉领域。以下是关于LabelImg的详细介绍&#xff1a; 主要功能和特点 1.图像标注 允许用户在图像中标注物体&#xff0c;选择特定区域&#xff0c;并为这些区域添加标签或类…

C语言基础——数组

{\▁/} ( / 。\ ) / ⊃&#x1f494;\⊃ 为什么我那么努力还是得不到那么多赞 ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言…

Linux基础知识点总结!超详细

Linux 的学习对于一个IT工程师的重要性是不言而喻的&#xff0c;学好它是工程师必备修养之一。 Linux 基础 操作系统 操作系统Operating System简称OS&#xff0c;是软件的一部分&#xff0c;它是硬件基础上的第一层软件&#xff0c;是硬件和其它软件沟通的桥梁。 操作系统…

部署Prometheus + Grafana实现监控数据指标

1.1 Prometheus安装部署 Prometheus监控服务 主机名IP地址系统配置作用Prometheus192.168.110.27/24CentOS 7.94颗CPU 8G内存 100G硬盘Prometheus服务器grafana192.168.110.28/24CentOS 7.94颗CPU 8G内存 100G硬盘grafana服务器 监控机器 主机名IP地址系统配置k8s-master-0…

链接预测.

在某些场景中&#xff0c;用户可能希望预测给定节点之间是否存在边&#xff0c;这样的任务称作链接预测任务。 假设输入结点之间是全链接图&#xff0c;连接预测的目的是给边打上标签。 挑战 最简单的是用图的邻接矩阵来表示结点之间的边&#xff0c;但当节点数量多的时候&am…

【C++】从零开始map与set的封装

送给大家一句话&#xff1a; 今日的事情&#xff0c;尽心、尽意、尽力去做了&#xff0c;无论成绩如何&#xff0c;都应该高高兴兴地上床恬睡。 – 三毛 《亲爱的三毛》 &#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x1f303;&#x…

自适应容积卡尔曼滤波|(自适应CKF)的MATLAB源代码

介绍 容积卡尔曼滤波在理论上拥有比UKF更高的精度和稳定性&#xff0c;本自适应算法通过对观测残差的计算&#xff0c;在观测协方差R不准确或无法获得时&#xff0c;对R进行调节&#xff0c;以起到降低估计误差的作用。 模型 使用的是三维的非线性模型&#xff0c;经过适当修…

Hunyuan-DiT环境搭建推理测试

引子 最近鹅厂竟然开源了一个多模态的大模型&#xff0c;之前分享福报厂的多模态视觉大模型&#xff08;Qwen-VL环境搭建&推理测试-CSDN博客&#xff09;感兴趣的可以移步。鹅厂开源的&#xff0c;我还是头一回部署。好的&#xff0c;那就让我们看看这个多模态视觉大模型有…