angr_ctf——从0学习angr(三):Hook与路径爆炸

打印 上一主题 下一主题

主题 829|帖子 829|积分 2487

路径爆炸

之前说过,angr在处理分支时,采取统统收集的策略,因此每当遇见一个分支,angr的路径数量就会乘2,这是一种指数增长,也就是所说的路径爆炸。
以下是路径爆炸的一个例子:
  1. char buffer[17];<br>for(int i=0;i<16;i++){
  2.         if(buffer[i]!='B'){
  3.             return 0;
  4.         }
  5. }
  6. return 1;
复制代码
会得到一个极为庞大的符号变量,或者说一个表达式,这是位向量经过混淆函数混淆后的结果,因此要求解的应该是这个表达式。
我们创建的符号buffer被保存在了buffer的地址当中,然后模拟程序运行时,从地址中取出符号进行混淆,混淆的过程也被保存在buffer的地址中,因此在最后需要从这个地址里面取出混淆后的符号进行求解。
 
第二个问题,先说结论:angr在路径选择时只进入库函数一次,而不关心库函数内部的实现采用了多少次if。
编写以下两个c程序并编译(我这里使用gcc编译成64位了,与题目的32位不符,但原理相同):
  1. @project.hook(hook_addr, length=ins_length)
  2. def hook_ins(state):
  3.     #your code
复制代码
 
  1. int my_add(int a, int b){
  2.     return a+b;
  3. }
复制代码
tmp前面的内容即buffer的内容,是经过混淆计算后的符号,而在最后可以看到,claripy.If创建了一个判断,因此实际上返回了一个约束,这就是为什么不适用python中的if然后传递一个的原因。
 
实战:10_angr_simprocedures


第十题的路径爆炸仍然发生在check_equals函数当中,与上一题的区别在于,此时输入的字符串被保存在局部变量当中,我们无法提前得知它的地址,因此如果要hook掉check函数,则必须获取check函数的参数。
因此需要使用hook_symbol的方式来hook掉check函数
使用方式之前说明了,只需要注意使用hook_symbol的方法本质上是创建了新的函数取代了原有函数,因此在返回值的时候使用return返回,而不用将值保存在eax当中(事实上重写的run方法中没有当前的state,你也保存不到eax里面)
angr脚本如下:
  1. class Replace_my_add(angr.SimProcedure):
  2.     def run(self, a, b):
  3.         return a - b
  4.    
  5. hooked_func_name = 'my_add'
  6. project.hook_symbol(hooked_func_name, Replace_my_add())
复制代码
 
实战:11_angr_sim_scanf


此题与实战2-7中的题类似,实际上使用万能脚本就可以成功。出于练习的目的,跟着angr_ctf作者的思路,我们使用hook_symbol方法来hook掉scanf函数。
angr脚本如下,使用到了state的全局变量插件,用法很简单,用于进行约束求解。如果不使用全局变量的话,从buffer的地址中取出符号进行求解也是一样的(就像在实战8中做的那样)
  1. state.regs.eax = claripy.If(buffer == target, claripy.BVV(1, 32),claripy.BVV(0, 32))
复制代码
 
实战:12_angr_veritesting

先逆向分析

可以看到,此题与之前的题目不同的地方在于,它不仅是按位进行比较的,而且是按位进行混淆后马上比较。之前的题目都是整体混淆后比较。因此路径爆炸同时出现在混淆和比较两个地方。
之前的做法是跳过循环比较,直接让混淆后的字符串与正确的字符串比较,但这里不能这样做,跳过循环比较就意味着跳过了混淆。
因此考虑使用路径归并的搜索策略veritesting,此题就是用来体验一把veritesting的强大功能的。
angr脚本如下,直接使用万能脚本,并且开启veritesting:
  1. if buffer==target:
  2.     state.regs.eax = claripy.BVV(1,32)
  3. else:
  4.     state.regs.eax = claripy.BVV(0,32)
复制代码
(不加veritesting直接能跑死机,大佬的智慧真是看不懂,但是真好用)
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表