domas xoreaxeaxeax christopher domas cyber security
play

{ domas, @xoreaxeaxeax Christopher Domas Cyber Security Researcher - PowerPoint PPT Presentation

The M/o/Vfuscator Turning 'mov' into a soul-crushing RE nightmare { domas, @xoreaxeaxeax Christopher Domas Cyber Security Researcher @ Battelle Memorial Institute ./bio objdump d Mintel a.out 4004e9: mov DWORD PTR


  1.  start: 0x100c  0x1000 mov …  0x1004 mov … ← Check if target OFF  0x1008 mov …  0x100c mov … ← … to here  0x1010 mov …  0x1014 mov …  0x1018 mov …  0x101c mov …  0x1020 mov …  0x1024 mov …  0x1028 mov …  0x102c mov …  0x1030 jmp start

  2.  start: 0x100c  0x1000 mov …  0x1004 mov … OFF  0x1008 mov … ← Check if target  0x100c mov … ← … to here  0x1010 mov …  0x1014 mov …  0x1018 mov …  0x101c mov …  0x1020 mov …  0x1024 mov …  0x1028 mov …  0x102c mov …  0x1030 jmp start

  3.  start: 0x100c  0x1000 mov …  0x1004 mov … OFF  0x1008 mov … Target match  0x100c mov … ← Switch to real data  0x1010 mov …  0x1014 mov …  0x1018 mov …  0x101c mov …  0x1020 mov …  0x1024 mov …  0x1028 mov …  0x102c mov …  0x1030 jmp start

  4.  start: 0x100c  0x1000 mov …  0x1004 mov … ON  0x1008 mov … Target match  0x100c mov … ← Switch to real data  0x1010 mov …  0x1014 mov …  0x1018 mov …  0x101c mov …  0x1020 mov …  0x1024 mov …  0x1028 mov …  0x102c mov …  0x1030 jmp start

  5.  Look up tables!  We ‟ re already stuck with byte data from before, so this is pretty easy Arithmetic

  6. unsigned char inc[]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112, 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128, 129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144, 145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160, 161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192, 193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208, 209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224, 225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240, 241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0 };

  7. incb: %assign y 1 %rep 256 db y&0xff %assign y y+1 %endrep

  8. ; increment eax with mov mov eax, [inc + eax] Arithmetic

  9. unsigned char dec[]={ 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, 111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126, 127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142, 143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158, 159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254 };

  10. decb: %assign y 256-1 %rep 256 db y&0xff %assign y y+1 %endrep

  11. ; decrement eax with mov mov eax, [dec + eax] Arithmetic

  12.  Logic gates can similarly be implemented as lookup tables Logic

  13. unsigned char and[2][2]={ { 0, 0 }, {0, 1} }; unsigned char or[2][2]={ { 0, 1 }, {1, 1} }; unsigned char not[2]={ 1, 0 }; and[1][0] or[0][1] not[1] Logic

  14. o: dd o_0, o_1 o_0: dd 0, 4 o_1: dd 4, 4 %macro or 3 mov eax, [%2] mov edx, [o+eax] mov eax, [%3] mov eax, [eax+edx] mov [%1], eax %endmacro

  15. a: dd a_0, a_1 a_0: dd 0, 0 a_1: dd 0, 4 %macro and 3 mov eax, [%2] mov edx, [a+eax] mov eax, [%3] mov eax, [eax+edx] mov [%1], eax %endmacro

  16. n: dd 4, 0 ; not %macro not 2 mov eax, [%2] mov eax, [n+eax] mov [%1], eax %endmacro

  17.  Our program loops forever  We need a way to stop it  Dolan: a special invalid address  Wait, that sounds familiar …  NULL  mov eax, [0] Halt

  18. nh: dd 0 ; halt h: dd nh, 0 mov eax, [b] mov eax, [h+eax] mov eax, [eax] Halt

  19. eq b, i, '+' neq b, i, '+' not b, off and b, b1, b2 or b, b1, b2 get eax, real, scratch, b inc eax dec eax on b off b Building Blocks

  20.  With enough macros, this becomes almost doable …  … in assembly Application

  21.  A C compiler is a lofty goal  Let ‟ s start with something simpler

  22. BrainF#$!

  23.  A minimalistic esolang  8 instructions  2 registers  Instruction pointer  Data pointer  We ‟ re going to call it BrainYuck BrainF#$!

  24. > Increment the data pointer < Decrement the data pointer + Increment the byte at the data pointer - Decrement the byte at the data pointer . Output the byte at the data pointer , Read one byte of input, store it at the data pointer [ If the byte at the data pointer is 0, jump forward to the matching ] ] If the byte at the data pointer is non-0, jump backward to the matching [

  25. # Halt

  26.  Print „ 1234 ‟ : ++++++++ ++++++++ ++++++++ ++++++++ ++++++++ ++++++++ + . + . + . + . +  Set the current data cell to 0: [ - ] BrainYuck

  27. ++++++++[>++++[>++>+++>+++> +<<<<-]>+>+>->>+[<]<-]>>.>- --.+++++++..+++.>>.<-.<.+++ .------.--------.>>+.>++. Hello, world!

  28. >++++++++++>+>+[[+++++[>++++++++<] >.<++++++[>--------<-]+<<<]>.>>[[- ]<[>+<-]>>[<<+>+>-]<[>+<-[>+<-[>+< -[>+<-[>+<-[>+<-[>+<-[>+<-[>+<-[>[ -]>+>+<<<-[>+<-]]]]]]]]]]]+>>>]<<<] Fibonacci Number Gen

  29. >+++++++++[<+++++++++++>-]<[>[-]>[-]<<[>+>+<<-]>>[<<+>>-]>>>>[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]>[<+>- ]>[<<++++++++++>>>+<>-]<<-<-]+++++++++>[<->-]>>+>[<[-]<<+>>>-]>[-]+<<[>+>-<<-]<<<>[>>+>+<<<-]>>>[<<<+ >>>-]>[<+>-]<<-[>[-]<[-]]>>+<[>[-]<-]<+++>+++++[<++++++<++++++>>-]>>>[>+>+<<-]>>[<<+>>-]<[<<<<<.>>>>> ->]<<<<<<.>>[-]>[-]++++[<++++++++>-]<.>++++[<++++++++>-]<++.>+>++++[<+++++++++>-]<.><+++++..--------. -------.>>[>>+>+<<<-]>>>>[<<<+>>>-]<[<<<<++++++++++++++.>>>>-]<<<<[-]>++++[<+++++++>>>+>-]<.>++++++++ +[<+++++++++>-]<--.---------.>+++++++[<------>>>---->-]<.>++++++[<+++++++++++>-]<.+++..+++++++++++++. >++++++>>>++[<---------->-]<--.>+++++++++[<+++++++++>-]<--.-.>++++++++>>>[<---------->-]<++.>++++++++ [<++++++++++>-]<++++.----------->>>-.---.>+++++++[<---------->-]<+.>++++++++[<+++++++++++>-]<-.>>>>++ [<----------->-]<.+++++++++++..>+++++++++[<---------->-]<>>>>-----.---.>>>[>+>+<<-]>>[<<+>>-]<[<<<<<. >>>>>-]<<<<<<.>>>+++>>>>+[<++++++>-]<--.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.>>>>><+++++..---- ----.-------.>>[>>+>+<<<-]>>>[<<<+>>>-]<[<<<<++>>>>>++++++++++++.>>>>-]<<<<[-]>++++[<++++++++>-]<.>++ +++++++[<++>>>>>+++++++>-]<--.---------.>+++++++[<---------->-]<.>++++++[<++>>>>>+++++++++>-]<.+++..+ ++++++++++++.>++++++++++[<---------->-]<>>>>>-.---.>+++++++[<++++++++++>-]<++++.+++++++++++++.+++++++ +++.>>>>>------.>+++++++[<---------->-]<+.>++++++++[<++++++++++>-]<-.>>>>>-.---------.>+++++++[<----- ----->-]<+.>+++++++[<++++++++++>->>>>>]<--.+++++++++++.++++++++.---------.>++++++++[<---------->-]>>> >><++.>+++++[<+++++++++++++>-]<.+++++++++++++.----------.>++++>>>>>+++[<---------->-]<++.>++++++++[<+ +++++++++>-]<.>+++[<----->>>>>>-]<.>+++[<++++++>-]<..>+++++++++[<--------->-]<--.>+++++++[<>>>>>+++++ +++++>-]<+++.+++++++++++.>++++++++[<----------->-]<++++>>>>>.>+++++[<+++++++++++++>-]<.>+++[<++++++>- ]<-.---.++++++.---->>>>>---.----------.>++++++++[<----------->-]<+.---.[-]<<<->[-]>[>>>>>-]<<[>+>+<<- ]>>[<<+>>-]>>>[-]<<<+++++++++<[>>>+<<[>+>[-]<<-]>>>>>>[<+>-]>[<<++++++++++>>>+<-]<<-<-]+++++++++>[<-> -]>>+>[<[-]<>>>>>><+>>>-]>[-]+<<[>+>-<<-]<<<[>>+>+<<<-]>>>[<<<+>>>-]<>>[<+>-]<>>>>>><-[>[-]<[-]]>>+<[ >[-]<-]<++++++++[<++++++<++++++>>-]>>>[>+>+>>>>>><<-]>>[<<+>>-]<[<<<<<.>>>>>-]<<<<<<.>>[-]>[-]++++[<+ +++++++>>>>>>>-]<.>++++[<++++++++>-]<++.>+++++[<+++++++++>-]<.><+++++..--->>>>>>-----.-------.>>[>>+> +<<<-]>>>[<<<+>>>-]<[<<<<++++++++++++++>>>>>>.>>>>-]<<<<[-]>++++[<++++++++>-]<.>+++++++++[<+++++++++> -]<->>>>>>-.---------.>+++++++[<---------->-]<.>++++++[<+++++++++++>-]>>>>>><.+++..+++++++++++++.>+++ +++++[<---------->-]<--.>+++++++++[>>>>>><+++++++++>-]<--.-.>++++++++[<---------->-]<++.>++++++++[<++ >>>>>>++++++++>-]<++++.------------.---.>+++++++[<---------->-]<+.>>>>>>>++++++++[<+++++++++++>-]<-.> ++[<----------->-]<.+++++++++++>>>>>>>..>+++++++++[<---------->-]<-----.---.+++.---.[-]<<<]

  30.  This is even worse than the movs! Why would you do this?!  With our building blocks, BF ops are easy to implement with mov  If I can get the code into BF, I can get it into movs  A BASIC to BF compiler already exists WHY!?

  31. not b, bs and b, b, bi mov eax, [b] mov ebx, [s_ms+eax] mov edx, [dp] mov eax, 0 mov al, [ebx+edx] mov al, [incb+eax] mov [ebx+edx], al +

  32. not b, bs and b, b, bd mov eax, [b] mov ebx, [s_ms+eax] mov edx, [dp] mov eax, 0 mov al, [ebx+edx] mov al, [decb+eax] mov [ebx+edx], al -

  33. not b, bs and b, b, bb mov eax, [b] mov ebx, [s_dp+eax] mov eax, [ebx] mov edx, 0 mov dx, [decw+2*eax] mov [ebx], edx <

  34. not b, bs and b, b, bf mov eax, [b] mov ebx, [s_dp+eax] mov eax, [ebx] mov edx, 0 mov dx, [incw+2*eax] mov [ebx], edx >

  35. mov eax, [bt] mov eax, [h+eax] mov eax, [eax] #

  36. not b, bs and b, b, bw mov eax, [b] mov eax, [s_mz+eax] mov edx, [dp] mov al, [eax+edx] mov [c], al mov eax, 4 mov ebx, 1 mov ecx, c . mov edx, 1 int 0x80

  37. not b, bs and b, b, br mov edx, [b] mov edx, [trim+edx] mov eax, 3 mov ebx, 0 mov ecx, c int 0x80 mov eax, [b] mov eax, [s_ms+eax] , mov dl, [c] mov [eax], dl

  38. and b, bo, bsf and b, bo, bsb mov eax, [dp] mov eax, [b] mov eax, [b] mov edx, 0 mov eax, [s_ns+eax] mov eax, [s_ns+eax] mov dl, [m+eax] mov edx, [eax] mov edx, [eax] mov [t], edx mov dl, [incb+edx] mov dl, [decb+edx] eq t, t, 0 mov [eax], edx mov [eax], edx not b, bs and b, b, t mov [t], edx and b, b, bo eq b, t, 0 mov eax, [b] and b, b, bo mov eax, [s_ns+eax] and b, b, bsb mov [eax], dword 1 mov eax, [b] mov eax, [b] mov eax, [s_bsb+eax] mov eax, [s_bsf+eax] mov [eax], dword 0 mov [eax], dword 4 [

  39. and b, bc, bsb and b, bc, bsf mov eax, [dp] mov eax, [b] mov eax, [b] mov edx, 0 mov eax, [s_ns+eax] mov eax, [s_ns+eax] mov dl, [m+eax] mov edx, [eax] mov edx, [eax] mov [t], edx mov dl, [incb+edx] mov dl, [decb+edx] neq t, t, 0 mov [eax], edx mov [eax], edx not b, bs and b, b, t mov [t], edx and b, b, bc eq b, t, 0 mov eax, [b] and b, b, bc mov eax, [s_ns+eax] and b, b, bsf mov [eax], dword 1 mov eax, [b] mov eax, [b] mov eax, [s_bsf+eax] mov eax, [s_bsb+eax] mov [eax], dword 0 mov [eax], dword 4 ]

  40.  Compiler  M/o/Vfuscate rot13  objdump  ./rot13 M/o/Vfuscator

  41.  We have two non-movs in our loop  We can fix this by setting up the execution environment correctly movs

  42.  int 0x80  Solve with MMIO  mmap stdin/stdout into the process memory  Use mov for I/O movs

Recommend


More recommend