逆向工程 January 14, 2020

花指令学习

Words count 7.5k Reading time 7 mins. Read count 1000000

定义

在原来的汇编程序中加入一些干扰阅读的代码,这些代码可以看做是花指令。

这类题在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 //花代码

0%