Binary Obfuscation & Deobfuscation

79
Binary Obfuscation & Deobfuscation By molgryn <[email protected]> 1

Transcript of Binary Obfuscation & Deobfuscation

Page 1: Binary Obfuscation & Deobfuscation

Binary Obfuscation & Deobfuscation

By molgryn <[email protected]>

1

Page 2: Binary Obfuscation & Deobfuscation

What is obfuscation?

2

Page 3: Binary Obfuscation & Deobfuscation

What is obfuscation?

3

Page 4: Binary Obfuscation & Deobfuscation

What is obfuscation?

Wally

Other people

4

Page 5: Binary Obfuscation & Deobfuscation

What is obfuscation?

Wally = *REAL* code

Other people = Dummy

5

Page 6: Binary Obfuscation & Deobfuscation

Why?

6

Can you guess what this code is for?

Page 7: Binary Obfuscation & Deobfuscation

Why?

To protect my code

Programmers like it!

but, Malware-developers like it too!

7

Page 8: Binary Obfuscation & Deobfuscation

How?

Data-flow Obfuscation

Control-flow Obfuscation

Other techniques

8

Page 9: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation

Dead-code insertion

Substituting instructions

9

Page 10: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

Jump chains

Opaque predicate

Control-flow flattening

10

Page 11: Binary Obfuscation & Deobfuscation

Other techniques

Self-modifying code

Junk code

VM-based obfuscation

11

Page 12: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation

12

Page 13: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation -Dead code insertion-

What is ‘dead code’ ?

13

Page 14: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation -Dead code insertion-

NOP

PUSH EAX MOV EAX, 1 POP EAX

PUSH EAXADD ESP, 4

JMP A XOR EAX, 1

A:

MOV EAX, 1 SUB EAX, 2 MOV EAX, 3

14

Page 15: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation -Substituting instructions-

1 Instruction -> ’n’ Instructions

15

Page 16: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation -Substituting instructions-

PUSH EAX

SUB ESP, 4 MOV [ESP], EAX

PUSH 1337 MOV [ESP], EAX

16

Page 17: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation -Substituting instructions-

MOV EAX, 1

MOV EAX, 1000 SUB EAX, 999

MOV EAX, 1000 XOR EAX, 1001

17

Page 18: Binary Obfuscation & Deobfuscation

Data-Flow Obfuscation -Substituting instructions-

MOV EAX, 1000

ADD EAX, 1234

SUB EAX, 1337

XOR EAX, 1337

ADD EAX, 1337

SUB EAX, 3056

MOV EAX, 1

18

Page 19: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

19

Page 20: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Jump chains-

1 Code block -> ’n’ Code blocks

20

Page 21: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Jump chains-

What is next instruction?

PUSH EBP MOV EBP, ESP SUB ESP, 0x4

.

.

.

SUB ESP, 0x4 JMP

PUSH EBP JMP

MOV EBP, ESP JMP

21

Page 22: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Opaque predicate-

It looks like conditional

But, always be True

Or always be False

22

Page 23: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Opaque predicate-

MOV EAX, 1 CMP EAX, 0

JNZ

CALL GetCommandLineCMP EAX, 0

JNZ

23

Page 24: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Opaque predicate-

24

MOV EAX, 1 CMP EAX, 0

JNZ

CALL GetCommandLineCMP EAX, 0

JNZ

Too easy, Isn’t it?

Page 25: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Opaque predicate-

(x * 2) % 2 == ?

(x + 1)%2 + x%2 == ?

(x**2 + x) % 2 == ?

25

Page 26: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Opaque predicate-

(x * 2) % 2 == 0

(x + 1)%2 + x%2 == 1

(x**2 + x) % 2 == 0

26

Page 27: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Opaque predicate-

27

Page 28: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Control-flow flattening-

28

Page 29: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Control-flow flattening-

29

Different Nesting-leveled

Block

Equal Nesting-leveled

Block

Page 30: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Control-flow flattening-

30

Page 31: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Control-flow flattening-

31

Page 32: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Control-flow flattening / Before-

32

Page 33: Binary Obfuscation & Deobfuscation

Control-Flow Obfuscation

-Control-flow flattening / After-

33

Control-flow flattening + Jump chains + Opaque predicate

makes

Page 34: Binary Obfuscation & Deobfuscation

Other techniques

34

Page 35: Binary Obfuscation & Deobfuscation

Other techniques -Self-modifying code-

Do you know ‘Packer’ or ‘Protector’?

35

Page 36: Binary Obfuscation & Deobfuscation

Other techniques -Self-modifying code-

MOV ECX, 0 A:

XOR [0x401000+ECX], 0x34 INC ECX

CMP ECX, 0x1000 JL A NOP

0x401000

36

Page 37: Binary Obfuscation & Deobfuscation

Other techniques -Self-modifying code-

PUSH EBP MOV EBP, ESP

.

.

.

.

.

.

0x401000

37

MOV ECX, 0 A:

XOR [0x401000+ECX], 0x34 INC ECX

CMP ECX, 0x1000 JL A NOP

Page 38: Binary Obfuscation & Deobfuscation

Other techniques -Junk code-

Anti-Disassemble Technique

Linear Sweep Disassembler

Recursive Traversal Disassembler

It can be combined with others!

38

Page 39: Binary Obfuscation & Deobfuscation

Other techniques -Junk code-

39

B8 78 56 34 12 03 C3

MOV EAX, 0x12345678 ADD EAX, EBX

Page 40: Binary Obfuscation & Deobfuscation

Other techniques -Junk code-

40

B8 78 56 34 12 03 C3

MOV EAX, 0x12345678 ADD EAX, EBX

B8

JMP

Page 41: Binary Obfuscation & Deobfuscation

Other techniques -Junk code-

41

B8 78 56 34 12 03 C3

MOV EAX, 0x12345678 ADD EAX, EBX

B8

JMP

Page 42: Binary Obfuscation & Deobfuscation

Other techniques -VM-based obfuscation-

CPU is to execute assembly-instructions

Custom CPU?

42

Page 43: Binary Obfuscation & Deobfuscation

Other techniques -VM-based obfuscation-

Original Assembly code is converted to ‘byte code’

Byte bode will be executed by *Custom* CPU

43

Page 44: Binary Obfuscation & Deobfuscation

Other techniques -VM-based obfuscation-

Insert Custom CPU (Virtual CPU)

To execute byte code

Original asssembly-code will be removed

It is replaced to Jump code(To execute custom cpu)

44

Page 45: Binary Obfuscation & Deobfuscation

Other techniques -VM-based obfuscation-

45

MOV EAX, 1337 ADD EAX, 1337 XOR EAX, 1337

Page 46: Binary Obfuscation & Deobfuscation

Other techniques -VM-based obfuscation-

46

MOV EAX, 1337 ADD EAX, 1337 XOR EAX, 1337

setarg1 0xdeaddead get

xorret1 0x12345678 setarg1 ret1

seteax . . .

Page 47: Binary Obfuscation & Deobfuscation

Other techniques -VM-based obfuscation-

47

JMP VCPUsetarg1 0xdeaddead

get xorret1 0x12345678

setarg1 ret1 seteax ……

NEXT REAL-CODE

VCPU

Page 48: Binary Obfuscation & Deobfuscation

Other techniques -VM-based obfuscation-

48

JMP VCPUsetarg1 0xdeaddead

get xorret1 0x12345678

setarg1 ret1 seteax ……

NEXT REAL-CODE

VCPU

MOV EAX, 1337 ADD EAX, 1337 XOR EAX, 1337

Both b

rings

same re

sult!

Page 49: Binary Obfuscation & Deobfuscation

Examples

49

Page 50: Binary Obfuscation & Deobfuscation

Example -Ransomware(reversing.kr)-

50

Page 51: Binary Obfuscation & Deobfuscation

Example -My own obfuscator-

51

Page 52: Binary Obfuscation & Deobfuscation

Example -Themida-

52

Page 53: Binary Obfuscation & Deobfuscation

Obfuscation TIME TO SHOOT-THE-MOON

De

53

Page 54: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation-

54

X = 10 Y = X

Z = X + Y

X = 10 Y = 10

Z = 10 + 10

Page 55: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Folding-

55

X = 10 Y = 10

Z = 10 + 10

X = 10 Y = 10 Z = 20

Page 56: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

56

X = 10 Y = X

Z = X + Y Y = Z

X = 10 Y = 10

Z = 10 + 10 Y = Z

Propagation

Page 57: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

57

X = 10 Y = 10

Z = 10 + 10 Y = Z

X = 10 Y = 10 Z = 20 Y = Z

Folding

Page 58: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

58

X = 10 Y = 10 Z = 20 Y = Z

X = 10 Y = 10 Z = 20 Y = 20

Propagation

Page 59: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

59

mov eax, 0x1234 shl eax, 0x10

add eax, 0x4321 jmp eax

Propagation

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x1234 << 0x10 add eax, 0x4321

jmp eax

Page 60: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

60

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x1234 << 0x10 add eax, 0x4321

jmp eax

Folding

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x12340000 add eax, 0x4321

jmp eax

Page 61: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

61

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x12340000 add eax, 0x4321

jmp eax

Propagation

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x12340000 add eax, 0x4321

eax = 0x12340000 + 0x4321 jmp eax

Page 62: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

62

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x12340000 add eax, 0x4321

eax = 0x12340000 + 0x4321 jmp eax

Folding

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x12340000 add eax, 0x4321 eax = 0x12344320

jmp eax

Page 63: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Constant Propagation / Folding-

63

mov eax, 0x1234 ;eax=0x1234 shl eax, 0x10

;eax = 0x12340000 add eax, 0x4321

eax = 0x12344320 jmp eax

Propagation & Result

mov eax, 0x1234 mov eax, 0x12340000 mov eax, 0x12344321

jmp 0x12344321

Page 64: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Deadcode Removal-

Removing zero-mean codes

64

Page 65: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Deadcode Removal-

65

X = 10 Y = 10 Z = 20 Y = 20

X = 10 Z = 20 Y = 20

Page 66: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Deadcode Removal-

66

mov eax, 0x1234 mov eax, 0x12340000 mov eax, 0x12344321

jmp 0x12344321

mov eax, 0x12344321 jmp 0x12344321

Page 67: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Code Replacement-

67

PUSH EAXSUB ESP, 4

MOV [ESP], EAX

Page 68: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Code Replacement-

68

POP EAXMOV EAX, [ESP]

ADD ESP, 4

Page 69: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Code Replacement-

69

PUSH EAX MOV EAX, 1337

POP EAX

SUB ESP, 4 MOV [ESP], EAX MOV EAX, 1337 MOV EAX, [ESP]

ADD ESP, 4

Page 70: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Code Replacement-

70

SUB ESP, 4 MOV [ESP], EAX MOV EAX, 1337 MOV EAX, [ESP]

ADD ESP, 4

SUB ESP, 4 MOV [ESP], EAX MOV EAX, [ESP]

ADD ESP, 4

Page 71: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Code Replacement-

71

SUB ESP, 4 MOV [ESP], EAX MOV EAX, [ESP]

ADD ESP, 4

SUB ESP, 4 MOV [ESP], EAX

ADD ESP, 4

Page 72: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Code Replacement-

72

SUB ESP, 4 MOV [ESP], EAX

ADD ESP, 4MOV [ESP-4], EAX

Page 73: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Emulator-

To defeat Self-modifying code & etc

Pin

Custom emulator

73

Page 74: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -SMT Solver-

Compare (x * 2) % 2 and 0

(x * 2) % 2 == 0

(x * 2) % 2 != 0

74

Page 75: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -SMT Solver-

75

Page 76: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Code Cloning-

To break Control-flow flattening

Sharath K. Udupa, Deobfuscation: Reverse engineering obfuscated code

76

Page 77: Binary Obfuscation & Deobfuscation

SHOOT-THE-MOON -Custom Disassembler-

To see deobfuscated code

without any changes on code

77

Page 78: Binary Obfuscation & Deobfuscation

Q & A

78