对抗反汇编的目的是增加分析成本,让恶意代码变得难以分析
可执行代码的序列可以有多种反汇编表达,对抗反汇编就是欺骗反编译器生成错误的指令
反汇编有两种:线性反汇编(已过时),面向代码流反汇编(常见)
笔记
对抗反汇编
**使用相同目标跳转指令:**反汇编每次只反一条指令,遇到判断还是会反汇编false分支,这个时候把数据插进去就会导致反汇编器识别错误
#include <iostream>
int main()
{
__asm {
jz LABEL1;
jnz LABEL1;
__emit 0e8h;
}
LABEL1:
std::cout << "Hello World!\n";
}
**使用固定条件的跳转指令:**通过xor使得跳转条件一定成立,然后跟上面那个就一样了,只是用了另一种方法确保一定能跳转走,能正常运行
#include <iostream>
int main()
{
__asm {
xor eax, eax;
jz LABEL1;
__emit 0e9h;
}
LABEL1:
std::cout << "Hello World!\n";
}
**使用无效的反汇编指令:**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;
}
混淆控制流图
滥用返回指针:如下代码所示,这样用返回指针可以破坏ida静态分析识别的程序流程
#include <iostream>
int main(){
__asm{
call $+5;
add [esp], 5;
ret;
}
std::cout << "Hello World!\n";
return 0;
}
要恢复的话,需要把这三个指令填充为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!
-
这个二进制程序使用了何种对抗反汇编技术?
答:这个程序使用了花指令对抗反汇编,ida一打开到main函数,发现这里使用了固定条件跳转指令,会跳过机器码E8进行执行,这反汇编把E8当指令了
-
这个二进制程序使用了什么流氓机器码来欺骗反汇编过程?
答:如上图所示,是
E8
-
这种对抗反汇编用了多少次?
答:在主函数里用了5次
-
什么命令行参数能输出Good Job?
答:将e8的5字节花指令nop掉:
可见,输入要求就是
pdq
:
Lab 15-2
分析目标:Lab15-02.exe
修正程序:遇到跳转地址后面有+1的全部把中间跳过的字节nop掉
-
程序初始化请求的URL是什么?
初始化请求URL是拼接出来的:
-
User-Agent域是如何产生的?
答:main函数开头首先获取了主机名,然后进入for循环进行加密:轮转1位加密,加密后的密文就是User-Agent
-
初始化请求时,程序在内存页中查找什么?
从初始化请求到的内容中,请求的buffer里找
Bamboo::
字符串出现的位置,找到后,获取这个字符串后面的地址,然后再找到下一个::
,把值置零,这两个::
中间的内容作为url再次发起连接请求 -
程序如何处理它从页中提取的信息?
答:发起请求之后,将获取到的东西保存到了一个exe文件里,然后执行
Lab 15-3
分析目标:Lab15-03.exe,看似合法,功能远超想象
这个程序的功能很正常,就像是一个正常的进程信息查看工具,然而奇怪的地方,不注意还真发现不了
-
恶意代码怎样被初始化调用?
答:main函数开头,这里使用硬编码覆盖了main函数栈中的返回值(WindowsXP没有随机基址机制,所以这里硬编码可行),main函数执行完会跳转到这个地址去
-
恶意代码做了什么?
答:解密了两个字符串,下载了一个文件:
-
恶意代码使用了什么URL?
答:解密是使用了xor 0xFF进行解密的:
URL是:
-
恶意代码使用了什么文件名?
答:这个名字