论坛首页 安全工具分享区 阅读主题

[原创]LLVM Pass编写及去除 —— 控制流平坦化

200 浏览 11 回复
#1 楼主 2026-06-01 21:08:48
ollvm更改了原始代码块的跳转关系,将代码分割为基本块,由分发块统一控制,如下图基本块为由终结指令结尾的代码块,每个基本块都会跳转到返回块,返回块回到分发块进行下一次跳转具体代码如下利用swich case结构控制下一个跳转的基本快,但是这种方式写出来的case值会直接暴露在代码中,很容易找到跳转关系我们可以尝试手动去除一下这种ollvm在loc_4011DF这个基本块中,给存放case变量的指针赋值,然后回到返回块,此时0x5CAFE12C就是分发器要找的下一个case值找到比较0x5CAFE12C的分发器,就可以顺藤摸瓜发现跳转的下一个块为loc_4011F2也就可以据此恢复跳转关系去除混淆知道原理之后就可以写出idc脚本批量操作脚本从基本块入手,从pass编写脚本可知每个基本块的最后两条指令为给swValPtr赋值和跳转到返回块,且基本块必定只有一个跳转指令,可以根据这些特征轻松定位基本块并进行处理效果如下原始伪代码:使用idc脚本去混淆后可以成功去除但是这样的ollvm混淆,case值直接暴露在汇编中,使用d810等工具就可以一把梭,为了增加混淆去除难度,可以对case值的生成进行魔改如上,在处理基本块时,对case值的生成新增了异或运算,间接运算case值可以使d810失效依旧手动去除一下图中可以看到loc_4011F6的case值为0x772811A7,自身异或的值为0x15FBEF3,运算后得到0x7677AF54得到后继块为loc_40120E如果有两个后继块,图中条件为cmovb,相应应该更改为jb + jmp编写idc脚本去除因为异或运算需要自身case值,所以可以从分发块开始解析去混淆效果如下去混淆前去除混淆后idc脚本去除ollvm混淆的思路是通用的,但是文中代码只是根据我手里被混淆过的文件特征进行去除,如果想在不同的文件中使用,最好把一些常用代码封装成函数,根据不同的ollvm魔改方式进行去除此题为魔改ollvm,以它为例,讲解如何分析及去除一个陌生的ollvm,并写出idc脚本一键处理观察cfg,发现和之前学到的有些不同,只有入口块、分发块和基本块,缺少了返回块每个基本块都是直接返回到主分发块,而且也没有将case值压入指针的操作,那么分发块是如何确定下一个跳转的基本块的呢再来看主分发块


登录后可查看完整内容

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-290837.htm
#2 2026-06-01 21:08:48
tql
#3 2026-06-01 21:08:48
好文
#4 2026-06-01 21:08:48
求大佬博客地址学习
#5 2026-06-01 21:08:48
感谢分享
#6 2026-06-01 21:08:48
火钳刘明
#7 2026-06-01 21:08:48
你的分享对大家帮助很大,非常感谢!
#8 2026-06-01 21:08:48
buluo533

求大佬博客地址学习

博客地址:b44K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6K9h3&6Y4L8r3g2Z5L8%4u0F1i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1k6Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4@1f1$3i4K6R3@1i4K6W2r3i4@1f1^5i4@1t1H3i4@1p5J5i4@1f1#2i4@1p5@1i4@1p5%4i4@1f1#2i4@1q4q4i4@1t1$3i4@1f1#2i4K6V1$3i4K6W2o6i4@1f1$3i4@1q4o6i4@1p5J5i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1@1i4@1u0n7i4K6S2m8i4@1f1#2i4K6V1H3i4K6S2q4i4@1f1@1i4@1u0o6i4K6W2m8i4@1f1#2i4@1p5@1i4K6W2m8i4@1f1#2i4@1p5@1i4K6W2m8i4@1f1#2i4K6R3^5i4K6R3$3i4@1f1@1i4@1u0m8i4@1q4n7
#9 2026-06-01 21:08:48
给你点赞
#10 2026-06-01 21:08:48
好文
#11 2026-06-01 21:08:48
强强强
#12 2026-06-01 21:08:48
厉害

请登录后参与讨论

立即登录 注册账号