angr学习笔记(13)(static_binary)
发布日期:2021-05-07 12:09:04 浏览次数:9 分类:原创文章

本文共 1716 字,大约阅读时间需要 5 分钟。

angr系列

文章目录

伪代码分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(观察以上函数,都是利用静态链接编入文件,并非调用动态链接库,想要提高程序执行效率需要把它们利用内置的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

验证

在这里插入图片描述

上一篇:frida框架
下一篇:angr学习笔记(11)(SimProcedure)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年03月15日 15时53分19秒