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

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend