CFG图

参考下fla经典图:

初始化
找块
先找出retn块和预处理器块
遍历cfg的所有块, 判断没有分支且直接跳转分支的就是返回块
跳转到主分发器的就是预处理器块
把这些块的起始地址保存起来
然后找出真实块和可nop块
真实块就是直接跳转到预处理器的块
可以nop掉的块就是除了真实块, 既不是入口, 也不是返回块, 那么就是可以nop掉的块
把这些块的起始地址保存起来
模拟执行
这里就是从起始地址, 模拟执行到真实块的地址, 如果里面的指令有分支, 那么则要模拟执行2次, 把真实块的后继地址找出来保存起来flow字典:
key: 真实块的起始地址
value: 真实块的后继地址列表
这样子符号执行后, flow里面就保存了每个真实块的后继地址, 有分支的就有两个后继, 没有分支的就只有一个后继
修改so
执行
去除前

去除后


学习代码:
修改支持最新版本angr
注:
这个标准的fla, 主要是为了学习其思路, 实际魔改的情况下会复杂的多~
参考:
- 作者:拓森Leo
- 链接:https://www.uzilol.cn/article/203bf20f-1d11-80fe-8ab6-ef60716e5a6e
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。



