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)