ollvm去平坦化——D810去混淆

NewStarCTF_week3-011vm

第一次接触混淆,打开的时候我是有点懵逼的```…

刚开始

网上搜了一下,说是可以用D810去混淆,直接下载,这东西根本没法看。。。

具体安装过程略~

Edit->plugins-D-810或快捷键CTRL+shift+D启动D810

D810

1:选中你需要的反混淆规则,我是反ollvm所以选ollvm的 2:start 点击后右边会变成绿色loaded 3:回到需要反混淆的函数,F5大法好

解混淆后

舒服多了….吗?? 显然并不是,ENC那个加密函数点进去也很丑陋

ENC

xmmword_6010这几个数据有大用~,点进去那个TEA加密算法可以大概猜出来那个加密算法就是TEA,如果真的看不出来的话,可以试试用findcrypt这个插件,很容易就找到加密函数。

findcrypt

下面让我们进去详细看一下TEA的加密算法

TEA

很标准,然后就是那几个关键数据了,其实刚开始的xmmword_6010这几个数据,就是KEY和ENCODE_DATA(虽然传参的过程很抽象…但是应该是可以猜出来的) 轮数32,delta = 0x9E3779B9,仔细找找可以发现,不多说

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cstring>
#include <iomanip>
using namespace std;

string ToString(unsigned int x)
{
unsigned int temp = 256 * 256 * 256;
string ans = "";
for (int i = 0; i <= 3; i++)
{
int c = x / temp;
ans += char(c);
x -= c * temp;
temp /= 256;
}
reverse(ans.begin(), ans.end());
return ans;
}

int main()
{
unsigned int sum = 0, delta = 0x9E3779B9;
unsigned int key[5] = { 0x11121314,0x22232425,0x33343536,0x41424344 };
int i = 0;
unsigned int enc[] = { 0x38B97E28,0xB7E510C1,0xB4B29FAE,0x5593BBD7,
0x3C2E9B9E,0x1671C637,0x8F3A8CB5,0x5116E515 };
i = 0;
for (; i < 8;)
{
sum = delta * 32;
unsigned int v0 = enc[i], v1 = enc[i + 1];
for (int k = 0; k < 32; k++)
{
v1 -= (key[3] + (v0 >> 5)) ^ (sum + v0) ^ (key[2] + 16 * v0);
v0 -= (key[1] + (v1 >> 5)) ^ (sum + v1) ^ (key[0] + 16 * v1);

sum -= delta;


}
i = i + 2;
cout << ToString(v0);
cout << ToString(v1);
}
}
// flag{011vm_1s_eZ_But_C0MP1EX_!!}
一道混淆的入门题就解决了 芜湖!! (之后有时间再去做一下其他的题完善一下这个博客~)