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=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的,但不是好像

首先,文件名也可符号化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/649814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中断处理过程介绍

概念 中断 中断源 分类 中断处理过程 中断请求 实现器件 中断判优 软件判优 过程 器件实现 程序实现 硬件判优 链路判优 器件实现 控制器判优 中断响应 中断服务 中断返回

RPA机器人流程自动化如何优化人力资源工作流程

人力资源部门在支持员工和改善整体工作环节方面扮演着至关重要的角色,但是在人资管理的日常工作中,充斥着大量基于规则的重复性任务,例如简历筛选、面试安排、员工数据管理、培训管理、绩效管理等,这些任务通常需要工作人员花费大…

以太坊钱包

以太坊钱包是你通往以太坊系统的门户。它拥有你的密钥,并且可以代表你创建和广播交易。选择一个以太坊钱包可能很困难,因为有很多不同功能和设计选择。有些更适合初学者,有些更适合专家。即使你现在选择一个你喜欢的,你可能会决定…

App Inventor 2 Encrypt.Security 安全性扩展:MD5哈希,SHA/AES/RSA/BASE64

这是关于App Inventor和Thunkable安全性的扩展,它提供MD5哈希,SHA1和SHA256哈希,AES加密/解密,RSA加密/解密,BASE64编码/解码方法。 权限 此扩展程序不需要任何权限。 事件 OnErrorOccured 抛出任何异常时将触发此事件…

【AN】制作二维机械专业的动画课件,播放、停止、显示和拖拽

下面代码实现了播放、停止、显示结构图,需要配合舞台的美术资源、元件动画来实现 stop(); Bt_play.addEventListener(MouseEvent.CLICK, playmc); function playmc(event:MouseEvent):void {MC_LINE01.play();MC_Jiantou.play();MC_xiexian.play();MC_LINE02.play()…

数据结构算法-堆(Heap)和优先队列

堆的概念 堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质: always greater than its child node/s and the key of the root node is the largest among all other nodes. This property…

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

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

super关键字的使用

就是说我们有个子类和父类。子类继承父类。父类的私有的都不能访问,其他的都能够通过super访问,那么, 那么查找怎么查找呢,分两种情况, 1 子类和父类的属性没重名 直接用属性如n1, 2子类和父类有重名的 用super(…

大事件项目实战

初始化 创建项目 新建api_server文件夹为项目根目录,并在项目中运行如下的命令,初始化管理配置文件: npm init -y 运行如下的命令,安装特定版本的express: npm i express4.17.1 在项目根目录中新建app.js作为整个项目的入口…

深入探索C++模板进阶:掌握非类型参数、特化技巧与分离编译的艺术

目录 非类型模板参数 类模板的特化 概念 函数模板特化 类模板特化 全特化 偏特化 类模板特化应用示例 模板的分离编译 分离编译概念 模板的分离编译 解决方法 模板总结 非类型模板参数 模板参数可分为类型形参和非类型形参。 类型形参: 出现在模板参数列表中&am…

韬光养晦的超绝项目

发展方向 竞技闯关类 可以加入对战系统积累积分,竞技类的接受程度更高,小孩(我和我身边大多数人小时候)都喜欢玩王者吃鸡这种经济类游戏,开放世界探索(本项目、一梦江湖、逆水寒)的受众群体年…

8. C++通过epoll+fork的方式实现高性能网络服务器

epollfork 实现高性能网络服务器 一般在服务器上,CPU是多核的,上述epoll实现方式只使用了其中的一个核,造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。 创建子进程函数–fork( ) 要了解线程我们先来了解…

Linux下Qt Creator无法输入中文(已解决)

1. 首先确保安装了搜狗输入法,且能正常运行。 2.克隆源码到本地。 git clone https://gitcode.com/fcitx/fcitx-qt5.git 3.检查Qt Creator版本,如下图所示,为基于Qt6的。 4. 进入源码目录,建立build文件夹,修改CMak…

COD20使命召唤20新赛季免费玩 COD20免费体验在哪下

使命召唤20(COD20)的免费周已经正式启动,这是一个为期一周的特别活动,为玩家们带来了前所未有的游戏体验。在这个特殊的周期里,多人模式和僵尸模式将向公众免费开放,玩家们可以尽情地探索和体验游戏的精彩内…

2022全国大学生数学建模竞赛ABC题(论文+代码)

文章目录 (1)2022A波浪能最大输出功率(2)2022B无人机定位(3)2022C古代玻璃制品成分分析(4)论文和代码链接 (1)2022A波浪能最大输出功率 (2&#x…

3D开发工具HOOPS在BIM系统中的应用

建筑信息模型是一种革命性的建筑设计、施工和管理方法。它通过创建和利用数字信息来优化建筑项目的设计、施工和运营过程。在这个过程中,3D开发工具HOOPS扮演着至关重要的角色,为BIM系统提供了强大的技术支持和丰富的功能。HOOPS中文网http://techsoft3d…

Linux如何在目录下灵活创建、浏览、删除百万个文件

文章目录 一、创建百万级小文件1、单核CPU情况2、多核CPU情况3、执行效率对比3.1、单核的顺序执行3.2、多核的并发执行 二、如何列出/浏览这些文件1、查看目录下文件的数量2、列出?3、ls -f(关闭排序功能)3.1、执行效率对比 4、通过重定向导入…

探索Python函数参数的奥秘

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、揭开函数参数的神秘面纱 1. 位置参数:按序传值的基石 2. 关键字参数&#…

作业-day-240527

Cday1思维导图 定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置 #include <iostream>using namespace std;namespace my_space {string s1"abc123";string recover(string s){int i0…

C语言基础——数组

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