Shellcode
Shellcode est un terme de programmation et décrit un très petit patch d' instructions assembleur converti en opcodes , avec lequel l'intention est de manipuler un programme ou un système, ou de l'utiliser à des fins non prévues. Il essaie souvent de démarrer un shell , d'où son nom. Les Shellcodes ont leurs origines dans le buffer overflow et autres attaques par injection de code, mais ils peuvent également être utilisés dans les logiciels , notamment les tests de pénétration , dans l'expérimentation et dans la didactique.
Création de shellcodes
Pour générer du code shell, la commande à exécuter peut être écrite en C et traduite avec un compilateur . Le programme généré est maintenant désassemblé (retraduit) et la fonctionnalité du programme reprogrammée en langage d'assemblage. De nombreuses instructions peuvent être omises ou raccourcies. Avec de nombreux exploits , le code shell ne doit pas contenir un octet 0 car cela marque la fin de la chaîne en C. En général, d'autres obstacles doivent être évités, par exemple seules les lettres et les chiffres sont autorisés ou les lettres majuscules et minuscules sont modifiées ou certains décalages doivent être respectés, ce qui peut être obtenu en remplissant des chaînes plus ou moins créatives de zéro opération (dites diapositives NOP ) peut être.
Au lieu d'exécuter votre propre code, ce qui n'est pas toujours possible (par exemple lors de l'utilisation de la protection de la mémoire ), vous pouvez également passer directement aux fonctions souhaitées qui sont disponibles, par exemple, dans le programme lui-même ou dans une bibliothèque chargée , par exemple la libc. Cette procédure est appelée retour dans la libc .
exemple
Shellcode local execve (/ bin / sh)
Le code assembleur (architecture 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 chaîne de l'opcode:
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";
Cependant, ce code n'est pas très intelligent car il contient des octets nuls et est assez long. Pour éviter les «caractères indésirables», des encodeurs sont souvent utilisés, qui permettent le masquage et le démasquage ultérieur de ces caractères et éventuellement aussi de compresser le shellcode. Il existe également d'autres techniques pour trouver l'adresse de la chaîne qu'un «jmp» ou un «appel». Par exemple, il est possible de simplement /bin/shpousser sur la pile. L' esp contient alors l'adresse.
Littérature
- Jack Koziol: Le manuel du Shellcoder. Découvrir et exploiter les trous de sécurité. Wiley, Indianapolis EN 2004, ISBN 0-7645-4468-3 .
- Jon Erickson: Code interdit. mitp, Bonn 2004, ISBN 3-8266-1457-7 .
liens web
Preuve individuelle
- ↑ Source: phrack.org ( Mémento du 11 février 2008 dans les archives Internet )