在Angr中,我有这样的代码
#include <stdio.h>
typedef struct A_struct
{
int data1;
int data2;
} A;
void bar(A* a){
a->data2 += 1;
}
void foo(A* a)
{
a->data1 += 1;
bar(a);
}
int main()
{
A a;
a.data1 = 1;
a.data2 = 2;
foo(&a);
printf("%d, %d\n", a.data1, a.data2);
return 0;
}
我将C代码编译成Binary,我想使用angr来执行函数
foo
,如何只执行foo
而不执行main
?
对于符号执行,如何获取结构体A的执行轨迹?
具体执行的话,如果我将a
设置为内存部分,如何得到a
的结果?
我尝试使用BVS作为参数
import angr
import claripy
b = angr.Project('test_fun')
func_addr = b.loader.find_symbol('foo').rebased_addr
print(func_addr)
f = b.factory.callable(func_addr)
x = claripy.BVS('x', 64)
res = f(x)
print(res, type(res))
但是结果不是我想要的,结果是x_40_64,我不知道这是什么。而且我不知道如何传递一些具体的内存作为参数
您可能正在寻找函数
project.factory.call_state
,您可以通过在地址参数之后传递位置参数来将参数传递给函数。
之后,您可以使用该状态初始化模拟管理器,并对其进行模拟。