Angr介绍

  • angr 来源于CGC项目,最初用于自动攻防。
  • 平台无关(platform-agnostic)的二进制分析框架
  • ( Computer Security Lab ) UCSB,Shellphish

Angr可以干什么?

  • Disassembly and intermediate-representation lifting
  • Program instrumentation(程序检测)
  • 符号执行
  • Control-flow analysis/控制流分析
  • Data-dependency analysis
  • Value-set analysis (VSA)
  • 使用angrop自动构建ROP链
  • 使用patcherex自动进行二进制强化
  • 使用rex自动生成漏洞利用程序(用于DECREE和简单的Linux二进制程序)
  • 使用angr-management(一个angr的GUI)来分析二进制程序

符号执行

  • 在执行程序时用符号代替真实值。符号执行的优点在于,当使用真实值执行程序路径只有一条,而使用符号执行时,由于符号可变,我们可以利用这一特性,尽可能将程序的每一条路径遍历,这样的话,必定存在至少一条路径遍历的正确路径,每一个结果都可以表示为一个离散关系式,使用约束求解引擎即可分析出正确结果

Angr接口

加载

angr.Project(‘filename’)

属性 , CPU架构, 文件名 , 入口地址

proj.arch

proj.entry

proj.filename

加载器 Loader

可以通过loader来查看二进制文件加载的共享库,以及执行对加载地址空间相关的基本查询。

proj.loader

proj.loader.shared_objects

proj.loader.min_addr

proj.loader.max_addr

proj.loader.main_object 加载了多个二进制程序,这是主对象

proj.loader.main_object.execstack # 查询主对象是否开启了NX

工厂对象(Factory)

1.Blocks

block =proj.factory.block(proj.entry) # 从程序的入口处提取一个代码块

block.pp() ``# 打印反汇编代码

以下举例为angr_ctf的题目

00_angr_find

使用Angr

ipython

import angr

p= angr.Project(“./00_angr_find”) # 建立项目

init_state = p.factory.entry_state() # 初始化

sm = p.factory.simulation_manager(init_state) #

sm.explore(find=0x08048678) # 该地址为跳转字符串的地址

found_state = sm.found[0]

found_state.posix.dumps(0) #找到对应的输入

01

import angr
import sys
name = sys.argv[1]
p=angr.Project(name,auto_load_libs=False)

state=p.factory.entry_state()
#state=p.factory.blank_state() #no-initalize
#state=p.factory.full_init__state() #full-initalize
sm = p.factory.simulation_manager(state)

# simgr=p.factory.simgr(state)

Find = 0x80485E0
Avoid = 0x80485EF

res=sm.explore(find=Find,avoid=Avoid)
print (res.found[0].posix.dumps(0))
#HUJOZMYS

02

import angr
import sys

def main(argv):
bin_path = argv[1]
p = angr.Project(bin_path)
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("Solation {}".format(found_state.posix.dumps(0)))
if __name__ == '__main__':
main(sys.argv)
~
import angr
import claripy

p=angr.Project('./attachment',load_options={"auto_load_libs": False})
f=p.factory
state = f.entry_state(addr=0x400605)#设置state开始运行时的地址
flag = claripy.BVS('flag',8*32)#要求的内容有32个,用BVS转成二进制给flag变量
state.memory.store(0x603055+0x300+5,flag)#因为程序没有输入,所以直接把字符串设置到内存
state.regs.rdx=0x603055+0x300
state.regs.rdi=0x603055+0x300+5#然后设置两个寄存器

sm = p.factory.simulation_manager(state)#准备从state开始遍历路径

print("ready")

sm.explore(find=0x401DAE)#遍历到成功的地址

if sm.found:
print("sucess")
x=sm.found[0].solver.eval(flag,cast_to=bytes)
print(x)
else:
print('error')

source /usr/share/virtualenvwrapper/virtualenvwrapper.sh

workon angr

deactivate

参考链接