freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Maat:一款功能强大的开源符号执行框架
2022-04-23 20:08:07
所属地 广西

关于Maat

Maat是一款功能强大的开源动态符号执行和二进制源码分析框架,在该工具的帮助下,广大研究人员可以轻松实现符号执行、污染分析、约束求解、二进制加载和环境模拟等操作,并利用Ghidra的sleigh库进行汇编操作。

工具特性

1、快速&便捷&灵活性:该工具能够轻松扩展至现实场景中的应用程序,基于纯C++开发,运行性能良好,运行时几乎不需要其他依赖组件。

2、用户友好:Maat提供了一个灵活性强的类似调试器的API,其功能可配置以适应许多不同的用例。和很多现代框架一样,该工具也支持嵌入Python库。

3、多架构支持:基于Ghidra的sleigh库实现了模拟功能,能够模拟多种架构的应用程序。

工具安装

我们可以使用下列命令来安装Maat的Python模块:

python3 -m pip install pymaat

Python API使用

from maat import *
# 针对Linux X86-32位平台创建一个符号引擎
engine = MaatEngine(ARCH.X86, OS.LINUX)
# 使用一个命令行参数加载代码
engine.load("./some_binary", BIN.ELF32, args=[engine.vars.new_symbolic_buffer("password", 20)])
# 获取当前eax值
engine.cpu.eax
# 读取栈顶的四个字节
engine.mem.read(engine.cpu.esp, 4)
# 设置一个回调来显示每一个读取的内存数据
def show_mem_access(engine):
    mem_access = engine.info.mem_access
    print(f"Inst at {engine.info.addr} reads {mem_access.size} bytes at {mem_access.addr}")
engine.hooks.add(EVENT.MEM_R, WHEN.BEFORE, callbacks=[show_mem_access])
# 获取并存储快照
snap = engine.take_snapshot()
engine.restore_snapshot(snap)
# 运行代码
engine.run()

C++ API使用

#include "maat.hpp"
using namespace maat;
using namespace maat::loader;
using namespace maat::event;
// 针对Linux X86-32位平台创建一个符号引擎
MaatEngine engine(Arch::Type::X86, env::OS::LINUX);
// 使用一个20个字符的符号命令行参数在偏移量0x08001000处加载代码
vector args{
    CmdlineArg(engine.vars->new_symbolic_buffer("some_arg", 20))
};
engine.load("./some_binary", Format::ELF32, 0x08001000, args, "", {}, {});
// 获取当前eax值
engine.cpu.ctx().get(X86::EAX);
// 读取栈顶的四个字节
engine.mem->read(engine.cpu.ctx().get(X86::ESP), 4)
// 设置一个回调来显示每一个读取的内存数据
Action show_mem_access(MaatEngine& engine)
{
    cout << *(engine->info.mem_access);
    return Action::CONTINUE;
}
engine.hooks.add(Event::MEM_R, When::BEFORE, EventCallback(show_mem_access))
// 获取并存储快照
auto snap = engine.take_snapshot()
engine.restore_snapshot(snap)
// 运行代码
maat.run()

工具使用样例

from maat import *
# 针对Linux X86-32位平台创建一个符号引擎
engine = MaatEngine(ARCH.X86, OS.LINUX)
# 使用一个命令行参数加载代码
engine.load("./some_binary", BIN.ELF32, args=[engine.vars.new_symbolic_buffer("some_arg", 20)])
# 获取当前eax值
engine.cpu.eax
# 读取栈顶的四个字节
engine.mem.read(engine.cpu.esp, 4)
# 设置一个回调来显示每一个读取的内存数据
def show_mem_access(engine):
    mem_access = engine.info.mem_access
    print(f"Instruction at {engine.info.addr} reads {mem_access.size} bytes at {mem_access.addr}")
engine.hooks.add(EVENT.MEM_R, WHEN.BEFORE, callbacks=[show_mem_access])
 # 获取并存储快照
snap = engine.take_snapshot()
engine.restore_snapshot(snap)
# 运行代码
engine.run()

许可证协议

本项目的开发与发布遵循LGPLv3开源许可证协议。

项目地址

Maat:GitHub传送门

参考资料

https://maat.re/

# 系统安全 # 符号执行
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录