符号执行(二)

学习如何优化angr脚本,题目defcamp_r100

指定入口地址

这种方法可以避免angr反复执行程序初始化操作,让程序从main开始运行

1
state=p.factory.blank_state(addr=0x4007E8)

改写库函数

载入程序时,阻止angr自动载入依赖的库函数

1
p = angr.Project("r100",auto_load_libs=False)

auto_load_libs默认为True,但angr对libc库做了优化,不需要再加载。
输出函数对算法的分析没有影响,可以让其直接返回。

1
p.hook_symbol('printf',angr.SIM_PROCEDURES['stubs']['ReturnUnconstrained'](),replace=True)

hook掉printf使之返回[‘stubs’][‘ReturnUnconstrained’](一个无约束的符号)
本题中,输入的flag长度为12,可以直接hook掉fgets函数在应该指向的内存地址放置12字节的输入。

1
2
3
4
5
6
7
class my_fgets(angr.SimProcedure):
def run(self,s,num,f):
simfd=self.state.posix.get_fd(0)
data,real_size=simfd.read_data(12)
self.state.memory.store(s,data)
return 12
p.hook_symbol('fgets',my_fgets(),replace=True)