angr学习笔记(10)(hook)
发布日期:2021-05-07 12:09:03 浏览次数:19 分类:原创文章

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

angr系列

文章目录

scanf函数

#include<stdio.h>int main() {   	int buff[100];	scanf("%4s/n", buff);	printf("biaobiao come on");	scanf("%4s/n", buff);}

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

总结:

scanf读取的地方是输入缓冲区(以内存为参照)的,只要第一个scanf读取完成后,缓冲区中还有数据,就会紧接着读取不需要下次的输入

分析伪代码

在这里插入图片描述

在这里插入图片描述
输入参数地址是0x0804A054
在这里插入图片描述

0x80486B3我们需要hook的地址是这个,因为这个函数里面字符进行一一比较,容易造成路径爆炸

一旦我们执行到check_addr=0x080486B3这个地址时,然后程序不会往下执行原来的函数,而是会去执行check_hook函数

先进行函数参数的加载:

 user_input_bvs=state.memory.load(            user_input_addr,            user_input_length            )

然后进行相应返回值的判断:

        state.regs.eax=claripy.If(            desired==user_input_bvs,            claripy.BVV(1,32),            claripy.BVV(0,32)            )

脚本:

import angrimport sysimport claripydef main(argv):    bin_path=argv[1]    p=angr.Project(bin_path)    init_state=p.factory.entry_state()    check_addr=0x080486B3    check_skip_size=5    @p.hook(check_addr,length=check_skip_size)    def check_hook(state):        user_input_addr=0x0804A054        user_input_length=16        user_input_bvs=state.memory.load(            user_input_addr,            user_input_length            )        desired='XYMKBKUHNIQYNQXE'        state.regs.eax=claripy.If(            desired==user_input_bvs,            claripy.BVV(1,32),            claripy.BVV(0,32)            )    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)

在这里插入图片描述

ZXIDRXEORJOTFFJNWUFAOUBLOGLQCCGK

验证

在这里插入图片描述

上一篇:angr学习笔记(11)(SimProcedure)
下一篇:angr学习笔记(9)(添加约束)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月14日 04时23分27秒