angr
First Post:
Last Update:
Last Update:
主要是记录一下这些脚本,真正理解暂时有点困难
附上大佬的教程:https://github.com/ZERO-A-ONE/AngrCTF_FITM
一.good:
程序源码:
1 |
|
使用Angr的步骤可以分为:
- 创建 project
- 设置 state
- 新建符号量 : BVS (bitvector symbolic ) 或 BVV (bitvector value)
- 把符号量设置到内存或者其他地方
- 设置 Simulation Managers , 进行路径探索的对象
- 运行,探索满足路径需要的值
- 约束求解,获取执行结果
angr脚本:
1 |
|
二.good_avoid
angr脚本:
1 |
|
这个我试着跑了一下,挺成功的
三.多个good或avoid
程序源码:
1 |
|
1 |
|
angr的exp
1 |
|
引用了两个函数可以动态的获取地址,而不是之前“写死”
四.符号化寄存器
程序源码:
1 |
|
angr的exp:
1 |
|
五.符号化栈
应用情况就是函数在输入传参的时候是在栈上进行的
如图:
程序源码:
1 |
|
angr的exp:
1 |
|
六.符号化内存
程序源码:
1 |
|
user_input()所处的地址:
字符串分别位于以下地址[0xA1BA1C0, 0xA1BA1C8, 0xA1BA1D0, 0xA1BA1D8]
angr的exp:
1 |
|
七.符号化动态内存
程序源码:
1 |
|
angr的exp:
1 |
|
八.符号化文件内容
程序源码:
1 |
|
angr的exp:
1 |
|
九.路径爆炸
程序源码:
1 |
|
所谓符号执行就是把程序中的变量符号化去模拟程序运行,搜集路径约束条件并使用约束求解器对其进行求解后得到结果。当一个程序存在循环结构时,即使逻辑十分简单也可能会产生规模十分巨大的执行路径。在符号执行的过程中,每个分支点都会产生两个实例,当程序中存在循环结构展开时,可能会导致程序分支路径数呈指数级增长,即路径爆炸问题。故我们需要提供更多的约束条件控制路径爆照问题
angr的exp:
1 |
|
- 用户输入的字符串存储在buffer,buffer的地址为:0x804A050
- 比较函数
check_equals_AUPDNNPROEZRJWKB
的地址为:0x08048565 - 其实只要当程序运行到地址0x08048565时,处于buffer地址内的字符串等于AUPDNNPROEZRJWKB即可
- 添加上述约束条件即可一步得出结果,而不用进入比较函数逐一字符比较而产生路径爆炸问题
十.angr hook
主要就是学习使用angr的hook技术解决路径爆炸问题,与我们之前利用的约束条件不同,hook技术则更为强大