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.mzph.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;股价序列是一种很明显的…