夏洛魂

逆向分析

OLLVM研究之BCF

概述

BCF即虚假控制流,将原程序基本块进行拆分和克隆,利用不透明谓词将克隆的基本块作为不可达分支用来混淆静态代码,达到迷惑攻击者的目的.

OLLVM研究之FLA

概述

FLA即控制流平坦化,首先将原程序中switch结构转换成链式的平坦结构,然后创建loopEntry和loopEnd两个基本块来分发调度除第一个基本块外的所有原始基本块.

OLLVM调试

调试流程

  1. 准备一份测试代码.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//luoTst.c
#include <stdlib.h>
#include <stdio.h>
//int fun1(int a, int b) __attribute((__annotate__(("fla"))));
//int fun2(int a, int b) __attribute((__annotate__(("nofla"))));
//int main(int argc, char** argv) __attribute((__annotate__(("bcf"))));

int fun1(int a, int b){
  if(a + b > 10){
    return 10;
  }else{
    return 100;
  }
}

int fun2(int a, int b){
   if(a - b > 10){
    return 5;
  }else{
    return 50;
  }
}

int main(int argc, char** argv) {
  if(argc > 2){
    printf("hello world\n");
  }else{
    printf("hello ollvm\n");
  }
  printf("fun1:%d\n", fun1(argc, 6));
  printf("fun2:%d\n", fun2(argc, 8));
  return 0;
}
  1. 移植ollvm到单独的so.

luoOllvm.7z

OLLVM移植和使用

ollvm是一个基于llvm的开源项目,利用llvm会生成IR中间代码并通过pass进行优化的特点,通过增加Pass来对代码进行优化.但这种优化是为了让代码更加复杂,达到混淆的目的.主要有以下3种混淆手段:

0%