当前位置: 首页 > news >正文

Angr CTF Part 1

有这么串代码,需要找到执行至Success的路径。

user_input = ?
if user_input = "yes":print 'Success'
else:print 'Try again'

可以把条件,user_input想象成为一个未知变量,而获取路径的过程就是一个解方程的过程。于是,我们设user_input为未知变量,然后进行到if判断的时候,就会进入两条路径,一条是输出Success,一条是输出Try again,当我们找到我们想要的结果时,就能轻易根据约束条件推出一开始的user_input。
这时候我们换一个复杂一点的例子

#define SECRET 100
int check_code(int input) {if (input >= SECRET+88) return 0;if (input > SECRET+100) return 0;if (input == SECRET+68) return 0;if (input < SECRET) return 0;if (input <= SECRET+78) return 0;if (input & 0x1) return 0;if (input & 0x2) return 0;if (input & 0x4) return 0;return 1;
}

当这一串代码中想要获取return 1的路径,首先获取代码的所有路径,并整理为树形结构。这种情况就要运用深度优先算法来得到return 1的路径。
在这里插入图片描述获取到了路径之后,我们就可以构建一个可以用SMT求解器求解的方程,就能快速的得到input的值。

  input >= SECRET+88 
∧ input > SECRET+100
∧ input == SECRET68
∧ input < SECRET
∧ input <= SECRET+78
∧ input & 0x1
∧ input & 0x2
∧ input & 0x4

当然,随着复杂度的增加就需要运用到这次的妙妙工具了Angr。Angr是一个符号执行引擎。 它可以遍历二进制文件并搜索符合给定条件的程序状态然后在给定路径约束的情况下求解符号变量。
执行路径表示程序从某个地方开始到另一个地方结束的可能执行流程。 Angr中执行路径的节点由“SimState”对象表示。顾名思义,它存储程序的状态以及以前状态的历史。 Angr在“simulation manager”对象中存储和处理给定程序的一组可能路径。Simulation manage提供逐步执行程序以生成可能的路径/状态的功能。
1.Angr在指示程序启动的任何地方启动程序
2.在每个活动(未终止)状态下执行指令,直到到达分支点或状态终止
3.在每个分支点,将状态拆分为多个状态,并将它们添加到活动状态集中
4.重复步骤2…4,直到找到所需内容或所有状态终止
在这里插入图片描述但是用这个方法每次IF命令都会使存储的路径翻倍,所以每次应当尽早地排除掉错误地路径。这个过程在Angr中也能表示出来simulation.explore(find=你想要去的地址,avoid=你想要避免的地址)。比如simulation.explore(find=0x801000,avoid=0x802000),意思就是找到去801000地址的路径,并避免到达802000。


http://www.mrgr.cn/news/12320.html

相关文章:

  • Kakfa的核心概念-Replica副本(kafka创建topic并指定分区和副本的两种方式)
  • [笔记]中间件基础 - 进一步阅读的扩展点
  • Numpy常用内置函数及运算函数
  • css基础学习总结(一)
  • 灵神算法题单——滑动窗口(求子数组个数)
  • 人工智能以纳米级精度检测癌症和病毒感染
  • 使用rqt_console和roslaunch
  • 一键获取店铺商品:阿里巴巴API返回值详解
  • Redis的持久化
  • 【从问题中去学习k8s】k8s中的常见面试题(夯实理论基础)(二十)
  • 尚硅谷Java面试题第四季-Java基本功
  • linux命令之mkdir
  • WordNet介绍——一个英语词汇数据库
  • Vue3、Vite、Pinia基础学习
  • 【论文阅读】基于生成对抗网络的模型窃取方法的研究(2021)
  • docker基础到进阶
  • 【html+css 绚丽Loading】000021 万象轮回珠
  • EmguCV学习笔记 VB.Net 7.1 角点检测
  • 工厂模式与策略模式:理解与应用
  • nginx-rewrite、if、浏览器分离、防盗链