本文共 1716 字,大约阅读时间需要 5 分钟。
(观察以上函数,都是利用静态链接编入文件,并非调用动态链接库,想要提高程序执行效率需要把它们利用内置的libc
函数进行替换)
angr
里头写好了很多内置的libc
函数,从而让我们用hook来提高符号执行的速度。
要知道更多的函数,可以访问下面的网址:
找出静态链接的函数地址:
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 angrimport sysdef 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
转载地址:http://mtve.baihongyu.com/