@p.hook(check_addr,length=check_len) 表明修改的hook的地址 修改的长度 要加一个 @ 符号

state.regs.eax = claripy.If(cmp_string == input_bvs, claripy.BVV(1, 32), claripy.BVV(0, 32)) 返回值保存在 eax 判断条件收集 cmp_string == input_bvs 返回正确 claripy.BVV(1, 32) 返回错误 claripy.BVV(0, 32)

input_bvs = state.memory.load(buffer_addr, buffer_len) 将我们的输入字符化

分析

程序输入 然后要进行 比较 要让程序能正常运行下去,因为比较函数 是 单字符比较 所以我们可以利用 angr的hook 功能

单字符比较 利用 Hook 功能写成 字符串比较

# -*- encoding: utf-8 -*-
from __future__ import print_function
import angr
import sys
import claripy
'''
@文件        :angr_exp.py
@时间        :2020/04/26 15:36:26
@作者        :0xc4m3l
'''
def main(argv):
    bin_patch = argv[1]
    p  = angr.Project(bin_patch)
    
    # 一个输入可以直接从 程序开始处 运行
    init_state = p.factory.entry_state()

    check_addr = 0x080486B3  # 需要hook 的call 函数地址
    check_len = 5            # 需要hook 的call 函数指令的 大小

    @p.hook(check_addr,length=check_len) # 表明修改的hook的地址 修改的长度
    # hook为我们自定义的函数。
    def check_hook(state):    
        buffer_addr = 0x0804A054    # 输入保存的地址
        buffer_len = 0x10           # 输入长度

        input_bvs = state.memory.load(buffer_addr, buffer_len)

        cmp_string = "MRXJKZYRKMKENFZB"

        state.regs.eax = claripy.If(
            cmp_string == 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).decode("utf-8")))

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