我正在使用最新版本的 angr (9,0,'gitrollling')。[我在 angr 版本 (9, 0, 4663) 中得到相同的行为]。
使用 gcc 9.3.0 我为这个简单的 C 程序创建了一个 ELF 二进制文件:
float func3(float y) {
float temp = 5.5; // expected angr to find this constant
return y + temp;
}
int main(int argc, char *argv[]) {
float ans;
ans = func3(2.2); // expected angr to find this constant
}
然后我使用 angr 提取函数中的常量(即“func3”和“main”)以及函数的参数数量。不幸的是,我得到的常量(下面输出中的“const”)或“argc”的答案没有意义。我得到:
name main const [8, 32, 8, 32, 18446744073709551596, 18446744073709551584, 0, 4202504, 4202504,
8, 4198767, 128, 4198697, 18446744073709551612, 0, 8, 8, 128] argc -1
name func3 const [8, 18446744073709551596, 4202500, 4202500, 18446744073709551612,
18446744073709551596, 0, 18446744073709551612, 8, 8, 128] argc -1
我的愤怒代码:
#!/usr/bin/env python3
import angr
from angrutils import *
def get_attributes(cfg, addr):
if addr in cfg.kb.functions:
func = cfg.kb.functions.get_by_addr(addr)
if func:
name = func.demangled_name
if name != 'main' and name != 'func3':
return # only care about these 2 funcs
const = func.code_constants
argc = len(func.arguments) if func.arguments else -1
print(' name %s const %s argc %s ' % (name, const, argc))
return
proj = angr.Project('simple', main_opts={'backend': 'elf'}, load_options={'auto_load_libs':False})
main = proj.loader.main_object.get_symbol('main')
start_state = proj.factory.blank_state(addr=main.rebased_addr)
start_state.stack_push(0x0)
with hook0(proj):
cfg = proj.analyses.CFGFast() # using CFGEmulated() also does not change the answer!
#cfg = proj.analyses.CFGEmulated(fail_fast=False, starts=[main.rebased_addr], context_sensitivity_level=1, enable_function_hints=False, keep_state=True, enable_advanced_backward_slicing=False, enable_symbolic_back_traversal=False,normalize=True)
d=dict()
for src, dst in cfg.kb.functions.callgraph.edges():
if not d.get(src): # only need to do this once.
src_attr = get_attributes(cfg, src)
d[src] = True # mark completed
if not d.get(dst): # only need to do this once.
dst_attr = get_attributes(cfg, dst)
d[dst] = True # mark completed
我哪里错了?