首页
社区
课程
招聘
[原创]OLLVM (二)条件跳转分支混淆
发表于: 2025-6-15 17:37 666

[原创]OLLVM (二)条件跳转分支混淆

2025-6-15 17:37
666

最近学习了OLLVM,代码工程链接。我对原有代码添加了注释并做了代码分析。

以ll文件中的语句举例。

混淆前:

混淆后:

sw.bb4模块代码对比图:

图片描述

@_Z9calculateddc_IndirectBrTargets是目标块地址加密数组:

首先定义了一个全局数组@_Z9calculateddc_IndirectBrTargets,它包含两个指针:

sw.bb4基本块中:

这个代码是在实现某种控制流混淆(control flow obfuscation)技术:

本质上,这段代码等价于:

但使用了复杂的间接跳转来实现相同功能。

这种技术使得静态分析难以确定控制流的目标,增加了逆向工程的难度。

逻辑在NumberBasicBlock内。目标基本块下文简写为目标块

逻辑在getIndirectTargets0函数内。根据目标块的地址加上一个随机的偏移,计算出一个新的地址,这个地址是目标块加密后的地址,多个目标块加密后的地址组成一个加密地址数组,例如:

这就是上文混淆后的加密地址数组。所谓的加密是指目标块地址加了-3224706807后,就是加密了。

TODO 待分析

TODO 待分析

遍历函数中的所有基本块找到其中的条件分支,判断条件分支的所有后继模块是否被第1步收集到,被收集到的情况下将其替换为间接跳转,转换前后对比:

LLVM条件跳转分支混淆对比图

相关代码:

相关代码:

相关代码:

double calculate(double a, double b, char op) {
    printf(calculate_print_format, a, b, op);
    switch (op) {
        case '+': return a + b;
        case '-': return a - b;
        case '*': return a * b;
        case '/':
            if (b != 0)
                return a / b;
            else
                // return 0.0 / 0.0; // NaN
                return -1; // NaN
        default:
            // return 0.0 / 0.0; // NaN
            return -1; // NaN
    }
}
sw.bb4:                                           ; preds = %entry
  %10 = load double, ptr %b.addr, align 8
  %cmp = fcmp une double %10, 0.000000e+00
  br i1 %cmp, label %if.then, label %if.else
sw.bb4:                                           ; preds = %entry
  %10 = load double, ptr %b.addr, align 8
  %cmp = fcmp une double %10, 0.000000e+00
  %11 = select i1 %cmp, i64 1, i64 0
  %12 = getelementptr [2 x ptr], ptr @_Z9calculateddc_IndirectBrTargets, i64 0, i64 %11
  %EncDestAddr = load ptr, ptr %12, align 8
  %13 = getelementptr i8, ptr %EncDestAddr, i64 3224706807
  indirectbr ptr %13, [label %if.then, label %if.else]
@_Z9calculateddc_IndirectBrTargets = private global [2 x ptr] [ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.else), i64 -3224706807), ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.then), i64 -3224706807)]
if (b != 0.0) 
    goto if_then;
else 
    goto if_else;
@_Z9calculateddc_IndirectBrTargets = private global [2 x ptr] [ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.else), i64 -3224706807), ptr getelementptr (i8, ptr blockaddress(@_Z9calculateddc, %if.then), i64 -3224706807)]

[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 6天前 被不歪编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回