请问有哪些符号执行工具是支持 sparc 的?
我在尝试过 angr 之后发现其对 sparc 的支持性并不很好.
如果有使用 angr 成功对 sparc 下的程序进行符号执行的,请教下是如何做到的?
如果angr真的不可行,有其他的工具可用吗?
3条回答 默认 最新
- 阿里嘎多学长 2024-06-05 07:48关注解决 无用评论 打赏 举报 编辑记录
关注
让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
针对问题:“请问有哪些符号执行工具是支持 sparc 的?”,回答如下: 支持 SPARC 架构的符号执行工具有以下几个:- KLEE:KLEE 是一个开源的符号执行器,它支持多种指令集架构,包括 SPARC。可以通过在源代码中插入符号变量、断言和路径约束来进行符号执行。KLEE 支持基于 LLVM 的 IR,因此可以处理大多数 C/C++ 代码。
- Triton:Triton 是一个动态二进制分析框架,它支持多种 CPU 架构,包括 SPARC。它具有很强的动态符号执行功能,可以在运行时生成符号路径,支持指令级符号执行、内存符号执行等。Triton 还提供了反汇编和编译引擎,可以将汇编代码转换成机器码和 IR。
- Manticore:Manticore 是一个针对二进制程序的模糊测试工具,它支持多种 CPU 架构,包括 SPARC。它采用混合符号执行和模拟执行的方法,可以生成符号执行路径和反汇编代码,还可以自动生成测试用例。Manticore 可以处理不规则和复杂的程序,例如 CTF 比赛中的二进制挑战。 针对问题:“如果有使用 angr 成功对 sparc 下的程序进行符号执行的,请教下是如何做到的?”,回答如下: 根据 angr 官方文档的说明,angr 对 SPARC 架构的支持并不完善,并且只支持早期的 SPARC v7 和 v8 指令集。如果需要在 SPARC 架构上使用 angr 进行符号执行,首先需要确保目标程序可以正确地加载和解析,这通常需要使用一个适当的加载器。然后,需要手动编写一个符号执行路径来探索目标程序的不同分支和条件语句。由于 angr 没有针对 SPARC 的 IDA 插件或反汇编器,因此通常需要手动编写反汇编代码。 以下是一个简单的使用 angr 对 SPARC 程序进行符号执行的示例代码:
import angr # 加载 SPARC 程序 proj = angr.Project('/path/to/program', load_options={'auto_load_libs': False}) # 创建符号状态,并设置输入数据为符号变量 state = proj.factory.entry_state(args=['input']) input_data = state.solver.BVS('input_data', 64) state.memory.store(0x1000, input_data) # 执行符号执行,指定目标分支 pg = proj.factory.path_group(state) pg.explore(find=0x1234, avoid=0x5678) # 获取符号执行路径 path = pg.found[0] print(path.state.solver.eval(input_data)) # 打印输入数据 print(path.state.solver.constraints) # 打印路径约束
需要注意的是,由于 angr 对 SPARC 的支持性较差,上述代码仅作为示例参考,具体实现可能会遇到各种问题。 针对问题:“如果 angr 真的不可行,有其他的工具可用吗?”,回答如下: 除了上述提到的符号执行工具外,还有一些其他的支持 SPARC 的二进制分析工具和虚拟化工具,例如 GDB、QEMU 和 Simics 等。这些工具可以通过动态分析、污点分析、模拟执行等技术来进行程序分析和漏洞挖掘。 其中,QEMU 是一个开源的虚拟化工具,可以模拟多种 CPU 架构,包括 SPARC。可以使用 QEMU 命令行界面或 python API 来对 SPARC 程序进行动态分析和符号执行。QEMU 还支持 GDB 协议,可以在 GDB 中连接到 QEMU 进行调试和分析。以下是一个使用 QEMU 和 Keystone 对 SPARC 程序进行符号执行的示例代码:
from unicorn import * from unicorn.sparc_const import * from keystone import * def qemu_sparc(symbolic_data): # 准备输入数据 CODE = b'\x01\x00\x20\x40\x81\xc3\xe0\x08' # trap DATA = bytes(symbolic_data) # 初始化 Unicorn 引擎 mu = Uc(UC_ARCH_SPARC, UC_MODE_BIG_ENDIAN) mu.mem_map(0x1000, 0x1000) mu.mem_write(0x1000, CODE) mu.mem_map(0x2000, 0x1000) mu.mem_write(0x2000, DATA) # 初始化 Keystone 引擎 ks = Ks(KS_ARCH_SPARC, KS_MODE_BIG_ENDIAN) # 获取输入数据地址 reg_name = 'g5' reg_value = 0x2000 # 注入符号变量 for i in range(8): reg_name = 'o%d' % i mu.reg_write(eval('UC_SPARC_REG_' + reg_name.upper()), reg_value + i * 8) # 模拟执行 mu.hook_add(UC_HOOK_MEM_READ | UC_HOOK_MEM_WRITE, hook_mem_access) mu.hook_add(UC_HOOK_CODE, hook_code) mu.emu_start(0x1000, 0x1008) # 执行符号执行 qemu_sparc('a' * 64)
需要注意的是,QEMU 对 SPARC 的支持在某些情况下可能不完整或不稳定,不能保证符号执行的正确性和有效性。因此,在选择工具和方法时,需要根据具体情况综合考虑。
解决 无用评论 打赏 举报关注
引自免费微信小程序:皆我百晓生
在符号执行领域,尽管Angr是一个非常强大的二进制分析框架,它最初设计时主要针对x86和ARM架构。对于SPARC架构的支持确实不如前两者成熟。但是,这并不意味着没有其他选项。
一种可能的替代方案是采用QEMU,它可以作为一个动态二进制翻译器(Dynamic Binary Translator, DBT),同时也可以作为模拟器运行在不同的CPU架构上,包括SPARC。结合一个符号执行引擎,例如KLEE或SeaHorn,可以实现对SPARC架构的符号执行。
以下是使用QEMU和KLEE的一个简化的步骤概述:
-
安装依赖:
- QEMU:
sudo apt-get install qemu
- KLEE: 可以从源码编译,参考官方文档:https://klee.github.io/installation.html
- QEMU:
-
准备SPARC可执行文件: 首先,你需要一个SPARC架构的C语言编译好的可执行文件。你可以使用GCC的sparc目标架构进行编译:
gcc -mcpu=v9 -mtune=v9 -m64 -Os -o my_program_sparc my_program.c
-
使用QEMU启动KLEE: 使用QEMU来加载并执行你的SPARC可执行文件,并通过KLEE进行符号执行。注意,这个过程可能比较复杂,因为KLEE不直接支持SPARC,但可以通过QEMU间接支持。你需要创建一个KLEE插件来处理SPARC指令集。这是一个简化版的例子:
#!/usr/bin/env python import klee class SparcPlugin(klee.KleePlugin): def __init__(self): super(SparcPlugin, self).__init__("sparc") def run(self, cmd_args, stdin=None, stdout=None, stderr=None): return "qemu-system-sparc64 -L . %s" % cmd_args[0] if __name__ == "__main__": plugin = SparcPlugin() plugin.run(["./my_program_sparc"])
将上述Python脚本保存为
sparc_plugin.py
,然后运行KLEE:klee --driver=./sparc_plugin.py --no-output my_program_sparc
请注意,这只是一个基本的概念验证示例,实际操作可能会遇到很多挑战,比如需要正确地处理SPARC指令集的细节、内存映射以及寄存器等。你可能还需要根据实际情况调整QEMU的配置,以便更好地支持SPARC架构的二进制文件。
此外,还有其他符号执行工具,如Valgrind,但它主要用于内存错误检测,而不是专门用于符号执行。如果你能找到专门为SPARC架构设计的符号执行工具,那将更理想,但目前似乎并没有广泛使用的工具。你可能需要自己定制或修改现有工具以适应SPARC架构的需求。
解决 无用评论 打赏 举报-