Angr安装与使用之使用篇(十二)

16 篇文章 1 订阅
8 篇文章 0 订阅
该篇博客介绍了一个利用angr库解决C程序中scanf函数输入hook的问题。通过创建自定义SimProcedure替换输入函数,收集输入数据并寻找使得程序输出'GoodJob.'的路径。最终,程序成功找到正确密码并输出。
摘要由CSDN通过智能技术生成

针对angr提供的练习题,现在进行求解11_angr_sim_scanf,它也是关于hook输入的问题,需要使用angr求解出正确密码。但是需要提供排除地址以减少路径求解时间。
具体代码如下所示

import angr
import claripy
import sys

def main(argv):
  path_to_binary = argv[1]
  project = angr.Project(path_to_binary)

  initial_state = project.factory.entry_state()
  #定义一个类,它继承angr.SimProcedure
  class ReplacementScanf(angr.SimProcedure):
    #使用此函数替代输入函数
    def run(self, format_string, scanf0_address, scanf1_address):
      scanf0 = claripy.BVS('scanf0', 32)
      scanf1 = claripy.BVS('scanf1', 32)

      #输入函数会将用户输入写入到缓冲区中
      self.state.memory.store(scanf0_address, scanf0, endness=project.arch.memory_endness)
      self.state.memory.store(scanf1_address, scanf1, endness=project.arch.memory_endness)
      
	  #位向量scanf0及scanf0是类ReplacementScanf的局部变量,需要使用globals将这两个符号位向量变为全局变量
      self.state.globals['solution0'] = scanf0
      self.state.globals['solution1'] = scanf1

  #使用具体符号名定位到需要hook的函数位置
  scanf_symbol = '__isoc99_scanf'
  project.hook_symbol(scanf_symbol, ReplacementScanf())

  simulation = project.factory.simgr(initial_state)

  def is_successful(state):
    stdout_output = state.posix.dumps(sys.stdout.fileno())
    return b'Good Job.' in stdout_output

  def should_abort(state):
    stdout_output = state.posix.dumps(sys.stdout.fileno())
    return b'Try again.' in stdout_output

  simulation.explore(find=is_successful, avoid=should_abort)

  if simulation.found:
    solution_state = simulation.found[0]

    # 获取位向量scanf0及scanf0
    stored_solutions0 = solution_state.globals['solution0']
    stored_solutions1 = solution_state.globals['solution1']
    
    solution0 = solution_state.solver.eval(stored_solutions0)
    solution1 = solution_state.solver.eval(stored_solutions1)

    print('solution are: {0},{1} '.format(solution0,solution1))
  else:
    raise Exception('Could not find the solution')

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

下面验证实验结果
执行刚刚写好的程序,保存为scaffold11.py,并将其与11_angr_sim_scanf放于同一文件夹中,具体如下图所示。
在这里插入图片描述
再执行11_angr_sim_scanf,然后需要我们输入angr刚刚求解出的密码,结果为Good Job。
在这里插入图片描述
至此,求解11_angr_sim_scanf已全部完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值