首页 > 其他分享 >angr初探

angr初探

时间:2023-02-22 18:56:35浏览次数:31  
标签:esp simgr factory project state angr 初探

前言

在搞fuzz的时候发现了一个比较难以解决的问题。例如if(*buf == "\xde\xad\xbe\xef"),我们如果想通过纯fuzz去进入这个if的分支,那么概率极其微小。这就使我不得不去尝试通过一些其他的方法去解决这个问题。于是我想到了一个比较出名符号执行的工具————angr。这篇文章记录笔者入门angr的过程。

环境安装

angr 的安装

angr的安装非常简便,通过pip即可,不过貌似angr因为会依赖很多其他的库,所以它的创作者推荐把他装在虚拟环境当中,不过笔者就直接装在虚拟机里了。

pip3 install angr

学习环境安装

我这里用的是github上的一个项目对angr进行入门学习。

git clone https://github.com/jakespringer/angr_ctf.git

angr 基本使用方法

angr.Project

这是我们分析一个二进制文件的第一步,就是创建一个angr.Project类,我们的后续操作都将基于这个类展开。并且我们可以通过所创建的project获取二进制文件的一些基本信息。如:project.arch可以获得这个二进制文件的架构,project.entry可以获得这个二进制文件的起始地址,proj.filename获得这个二进制文件的名字。

例如:

import sys
import angr

bin_path = "./00_angr_find"
project = angr.Project(bin_path)

print(project.arch)
print(hex(project.entry))
print(project.filename)

结果:

<Arch X86 (LE)>
0x80490b0
./00_angr_find

project.factory

project.factory为我们提供了一些实用的类的构造器

project.factory.block(address)

angr是以基本块为单位进行的分析,project.factory.block(address)可以获得给定地址所在的基本块.pp()可以获得该基本块的汇编代码。

例如:

block = project.factory.block(project.entry)
block.pp()

结果:

         _start:
80490b0  endbr32 
80490b4  xor     ebp, ebp
80490b6  pop     esi
80490b7  mov     ecx, esp
80490b9  and     esp, 0xfffffff0
80490bc  push    eax
80490bd  push    esp
80490be  push    edx
80490bf  call    0x80490e7
project.factory.entry_state()

project.factory.entry_state()用来获取一个程序的初始执行状态。

project.factory.blank_state(addr)

project.factory.blank_state(addr=...)用来获取一个程序从指定地址开始执行的空白状态。

state - 模拟执行状态

无论是project.factory.entry_state(),还是project.factory.blank_state(addr=...),都会返回一个模拟执行状态,我们可以把它存放到某个变量里,如存到state里。

state.regs

state.regs可以获取一些寄存器的值,如state.regs.esp即可获得esp的值。我们可以对其直接进行加减操作。

例如:

init_state = project.factory.entry_state()

print(init_state.regs.esp)
init_state.regs.esp-=12
print(init_state.regs.esp)

结果:

<BV32 0x7ffeffac>
<BV32 0x7ffeffa0>
state.memory

state.memory是访问内存接口的一种形式。state.memory.load(addr, size_in_bytes):获取该地址上指定大小的位向量。state.memory.store(addr, bitvector):将一个位向量存储到指定地址、

state.posix

state.posixPOSIX相关的环境接口,例如state.posix.dumps(fileno)获取对应文件描述符上的流。

simulation_manager - 模拟执行器

angr将一个状态的执行方法独立成一个SimulationManager类,有以下两种写法:

1、simgr = proj.factory.simgr(state)

2、simgr = proj.factory.simulation_manager(state)
simgr.step()

simgr.step():以基本块为单位的单步执行。

simgr.explore(find)

simgr.explore(find):路径探索,即执行到指定地址并进行约束求解,将执行完成的状态放在simgr.found列表中,若无法求解则该列表为空。

标签:esp,simgr,factory,project,state,angr,初探
From: https://www.cnblogs.com/pwnfeifei/p/17135984.html

相关文章

  • RabbitMQ初探
    RabbitMQ初探结合SpringAMQP,讨论RabbitMQ的几种消息模型RabbitMQTutorials工程结构├─consumer└─publisher父工程pom.xml<parent><groupId>org.springf......
  • 将古老的ASP项目转换为PHP初探
    ASP是一种服务器端脚本语言,主要用于开发动态Web应用程序。ASP可以在服务器上执行代码,并将结果返回给客户端浏览器,实现动态生成Web页面的功能。ASP代码通常包含在<%......
  • 应用部署初探:6个保障安全的最佳实践
    在之前的文章中,我们了解了应用部署的阶段以及常见的部署模式,包括微服务架构的应用应该如何部署等基本内容。本篇文章将介绍如何安全地部署应用程序。 安全是软件开发生......
  • 【笔记】Spherical Harmonic Lighting 球谐光照渲染初探
    SphericalHarmonicLighting球谐光照渲染初探漫反射环境光正常情况下,漫反射计算公式为:\[L(p,w_o)=\int_{\Omega}L(p,w_i)n\cdotw_idw_i\]也就是在半球空间\(\Om......
  • UiPath 初探
    工作上需要用UIPath,今天搭建一下环境。并运行一个HelloWorld。下载安装UIPath社区版,网址:https://www.uipath.com.cn/community-edition-download/启动UIPathS......
  • Unicorn 初探
    前言笔者由于对IOT比较感兴趣,故经常需要模拟一些IOT的固件,之前我习惯直接直接使用qemu对固件进行模拟。这几天由于任务需要接触了一下unicorn,一个轻量级,多平台,多架构......
  • 初探富文本之CRDT协同算法
    初探富文本之CRDT协同算法CRDT的英文全称是Conflict-freeReplicatedDataType,最初是由协同文本编辑和移动计算而发展的,现在还被用作在线聊天系统、音频分发平台等等。当......
  • 应用部署初探:微服务的3大部署模式
    在之前的文章中,我们已经充分了解了应用部署的4种常见模式(金丝雀部署、蓝绿部署、滚动部署及影子部署)。随着云原生技术逐步成熟,企业追求更为灵活和可扩展的系统,微服务架构大......
  • 应用部署初探:微服务的3大部署模式
    在之前的文章中,我们已经充分了解了应用部署的4种常见模式(金丝雀部署、蓝绿部署、滚动部署及影子部署)。随着云原生技术逐步成熟,企业追求更为灵活和可扩展的系统,微服务架构大......
  • 基于 Kubernetes 的企业级大数据平台,EMR on ACK 技术初探
    作者:容器服务团队云上大数据的Kubernetes技术路线当前,大数据与机器学习领域颇为关注存储与计算分离架构,逐渐向云原生演进。以Spark为例,云下或自有服务器可以选择Hado......