bluesadi / debogus

Deobfuscate OLLVM Bogus Control Flow via angr
62 stars 22 forks source link

在反混淆之后会将正常的代码也nop掉 #1

Open AimiP02 opened 1 year ago

AimiP02 commented 1 year ago

我使用的是其他人整合到llvm-12版本的ollvm,测试代码是我很久以前写的一个素数筛模板

#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

typedef long long ll;
const int maxn = 1e8;
const int inf = 0x3f3f3f3f;

int n, m;
int prime[maxn], top = 0;
bool not_prime[maxn];

int main() {
    scanf("%d %d", &n, &m);
    memset(not_prime, 0, sizeof(not_prime));
    not_prime[0] = not_prime[1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (!not_prime[i])
            prime[++top] = i;
        for (int j = 1; j <= top && i * prime[j] <= n; ++j) {
            not_prime[i * prime[j]] = 1;
            if (!(i % prime[j]))
                break;
        }
    }
    for (int i = 1; i <= m; ++i) {
        int x;
        scanf("%d", &x);
        printf("%d\n", prime[x]);
    }
    return 0;
}

使用clang++ test.cpp -mllvm -bcf -o bogusCFG编译出混淆过的程序,用IDA看的话是这样的

image image

但是直接使用脚本反混淆的话,会将很多原本的代码也nop掉

image image

因为我是刚入门不太懂,请问一下这是符号执行对基本块判断的问题吗,还是其他的原因,麻烦了。

bluesadi commented 1 year ago

n和m都是从外部输入的,可能n和m都被angr初始成0了,然后符号执行过程中就判断那两个循环内部都是不可达的,就nop掉了。具体的原因我还得调试一下。

AimiP02 commented 1 year ago

n和m都是从外部输入的,可能n和m都被angr初始成0了,然后符号执行过程中就判断那两个循环内部都是不可达的,就nop掉了。具体的原因我还得调试一下。

原来如此,我学一下调试看一下,谢谢回复