原文链接:https://github.com/avatartwo/avatar2/blob/master/handbook/0x02_targets.md
Targets
Avatar需要的第一个信息是分析工作需要的一个目标集。
from avatar2 import *
avatar = Avatar()
qemu = avatar.add_target(QemuTarget, name='qemu1')
这使一个Qemu目标对象实例化并给其一个助记名'qemu1',从现在开始我们可以使用变量qemu与该目标交互,或通过指定名字让Avatar在其上工作。
>>> from avatar2 import *
>>> avatar = Avatar()
>>> qemu = avatar.add_target(QemuTarget, name='qemu1')
>>> avatar.targets['qemu1'] == qemu
True
如果我们没有指定一个名字,其将被自动生成,可以利用target.name来读取
>>> from avatar2 import *
>>> avatar = Avatar()
>>> qemu = avatar.add_target(QemuTarget)
>>> qemu.name
'QemuTarget0'
需要记住的一点是,虽然一个目标可以在被创建后配置,但这必须在调用目标的init()方法之前进行.
from avatar2 import *
avatar = Avatar()
# 添加qemu并指定其gdbserver监听1234端口
qemu = avatar.add_target(QemuTarget, gdb_port=1234)
# 做其他事,诸如初始化内存范围等等
[...]
# 有效:改变gdbserver监听端口到2234
qemu.gdb_port = 2234
# 这将初始化qemu target
qemu.init()
# 无效:qemu和其gdbserver已经生成,这里改变gdb端口不会有效
qemu.gdb_port = 3234
总结一下,定义一个目标一开始看起来比较简单,但是恶魔总藏在细节之中:由于支持多种不同的目标,每个目标都接受自己的目标特定参数集合。所以,让我们看看目前Avatar²支持的不同targets,以及他们接受的参数。
GDBTarget
这可能是最直观的目标之一:它将简单连接到一个存在的gdb实例,通过TCP或基于串行参数的串行连接。因此,该gdbserver是在一个远程物理目标上运行或只是在Avatar²的主机系统上本地生成的并不重要。为了灵活的配置,可以在添加一个GDB目标时添加以下参数:
name | type | default | purpose |
---|---|---|---|
gdb_executable | str | 'gdb' | 将使用的可执行gdb的路径 |
gdb_additional_args | [str] | [] | c传递给gdb的额外参数列表 |
gdb_port | int | 3333 | gdbserver连接到监听的端口 |
serial | bool | False | 通过串行还是TCP连接到gdbserver,允许使用gdb_serial参数 |
gdb_serial_device | str | '/dev/ttyACM0' | 我们想要连接的串行设备 |
gdb_serial_baudrate | int | 38400 | 串传输速率 |
gdb_serial_parity | str | 'none' | 串行奇偶校验设置 |
OpenOCDTarget
OpenOCDTarget的目的是通过使用openocd获取JTAG从而连接到物理目标。当一个 Avatar²主机可以控制openocd,随后,它的目标使用到gdbserver的连接或到openocd的接口,后面的参数可以被OpenOCDTarget指定:
name | type | default | purpose |
---|---|---|---|
openocd_script | str | None | 强制路径到openocd脚本。该脚本通常控制实际的JTAG连接 |
additional_args | [str] | [] | 传给openocd的额外参数列表 |
telnet_port | int | 4444 | openocd telnet服务端口 |
gdb_executable | str | 'gdb' | 将使用的可执行gdb路径 |
gdb_additional_args | [str] | [] | 传给gdb的额外参数列表 |
gdb_port | int | 3333 | gdbserver被连接到监听的端口 |
QemuTarget
Qemu是一个全系统仿真器,为了avatar²它已经进行了修改,以允许仿真系统的完整的自由(硬件)配置,并允许将内存从Qemu内部传输到其他目标。由于这些都是非常有效的更改,qemutarget有几个不同的配置选项。
name | type | default | purpose |
---|---|---|---|
executable | str | 'qemu-system-' | 将使用的qemu可执行文件的路径,不需要体系结构的后缀。 架构后缀被阿凡达自动检测到。 |
additional_args | [str] | [] | 传给qemu的额外参数列表 |
cpu_model | str | None | qemu使用的一个特殊cpu模式 |
firmware | str | None | qemu使用的一个kernel或类kernel固件的(可选)路径 |
qmp_port | int | 3334 | qemu模拟器协议端口 |
entry_address | int | 0 | 第一条执行指令地址 |
gdb_executable | str | 'gdb' | 将使用的可执行gdb路径 |
gdb_additional_args | [str] | [] | 传给gdb的额外参数列表 |
gdb_port | int | 3333 | gdbserver被连接到监听的端口 |
PandaTarget
PANDA是一个动态二进制分析平台,具有许多有用的特性,包括对一次执行的记录与重放, 一个在执行与重放时用于多种类分析任务的插件系统。由于PANDA自身基于qemu,avatar²的 PandaTarget直接从QemuTarget继承并接受了它所有的参数。然而,与上面描述的目标相比,它有各种各样的特定目标方法来在执行阶段驱动PANDA。
method-name | arguments | purpose |
---|---|---|
begin_record | record_name | 要求PANDA开始记录执行 |
end_record | - | 要求PANDA结束正在进行的记录 |
begin_replay | replay_name | 重放记录的执行 |
end_replay | - | 结束正在执行的重放 |
load_plugin | plugin_name, plugin_args, file_name | 用特定的参数加载一个 PANDA插件 |
unload_plugin | plugin_name | 根据特定名称卸载插件 |
list_plugins | - | 列出已经加载的PANDA插件 |
For more information about these function, we suggest to have a look at our autodoc.