书接上回,上一节中我们分析了GI的工作流程,
- ASM 框架的vistor 遍历机制:类、方法、接口实现关系表的构建
- Passthrough 程序内污点分析的实现:ASM和逆拓扑排序
- Callgraph 程序间污点分析的实现:利用passthrough生成ret污点
- GadegetChain BSF实现
在此基础上,主要针对以下问题再深入分析分析:
- su18师傅与Lango师傅都有提到的一些问题及改进点
- Java的反射、多态问题是如何处理的等等
- 已知链的覆盖及漏报情况
先来过一遍su18师傅提到的几个改进点
0x01 su18师傅的改进点
1.1 继承方法
前提知识:当一个类的方法A.method1 污点可以传播给B.method2,那么A的子类subA,如果subA没有重写method1,那么subA.method1 也可以把污点传播给B.method2。
这个很好理解,但是在GI的整个过程中
- 在CallGraph 阶段,ASM在遍历class的时候,只会找出所有的A.method call B.method,生成对应的关系
- 在GadgetChain 阶段,也只会遍历接口方法的具体实现
并没有做类似的传播。