check_state.add_constraints(check_constraint)添加比较的约束,当这个约束成立 就能解出答案

分析

输入 后进行 加密比较 (一个字符一个字符比较) 防止消耗内存 过多

为了得到接过 且保存程序的正常

我们要先找到 check函数 然后自己添加一个 约束

check_state = sm.found[0] 找打check func 的地方

check_state.add_constraints(check_constraint) 添加比较的约束,当这个约束成立 就能解出答案

# -*- encoding: utf-8 -*-
from __future__ import print_function
import angr
import sys
import claripy
'''
@文件        :angr_exp.py
@时间        :2020/04/26 13:05:23
@作者        :0xc4m3l
'''
def main(argv):
    bin_patch = argv[1]
    p  = angr.Project(bin_patch)
    start_addr = 0x08048625
    init_state = p.factory.blank_state(addr = start_addr)

    cmp_string = "MRXJKZYRKMKENFZB" 
    password_addr = 0x0804A050
    password = init_state.solver.BVS("password", 16*8)
    # 保存 password 符号化参数
    init_state.memory.store(password_addr,password)

    check_function_addr = 0x08048565
    
    sm = p.factory.simgr(init_state)
    # 找到比较的地址。
    sm.explore(find = check_function_addr)
    if sm.found:
        check_state = sm.found[0]
        data1 = password_addr
        data2 = 0x10

        check_BVS = check_state.memory.load(data1,data2)

        check_constraint = cmp_string == check_BVS
        # 添加比较的约束,当这个约束成立 就能解出答案
        check_state.add_constraints(check_constraint)
        password1 = check_state.solver.eval(password,cast_to = bytes).decode("utf-8")
        print("Solution : {}".format(password1))

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