如何将字符串输入添加到Angr程序的开头?

问题描述

很抱歉,这个问题可能毫无道理。我是angr的新手,遇到了一个小问题。因此,假设我有一个二进制程序“ mybinary”,我在其中输入了一些内容,并执行了一些操作并对其进行检查以查找标志。 (普通的crame样式。)

但是,程序首次运行时需要输入字符串tid。我有提示,它只是一个32位的字母和数字字符串。

所以要运行它,而不是“ ./mybinary”,我必须执行“ ./mybinary'tid string'”。

在将文件加载到angr项目中的情况下该怎么做?

例如,如果我的angr代码类似于以下内容

import angr
import claripy

#Whatever variables.

base_addr = #Whatever the base address is.

proj = angr.Project("./mybinary",main_opts={'base_addr': base_addr}) 

#Some code for defining flag characters.

state = proj.factory.full_init_state(
        args=['./mybinary'],add_options=angr.options.unicorn,stdin=flag,)

#Some code to create and run simulation with success and failure.

我如何编辑它,使其运行“ ./mybinary'tid字符串'”而不是仅运行“ ./mybinary”?

请谢谢您的帮助!

解决方法

这是您应如何实例化状态以适合您的需求的方法:

state = proj.factory.entry_state(
    args=['./mybinary','the tid string'],add_options=angr.options.unicorn,stdin=flag,)

根据documentation

如果您在可以接受命令行参数或环境的环境中执行,则可以通过args传递参数列表,并通过env传递环境变量字典到entry_statefull_init_state

此外,看来您并不需要full_init_stateentry_state应该足够(same documentation):

.entry_state()构造一个状态,准备在主二进制文件的入口点执行。