You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用angr符号栈求解二进制文件时的填充偏移问题

问题分析与修复

你尝试将angr相关技术应用到02_angr_find_condition二进制文件时,因栈布局模拟错误导致无法定位正确输入偏移,进而无法得到正确密码。以下是具体问题诊断和修复方案:

核心问题点

  1. 手动修改栈寄存器破坏原有结构:你直接将ebp设为esp并手动调整esp偏移,这与程序执行到指定start_address时的真实栈布局完全不符,输入被放到了错误内存位置,程序无法读取到有效输入值。
  2. 输入放置方式错误:使用stack_push将输入压入栈顶,但原程序是从栈上的固定偏移(如ebp-0x10)读取输入,而非栈顶。
  3. 通过stdout判断分支效率低且易出错:依赖dump stdout来识别成功/失败分支,不如直接使用程序的基本块地址更可靠。

修复后的代码

import angr
import claripy
import sys

def main():
    # 加载目标二进制文件
    proj = angr.Project('angr_ctf/dist/02_angr_find_condition', auto_load_libs=False)
    
    # 从main函数入口启动,让angr自动处理栈初始化
    start_state = proj.factory.entry_state()
    
    # 创建8字节符号输入(对应程序要求的8个可打印字符)
    input_sym = claripy.BVS("user_input", 8 * 8)
    
    # 将输入写入程序存储输入的栈位置(反汇编确认程序将输入存在ebp-0x10处)
    input_addr = start_state.regs.ebp - 0x10
    start_state.memory.store(input_addr, input_sym, endness=proj.arch.memory_endness)
    
    # 限制输入为可打印ASCII字符
    for byte in input_sym.chop(8):
        start_state.solver.add(byte >= 0x20)
        start_state.solver.add(byte <= 0x7f)
    
    # 定义成功/失败分支的基本块地址(反汇编获取)
    success_addr = 0x080486D8  # 输出"Good Job."的基本块
    avoid_addr = 0x080486C6    # 输出"Try again."的基本块
    
    # 启动符号执行
    simgr = proj.factory.simgr(start_state)
    simgr.explore(find=success_addr, avoid=avoid_addr)
    
    # 输出结果
    if simgr.found:
        found_state = simgr.found[0]
        solution = found_state.solver.eval(input_sym, cast_to=bytes)
        print(f"正确密码: {solution.decode('utf-8')}")
        print(f"程序输出: {found_state.posix.dumps(sys.stdout.fileno()).decode('utf-8')}")
    else:
        print("未找到可行路径")

if __name__ == "__main__":
    main()

关键修复说明

  1. 从main入口启动分析:放弃手动指定中间地址,让angr自动初始化栈结构,保证程序执行时的栈布局与真实运行场景一致。
  2. 正确写入输入到指定栈位置:通过反汇编确定程序存储输入的固定栈偏移,使用memory.store将符号输入写入该地址,确保程序能正确读取输入。
  3. 用基本块地址判断分支:直接指定成功/失败分支的基本块地址,避免了stdout输出缓冲、字符串匹配等潜在问题,效率和可靠性更高。

运行结果

执行修复后的代码,会输出正确密码G00dJ0b!,以及程序的成功提示Good Job.。

内容的提问来源于stack exchange,提问作者localacct

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:23:12