angr学习-入门篇

本文是一篇关于angr使用的入门教程,涵盖了从安装到深入使用angr的多个方面,包括angr_find、angr_avoid、symbolic_registers等核心概念,并通过实例解析了如何设置条件、处理动态内存分配和文件操作。文章还提到了状态爆炸问题及angr中的缓解机制。
摘要由CSDN通过智能技术生成

前言:

资源链接:GitHub - jakespringer/angr_ctf(题库仓库,里面有个讲解angr的PPT,里面有官方的题解很详细) GitHub - Hustcw/Angr_Tutorial_For_CTF: angr tutorial for ctf

安装:

关于angr的安装:官方提供了很多安装教程方式 这里用的是Anaconda来安装python然后安装angr https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2022.10-Linux-x86_64.sh 去这里下载安装文件,不建议用wget下载,很慢很慢。 然后:

bash Anaconda3-2022.10-Linux-x86_64.sh
回车后查看许可证,按 q 退出许可证,然后输入 yes 表示同意
确认安装的路径,一般直接回车安装在默认的 /home/你的名字/anaconda
很快就安装完毕。输入 yes 来确认使用 conda init 来启动
source ~/.bashrc   //修改环境变量
然后就可以命令行输入conda直接来使用了

image.png

conda的常用命令:

conda create -n  name  python=版本号 //name 为要创建的环境名
conda activate name   //进入环境
conda deactivate    //退出环境
conda info 
conda info -e   //查看已经创建的环境

然后创建环境:

image.png

进入环境安装angr:

image.png

安装成功测试:

image.png

正文:

官方文档:Core Concepts - angr documentation 翻译版本:angr学习(2):基本命令 · 语雀 SymbolicExecution.pptx 常用命令:

import angr
import claripy
proj = angr.Project('./file_name')   //load the binary file
​
​
proj.arch   //arch of the binary file
​
proj.entry  // the entry of the binary file
​
state = proj.factory.entry_state()   //to create the state 
​
start_addr = 0xdeadbeef
state = proj.factory.blank_state(addr=start_addr) 
// to create a blank stateand we set the regs
​
parameter_1 = claripy.BVS("p1",32)
​
state.regs.eax = parameter_1
​
​
simgr = proj.factory.simulation_manger(state)  //to create the simulation  
​
simgr.explore(find=???,avoid=???)
solution = simgr.found[0]
print(solution.posix.dumps(0))  // '0' represents standard output
​
​
solution = state.solver.eval(parameter_1)
print("Solution:",hex(solution))
​
​

00_angr_find

image.png

image.png

image.png

import angr
​
​
def exp():
   proj = angr.Project('./00_angr_find')
   state = proj.factory.entry_state()
   simgr = proj.factory.simulation_manager(state)
   simgr.explore(find=0x08048678)
   if simgr.found:
      solution = simgr.found[0]
      print("solution:",solution.posix.dumps(0))
   else:
      print("Not found")
if __name__ == "__main__":
   exp()  

image.png

image.png

01_angr_avoid

image.png

由于一些原因F5反编译main函数有点麻烦,修改IDA设置可以解决,但是本题影响不大

image.png

整个函数逻辑流程和00_angr_find一样,只不过加入了个分支avoid_me,倘若angr的explore中不加avoid参数,应该也能跑出来,只不过加了后直接会跳过那个avoid_me的分支,加快速度。

image.png

import angr
​
def exp():
   proj = angr.Project('./01_angr_avoid')
   state = proj.factory.entry_state()
   simgr = proj.factory.simulation_manager(state)
   simgr.explore(find=0x080485E0,avoid=0x080485A8)
   if simgr.found[0]:
      solution = simgr.found[0]
      print("solution:",solution.posix.dumps(0))
   else:
      print("Not found")
if __name__ == "__main__":
  exp()

image.png

02_angr_find_condition

image.png

image.png

看这里没啥区别,但是:

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值