Shellcode
Shellcode es un término de programación y describe un parche en su mayoría muy pequeño de instrucciones de ensamblador convertidas en códigos de operación , con el cual la intención es manipular un programa o sistema, o usarlo para propósitos no previstos. A menudo intenta iniciar un shell , de ahí el nombre. Los shellcodes tienen su origen en el desbordamiento de búfer y otros ataques de inyección de código, pero también se pueden usar en software , especialmente en pruebas de penetración , en experimentación y en didáctica.
Creando shellcodes
Para generar código de shell, el comando a ejecutar se puede escribir en C y traducir con un compilador . El programa generado ahora se desmonta (se vuelve a traducir) y la funcionalidad del programa se reprograma en lenguaje ensamblador. Muchas instrucciones se pueden omitir o acortar. Con muchos exploits , el código de shell no debe contener un byte 0 porque esto marca el final de la cadena en C. En general, se deben evitar otros obstáculos, por ejemplo, solo se permiten letras y números o se cambian letras mayúsculas y minúsculas, o se tienen que respetar ciertas compensaciones, que se pueden lograr llenando con cadenas más o menos creativas de operaciones cero (las llamadas diapositivas NOP ) puede ser.
En lugar de ejecutar su propio código, lo que no siempre es posible (por ejemplo, cuando se usa la protección de memoria ), también puede saltar directamente a las funciones deseadas que están disponibles, por ejemplo, en el programa mismo o en una biblioteca cargada , por ejemplo libc. Este procedimiento se llama volver a libc .
ejemplo
Shellcode de ejecución local (/ bin / sh)
El código ensamblador (arquitectura x86):
void main() {
__asm__("
jmp 0x2a # 3 bytes - springt direkt vor den String
popl %esi # 1 byte - Adresse des Strings wird in esi geladen
movl %esi,0x8(%esi) # 3 bytes - die Adresse des Strings wird in den Speicher geschrieben
movb $0x0,0x7(%esi) # 4 bytes - der String wird nullterminiert
movl $0x0,0xc(%esi) # 7 bytes - ein nullpointer für das environment
movl $0xb,%eax # 5 bytes - syscall-nummer in eax
movl %esi,%ebx # 2 bytes - ebx enthält die adresse von "/bin/sh"
leal 0x8(%esi),%ecx # 3 bytes - argumente, ein pointer auf den string und ein nullpointer
leal 0xc(%esi),%edx # 3 bytes - environment
int $0x80 # 2 bytes - interrupt wird ausgelöst
movl $0x1, %eax # 5 bytes - exit-interrupt
movl $0x0, %ebx # 5 bytes - wird vorbereitet
int $0x80 # 2 bytes - interrupt wird ausgelöst
call -0x2f # 5 bytes - ein call zurück, dabei wird der eip auf den Stack gepusht
.string \"/bin/sh\" # 8 bytes
");
}
La cadena de código de operación:
char shellcode[] =
"\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"
"\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"
"\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"
"\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3";
Sin embargo, este código no es muy inteligente porque contiene bytes nulos y es bastante largo. Para evitar "caracteres no deseados", a menudo se utilizan codificadores, que permiten enmascarar y desenmascarar posteriormente estos caracteres y posiblemente también comprimir el código de shell. También existen otras técnicas para averiguar la dirección de la cadena además de "jmp" o "call". Por ejemplo, es posible simplemente /bin/shempujar la pila. El esp entonces contiene la dirección.
literatura
- Jack Koziol: El manual de Shellcoder. Descubrimiento y explotación de agujeros de seguridad. Wiley, Indianápolis EN 2004, ISBN 0-7645-4468-3 .
- Jon Erickson: Código prohibido. mitp, Bonn 2004, ISBN 3-8266-1457-7 .
enlaces web
Evidencia individual
- ↑ Fuente: phrack.org ( Memento del 11 de febrero de 2008 en Internet Archive )