selph
selph
Published on 2021-11-17 / 810 Visits
0
0

恶意代码分析实战Lab15-对抗反汇编

对抗反汇编的目的是增加分析成本,让恶意代码变得难以分析

可执行代码的序列可以有多种反汇编表达,对抗反汇编就是欺骗反编译器生成错误的指令

反汇编有两种:线性反汇编(已过时),面向代码流反汇编(常见)

笔记

对抗反汇编

**使用相同目标跳转指令:**反汇编每次只反一条指令,遇到判断还是会反汇编false分支,这个时候把数据插进去就会导致反汇编器识别错误

#include <iostream>
int main()
{
	__asm {
		jz LABEL1;
		jnz LABEL1;
		__emit   0e8h;
	}
	LABEL1:
    std::cout << "Hello World!\n";
}

image-20211117092540379

**使用固定条件的跳转指令:**通过xor使得跳转条件一定成立,然后跟上面那个就一样了,只是用了另一种方法确保一定能跳转走,能正常运行

#include <iostream>
int main()
{
	__asm {
		xor eax, eax;
		jz LABEL1;
		__emit   0e9h;
	}
LABEL1:
    std::cout << "Hello World!\n";
}

image-20211117092755342

**使用无效的反汇编指令:**jmp指令命令和inc命令重合了,导致代码都是可执行的,但反编译出来就是有问题

#include <iostream>
int main()
{
    __asm {
        __emit 0ebh;    // eb ff jmp -1
        __emit 0ffh;    // ff c0 inc eax
        __emit 0c0h;    //
        __emit 048h;    // 48    dec eax
    }
    std::cout << "Hello World!\n";
    return 0;
}

**多次跳转的无效反汇编指令:**在刚刚的基础上增加了多次跳转

#include <iostream>
int main(){
    __asm {
        mov ax, 05ebh;
        xor eax, eax;
        __emit 074h;
        __emit 0fah;
        __emit 0e8h;
    }
    std::cout << "Hello World!\n";
    return 0;
}

image-20211117104659918

混淆控制流图

滥用返回指针:如下代码所示,这样用返回指针可以破坏ida静态分析识别的程序流程

#include <iostream>
int main(){
    __asm{
        call $+5;
        add [esp], 5;
        ret;
    }
    std::cout << "Hello World!\n";
    return 0;
}

image-20211117112851617

要恢复的话,需要把这三个指令填充为nop,然后Alt+P调整函数结束地址

可以通过IDA脚本来进行patch:

# 将鼠标指向的指令换成nop
def nopIt():
    start = get_screen_ea()
    end = next_head(start)
    for ea in range(start,end):
        ida_bytes.patch_byte(ea,0x90)
nopIt()

作业

Lab 15-1

分析目标:Lab15-01.exe,只接收一个参数,如果参数匹配,则输出Good Job!

  1. 这个二进制程序使用了何种对抗反汇编技术?

    答:这个程序使用了花指令对抗反汇编,ida一打开到main函数,发现这里使用了固定条件跳转指令,会跳过机器码E8进行执行,这反汇编把E8当指令了

    image-20211117142315217

  2. 这个二进制程序使用了什么流氓机器码来欺骗反汇编过程?

    答:如上图所示,是E8

  3. 这种对抗反汇编用了多少次?

    答:在主函数里用了5次

  4. 什么命令行参数能输出Good Job?

    答:将e8的5字节花指令nop掉:

    image-20211117143300201

    可见,输入要求就是pdq

    image-20211117143410214

Lab 15-2

分析目标:Lab15-02.exe

修正程序:遇到跳转地址后面有+1的全部把中间跳过的字节nop掉

  1. 程序初始化请求的URL是什么?

    初始化请求URL是拼接出来的:

    image-20211117150939191

  2. User-Agent域是如何产生的?

    答:main函数开头首先获取了主机名,然后进入for循环进行加密:轮转1位加密,加密后的密文就是User-Agent

    image-20211117151039571

  3. 初始化请求时,程序在内存页中查找什么?

    从初始化请求到的内容中,请求的buffer里找Bamboo::字符串出现的位置,找到后,获取这个字符串后面的地址,然后再找到下一个::,把值置零,这两个::中间的内容作为url再次发起连接请求

    image-20211117151317573

  4. 程序如何处理它从页中提取的信息?

    答:发起请求之后,将获取到的东西保存到了一个exe文件里,然后执行

    image-20211117151640799

Lab 15-3

分析目标:Lab15-03.exe,看似合法,功能远超想象

这个程序的功能很正常,就像是一个正常的进程信息查看工具,然而奇怪的地方,不注意还真发现不了

  1. 恶意代码怎样被初始化调用?

    答:main函数开头,这里使用硬编码覆盖了main函数栈中的返回值(WindowsXP没有随机基址机制,所以这里硬编码可行),main函数执行完会跳转到这个地址去

    image-20211117184546224

  2. 恶意代码做了什么?

    答:解密了两个字符串,下载了一个文件:

    image-20211117185913635

  3. 恶意代码使用了什么URL?

    答:解密是使用了xor 0xFF进行解密的:

    image-20211117190150180

    URL是:

    image-20211117191013909

  4. 恶意代码使用了什么文件名?

    答:这个名字

    image-20211117191247033


Comment