@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)