angr系列
00_angr_find
01_angr_avoid
02_angr_find_condition
03_angr_symbolic_registers
04_angr_symbolic_stack
05_angr_symbolic_memory
06_angr_symbolic_dynamic_memory
07_angr_symbolic_file
08_angr_constraints
09_angr_hooks
10_angr_simprocedures
13_angr_static_binary
文章目录
伪代码分析





(观察以上函数,都是利用静态链接编入文件,并非调用动态链接库,想要提高程序执行效率需要把它们利用内置的libc函数进行替换)
angr里头写好了很多内置的libc函数,从而让我们用hook来提高符号执行的速度。
要知道更多的函数,可以访问下面的网址:
https://github.com/angr/angr/tree/master/angr/procedures/libc
找出静态链接的函数地址:
printf_addr=0x0804ED40
scanf_addr=0x0804ED80
strcmp_addr=0x08048280
puts_addr=0x0804F350
libc_start_main=0x08048D10
利用内置的libc函数进行替换操作:
p.hook(printf_addr,angr.SIM_PROCEDURES['libc']['printf']())
p.hook(scanf_addr,angr.SIM_PROCEDURES['libc']['scanf']())
p.hook(strcmp_addr,angr.SIM_PROCEDURES['libc']['strcmp']())
p.hook(puts_addr,angr.SIM_PROCEDURES['libc']['puts']())
p.hook(libc_start_main,angr.SIM_PROCEDURES['glibc']['__libc_start_main']())
注意,这个__libc_start_main是属于glibc库,并非libc,如果写成libc的话,那么最后没有结果产生。
脚本
import angr
import sys
def main(argv):
bin_path=argv[1]
p=angr.Project(bin_path)
init_state=p.factory.entry_state()
printf_addr=0x0804ED40
scanf_addr=0x0804ED80
strcmp_addr=0x08048280
puts_addr=0x0804F350
libc_start_main=0x08048D10
p.hook(printf_addr,angr.SIM_PROCEDURES['libc']['printf']())
p.hook(scanf_addr,angr.SIM_PROCEDURES['libc']['scanf']())
p.hook(strcmp_addr,angr.SIM_PROCEDURES['libc']['strcmp']())
p.hook(puts_addr,angr.SIM_PROCEDURES['libc']['puts']())
p.hook(libc_start_main,angr.SIM_PROCEDURES['glibc']['__libc_start_main']())
def is_good(state):
return b'Good Job.' in state.posix.dumps(1)
def is_bad(state):
return b'Try again.' in state.posix.dumps(1)
sm=p.factory.simgr(init_state)
sm.explore(find=is_good,avoid=is_bad)
if sm.found:
found_state=sm.found[0]
print("Solution: {}".format(found_state.posix.dumps(0)))
else:
raise Exception('Solution not found')
if __name__=='__main__':
main(sys.argv)

PNMXNMUD
验证

本文档介绍了如何使用angr进行一系列静态分析任务,如寻找路径、避免某些行为、设置条件等。通过利用angr内置的libc函数进行hook,可以提升符号执行的效率。文章提供了一个示例脚本来演示如何替换静态链接的函数,如printf、scanf、strcmp和puts,以使用angr的SIM_PROCEDURES,尤其是注意__libc_start_main属于glibc而非libc。最终,脚本通过探索找到满足特定条件的输入。
436

被折叠的 条评论
为什么被折叠?



