angr学习笔记(5)(栈符号化)

本文详细介绍了使用angr工具进行栈符号化的步骤及原理,重点解析了如何构造初始状态、设置栈帧以及参数传递的过程。通过实例演示了如何找到正确参数并解决实际问题。
部署运行你感兴趣的模型镜像

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

伪代码分析

在这里插入图片描述
这个是直接把参数放在栈中处理,所以我们需要利用代码在函数执行起始处构造栈空间栈符号化

符号化栈需要观察栈帧:
在这里插入图片描述
构建出start_address处的栈后,再来进行下一步的操作:

 	padding_size=8
    init_state.stack_push(init_state.regs.ebp)
    init_state.regs.ebp=init_state.regs.esp

    init_state.regs.esp-=padding_size
    
    pass1=init_state.solver.BVS("pass1",32)
    pass2=init_state.solver.BVS("pass2",32)
    init_state.stack_push(pass1)
    init_state.stack_push(pass2)

这里符号化栈可以对照这符号化内存地址单元和寄存器来进行观察

疑问点

这里为什么是8?
在这里插入图片描述
看了一下esp栈帧,除去填入的ebp,感觉padding_size应该是0x18呀,这样的话,才符合呀
动调后:
在这里插入图片描述
看了一下此时eax的值和ebp的值,直接发现
ebp+var_10就等于ebp-10(我一直以为是+10.误认为是上一个函数的内存单元格。)

其实这里也写了:
在这里插入图片描述
那对于-8就没有任何问题了。解释一下为什么是-8.

这里的输入参数是ebp-0x10ebp-0x0Cebp是高地址(栈都是由高地址向低地址拓展
在这里插入图片描述
因为参数1占四个字节,所以0xC~0x8就是这个参数所占内存,因此此时所需填充的就是8个字节(即抬高栈顶8个字节

最后进行求解:

        password1=found_state.solver.eval(pass1)
        password2=found_state.solver.eval(pass2)

脚本:

import angr
import sys
def main(argv):
    bin_path=argv[1]
    p=angr.Project(bin_path)
    start_addr=0x08048697
    init_state=p.factory.blank_state(addr=start_addr)

    padding_size=8
    init_state.stack_push(init_state.regs.ebp)
    init_state.regs.ebp=init_state.regs.esp

    init_state.regs.esp-=padding_size

    pass1=init_state.solver.BVS("pass1",32)
    pass2=init_state.solver.BVS("pass2",32)

    init_state.stack_push(pass1)
    init_state.stack_push(pass2)

    sm=p.factory.simgr(init_state)

    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.explore(find=is_good,avoid=is_bad)
    if sm.found:
        found_state=sm.found[0]
        password1=found_state.solver.eval(pass1)
        password2=found_state.solver.eval(pass2)
        print("Solution:{} {}".format(password1,password2))

    else:
        raise Exception("Solution not found")

if __name__=='__main__':
    main(sys.argv)

在这里插入图片描述

Solution:1704280884 2382341151

验证

在这里插入图片描述

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

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、付费专栏及课程。

余额充值