安装

不会建议直接上docker 大是大了点,但是是相对很简单的事

官方文档翻译

angr Documentation
我们首先要了解angr的构造,开始第一步肯定是导入二进制程序

>>> import angr
>>> proj = angr.Project('/bin/true')

之后我们的操作都会基于这个proj对象,

基础属性

>>> import monkeyhex //将以十六进制格式化数值输出结果
>>> proj.arch //程序的
<Arch AMD64 (LE)>
>>> proj.entry //程序入口处
0x401670
>>> proj.filename //程序二进制地址
'/bin/true'

The loader 方法

从二进制文件转变为虚拟地址空间的表现形式的过程是十分复杂的。我们有一个名为CLE的模块来处理这个过程。CLE的结果,称为loader,可通过.loader属性来进行操控。


>>> proj.loader
<Loaded true, maps [0x400000:0x5004000]>
>>> proj.loader.shared_objects # may look a little different for you!
{'ld-linux-x86-64.so.2': <ELF Object ld-2.24.so, maps [0x2000000:0x2227167]>,
'libc.so.6': <ELF Object libc-2.24.so, maps [0x1000000:0x13c699f]>}
>>> proj.loader.min_addr
0x400000
>>> proj.loader.max_addr
0x5004000
>>> proj.loader.main_object # we've loaded several binaries into this project. Here's the main one!
<ELF Object true, maps [0x400000:0x60721f]>
>>> proj.loader.main_object.execstack # sample query: does this binary have an executable stack?
False
>>> proj.loader.main_object.pic # sample query: is this binary position-independent?

the factory

在angr中有非常多的类,它们中的大多数都需要project来进行实例化。为了不让你到处传递project,我们提供了project.factory,它有一些你会经常用到的对象的构造器。

本节还会介绍angr的几种基本概念,系好安全带!

blocks

首先,有一个project.factory.block()的构造器,它用来提取一个指定地址的代码基本块。一个重要的事实是,angr分析的代码是使用基本块作为单元相连的。该构造器返回一个Block对象,它可以告诉你一些关于代码块的有趣信息

>>> block = proj.factory.block(proj.entry) # 从程序入口点枚举一个基本块
<Block for 0x401670, 42 bytes>
>>> block.pp() # 打印反汇编形式
0x401670: xor ebp, ebp
0x401672: mov r9, rdx
0x401675: pop rsi
0x401676: mov rdx, rsp
0x401679: and rsp, 0xfffffffffffffff0
0x40167d: push rax
0x40167e: push rsp
0x40167f: lea r8, [rip + 0x2e2a]
0x401686: lea rcx, [rip + 0x2db3]
0x40168d: lea rdi, [rip - 0xd4]
0x401694: call qword ptr [rip + 0x205866]
>>> block.instructions # 指令数量
0xb
>>> block.instruction_addrs # 每条指令对应的地址
[0x401670, 0x401672, 0x401675, 0x401676, 0x401679, 0x40167d, 0x40167e, 0x40167f, 0x401686, 0x40168d, 0x401694]

states

另一个关于angr的事实是,Project对象仅仅代表程序的一个已初始化映像。当你要使用angr来进行执行时,你需要使用到一个表示模拟程序状态的特殊对象,SimState对象,我们现在就来获取一个

>>> state = proj.factory.entry_state()
<SimState @ 0x401670>


逆向  

Angr 程序自动化

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!