对函数名称开始进行hook 从而让程序运行正确 class mySimPro(angr.SimProcedure): # 利用 run 函数 def run(self, input_addr, input_length):

p.hook_symbol(check_symbol, mySimPro()) # 通过hook_symbol hook 掉函数名为 "check_equals_MRXJKZYRKMKENFZB" 的函数

分析

f5 代码。

但是通过看 汇编 发现又很多代码没有 被编译出来

调用的次数特别多 所以每次 调用 check 函数时

利用类定义 来通过 函数名称来 hook 函数

# -*- encoding: utf-8 -*-
from __future__ import print_function
import angr
import sys
import claripy
'''
@文件        :angr_exp.py
@时间        :2020/04/26 19:31:28
@作者        :0xc4m3l
'''
def main(argv):
    bin_patch = argv[1]
    p  = angr.Project(bin_patch)
    init_state = p.factory.entry_state()
    
    # 对函数名称开始进行hook 从而让程序运行正确
    class mySimPro(angr.SimProcedure):
        # 利用 run 函数
        def run(self, input_addr, input_length):
            angr_bvs = self.state.memory.load(
                input_addr,
                input_length
            )
        
            cmp_date = "MRXJKZYRKMKENFZB"

            return claripy.If(
                cmp_date == angr_bvs,
                claripy.BVV(1, 32),
                claripy.BVV(0, 32)
            )
    check_symbol = "check_equals_MRXJKZYRKMKENFZB"

    p.hook_symbol(check_symbol, mySimPro()) # 通过hook_symbol hook 掉函数名为 "check_equals_MRXJKZYRKMKENFZB" 的函数

    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]

        password = found_state.posix.dumps(0)
        print("Solution {}".format(password.decode("utf-8")))
    else:
        raise Exception("No found")

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