0x00 问题定义
接第一篇遗留的问题,在做控制流平展反混淆时,用动态执行的方式获取执行路径时,如果原控制流中存在循环的情况,那么获取到的路径就会有重复的现象,如下所示:
[
[ 3 ], [ 1 ], [ 2 ], [ 1 ],
[ 2 ], [ 1 ], [ 2 ], [ 1 ],
[ 2 ], [ 1 ], [ 2 ], [ 1 ],
[ 2 ], [ 1 ], [ 2 ], [ 1 ],
[ 2 ], [ 1 ], [ 2 ], [ 1 ],
[ 2 ], [ 1 ], [ 2 ], [ 0 ]
]
这里可以发现,[1],[2]
的序列重复出现了11次,这种重复的路径信息可以推断其原始路径是一种循环的状态。如果想把它还原成循环的形式,那么就需要做两部分工作:
- 识别路径结果中的重复路径。
- 以循环的方式修复控制流。
0x01 解决方案
- 最小相邻重复子串问题
假定有一个字符串A,找到它的最小相邻的重复子串,该子串符合如下特征:
(1)必有一个有多个与其相邻且相同的子串
(2)子串内部不存在重复子串(最小粒度)
这样的子串,就是要找的典型的执行路径存在循环的情况,最小子串即循环内部的逻辑。
如上所示执行路径,其存在一个最小相邻重复子串[1],[2],长度为2,起始位置是1,重复了11次。就可以用1,2,11这样的三元组来表示查找结果。
还原时&