对函数名称开始进行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)