angr学习笔记(10)(hook)

本文详细解析angr库在scanf函数分析中的应用,涉及内存符号化、hook技巧和模拟执行,通过实例展示了如何利用angr工具定位输入缓冲区行为。重点介绍了如何hook scanf函数以控制输入并解决路径爆炸问题。
部署运行你感兴趣的模型镜像

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

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 angr
import sys
import claripy

def 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

验证

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值