定义
在原来的汇编程序中加入一些干扰阅读的代码,这些代码可以看做是花指令。
这类题在ctf中很常见,但是要多加练习。
分类
总体上花指令分为两类,一类是可履行式花指令,另一类为不可履行式花指令(废物指令)。
对于可履行式花指令,望文生义就是能够正常运转的但又不改动原始程序逻辑性的一组无用指令。这类花指令有如下特色:
①能够正常运转;
②不改动任何寄存器的值;
③反汇编器能够正确反汇编该指令。
对于不可履行式花指令,是指被刺进到原始代码中但又不改动原始程序逻辑性的一组无用字节。这类花指令有如下特色:
①不行以正常运转;
②不改动任何寄存器的值;
③反汇编器或许会过错反汇编这些字节。
花指令的经典模型
1.伪装 vc
VC++程序的入口代码:
PUSH EBP
MOV EBP,ESP
PUSH -1
push 415448 -\___
PUSH 4021A8 // 在这段代码中类似这样的[操作数](https://baike.baidu.com/item/操作数)可以乱填
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTR DS:[EAX],AL //这条指令可以不要!
jmp 跳转到程序原来的入口点
2.跳转
somewhere:
nop //"胡乱"跳转的开始...
jmp 下一个jmp的地址 /在附近随意跳
jmp ... //...
jmp 原入口的地址 //跳到原始oep
新入口: push ebp
mov ebp,esp
inc ecx
push edx
nop
pop edx
dec ecx
pop ebp
inc ecx
loop somewhere //跳转到上面那段代码地址去!
3.伪装c
融合
把A的代码换成B的
push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov eax,fs:[0]
push eax
mov fs:[0],esp
pop eax
mov fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 老入口
4.c ++
push ebp
mov ebp,esp
push -1
push 111111
push 222222
mov eax,fs:[0]
push eax
mov fs:[0],esp
pop eax
mov fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
5.Microsoft Visual C++ 6.0
PUSH -1
PUSH 0
PUSH 0
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
SUB ESP,68
PUSH EBX
PUSH ESI
PUSH EDI
POP EAX
POP EAX
POP EAX
ADD ESP,68
POP EAX
MOV DWORD PTR FS:[0],EAX
POP EAX
POP EAX
POP EAX
POP EAX
MOV EBP,EAX
JMP 原入口
6.
在mov ebp,eax
后面加上
PUSH EAX
POP EAX
7.防杀精灵一号防杀代码
push ebp
mov ebp,esp
push -1
push 666666
push 888888
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
pop eax
mov dword ptr fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 入口
8.防杀精灵二号防杀代码
push ebp
mov ebp,esp
push -1
push 0
push 0
mov eax,dword ptr fs:[0]
push eax
mov dword ptr fs:[0],esp
sub esp,68
push ebx
push esi
push edi
pop eax
pop eax
pop eax
add esp,68
pop eax
mov dword ptr fs:[0],eax
pop eax
pop eax
pop eax
pop eax
mov ebp,eax
jmp 入口
9.防杀精灵终极防杀代码
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
push eax
jmp入口
10.木马彩衣(金色鱼锦衣)花代码
push ebp
mov ebp,esp
add esp,-0C
add esp,0C
mov eax,原入口
push eax
retn
11.木马彩衣(虾米披风)花代码
push ebp
nop
nop
mov ebp,esp
inc ecx
nop
push edx
nop
nop
pop edx
nop
pop ebp
inc ecx
loopd //跳转到下面那段代码地址去!
nop //"胡乱"跳转的开始...
jmp 下一个jmp的地址 //在附近随意跳
jmp ... //...
jmp 原入口的地址 //跳到原始oep
12.VC++5.0代码(木马彩衣无限复活袍):
PUSH EBP
MOV EBP,ESP
PUSH -1
push 415448 -\___
PUSH 4021A8 -// 在这段代码中类似这样的操作数可以乱填
MOV EAX,DWORD PTR FS:[0]
PUSH EAX
MOV DWORD PTR FS:[0],ESP
ADD ESP,-6C
PUSH EBX
PUSH ESI
PUSH EDI
ADD BYTE PTR DS:[EAX],AL //这条指令可以不要!
jo 00401000 //原入口
jno 00401000 //原入口
db 0e8h //花代码