Ghosts In The Stack

Commentaires - Les shellcodes

Poster un commentaire - Retour à l'article

Commentaires

yassine, le 15/08/2012 :

Bonjour,
J'ai bien compris comment faire et bien executé les shell code, merci de l'explication detaillé, mais j'aimerais savoir deux choses :

- Pourquoi chercher un shell à partir de sa machine et
- Aussi comme exploiter ce shellcode pour attaquer une autre machine

Merci de ma repondre

Réponse :

Bonjour,

- Pourquoi chercher un shell à partir de sa machine
C'est généralement pour une élévation de privilèges. Passer d'un utilisateur standard à root. Après tu peux faire un shellcode qui te permettra de te connecter à distance ce qui est utile pour des failles en remote.

- Aussi comme exploiter ce shellcode pour attaquer une autre machine
Pour se faire il te faudra une faille type buffer overflow ou autre, elle servira à rediriger le flux d'exécution vers ton shellcode.

paul, le 19/06/2009 :

Bonjours,

Déjà pour commencer je tien à dire que le tutoriel est bien expliqué, ce qui est rare.

Pour ceux qui veulent tester d'autres shellcodes sous différentes plates-formes il y a ce site http://www.shell-storm.org/shellcode/ qui est entre autre une grande base de donnée de shellcodes.

Voila et bonne continuation à vous. :)

noname, le 31/03/2009 :

C'est exactement ca, tu as compris le sens de mon post, je répondais au précédent en expliquant qu'il était possible de faire ce shellcode juste en modifiant la taille du registre, mon shellcode était donc fonctionnel je me posais juste la question du pourquoi le numéro de syscall de write() fonctionnel était bien 1 et pas 4 sur mon PC.
Pour info, comme dit dans mon précédent poste, j'ai bien un os 64 (donc sur un processeur compatible ca va de soi ^^)

Merci pour l'option de compilation pour le 32bits je ne connaissais pas.

Si je me permet de reposter c'est pour la suite de cet excellent tuto, j'ai pu compiler de beaux shellcodes en assembleur, je peux les éxecuter "à la main" en ligne de commande, mais impossible de les faire sauter sur la pile avec les différents programmes proposés en C.
J'ai un noyau récent donc je ne pense pas qu'il soit possible de l'injecter en utilisant une faille applicative, mais je voudrais quand meme pouvoir utiliser ce beau shellcode avec la fonction asm(); ^^

noname, le 20/02/2009 :

Voila pour ma part le message d'erreur que j'ai obtenu :
prompt$ as -o fic.o fic.s
fic.s: Assembler messages:
fic.s:14: Error: suffix or operands invalid for `pop'
le probleme venait certainement du fait que j'ai un processeur 64bits
x86_64, sur un os 64, j'ai donc modifié ecx en rcx, puis l'instruction pop (ou popl) en popq... (pour tester, car j'ai decouvert aujourd'hui l'assembleur avec ce tuto)
Resultat des modifications :
xorq %rcx, %rcx
popq %rcx
ca compile et ca fonctionne !
mais ca ne fonctionne qu'avec eax qui a pour valeur 4 comme dans le tuto et comme ce qui est dans le unistd_32.h de mon os et pas comme ce qui est dans le unistd_64.h ou je peux lire : #define __NR_write 4

Pourquoi ? ai je compilé pour une archi 32 sans le savoir ? fallait il changer quelquechose à ma compilation pour que eax ait pour valeur 1 ?

Réponse :

Ok, je suppose que tu voulais dire que le numéro de syscall de write() est différent sur Linux 64 bits. En effet je viens de vérifier :

$ grep write /usr/include/asm/unistd_32.h
#define __NR_write 4
...
$ grep write /usr/include/asm/unistd_64.h
#define __NR_write 1
...

Si chez toi ca ne marche que quand %eax vaut 4, il y a des chances que tu ais une distrib 32 bits. C'est mon cas, bien que mon processeur soir un AMD64. Par contre, le suffixe "l" pour les instructions (ex: popl et xorl) marche parfaitement chez moi, ce qui est vraiment bizarre.

Lance un "uname -a" pour vérifier ; si tu as "x86_64" qui apparaît à la fin, ta distib est 64 bits, sinon c'est du 32 bits (tu auras certainement "i386" ou "i686" ou un truc du genre).

Pour faire comprendre à l'assembleur que tu essaye de compiler du code 32 bits (en gardant "pop" ou "popl" dans le fichier source), essaye en ajoutant l'option --32 à as (as --32 -o fic.o fic.s) pour voir si ça marche.

jeerem, le 11/01/2009 :

bonjour,
je viens de découvrir votre site,et le parcours plus qu'avidement.
étant en iut geii, et ayant étudié l'assembleur, je me suis penché sur ce tuto.

Le problème est que j'ai exactement les mêmes erreurs que Mikey: les push et pop ne marchent pas. J'ai beau mettre:
popl %ecx
pop %ecx
popl ecx
le seul qui "marche" est pop ecx.

Il fonctionne pour la ligne
as -o asm.o asm.s

mais la ligne
ld -o asm asm.o me dit <undefined reference to 'ecx'>.


Avez vous compris l'origine du problème? ma version gcc est la 4.2.4 (et je suis sous ubuntu hardy 8.04)

Réponse :

C'est tres curieux... La syntaxe habutuelle de gas (l'assembleur GNU) est bien "pop %ecx" (ou "popl %ecx" pour insister sur le cote 32bits de l'operation).
Si tu mets "pop ecx", gas va croire qu'ecx est une reference memoire et s'attend a ce au'elle soit declaree auelaue part, ce aui n'est pas le cas (c'est pour ca aue ld echoue).
Peux-tu me donner l'erreur retournee par l'assembleur quand tu mets "popl %ecx" ?

dloic, le 25/09/2008 :

A force d'entendre parler du site, je m'y suis penché. Je commence donc doucement ma lecture, avec ce premier article:

Très intéressant et très didactique. J'avoue avoir eu un peu de mal au début avec la pile, à croire que Marie-Jo n'en a pas assez parlé ;)

Je continue avec les autres articles !
Bisous à Trance !

Mikey, le 28/01/2008 :

Bonjour!

Tout d'abord, bravo pour ce tuto très bien expliqué.

J'ai tenté de reproduire les manipulations pour obtenir le shellcode qui execute un shell. J'ai codé le fichier en c, aucun souci. Par contre, en assembleur, j'ai trois erreurs à la compilation que je n'arrive pas à résoudre:

=> Error: suffix or operands invalid for `push'
=> Error: suffix or operands invalid for `push'
=> Error: suffix or operands invalid for `push'

Ces erreurs correspondent aux lignes suivantes :

=> push %edx
=> push %edx
=> push %ebx

Malgré mes recherches et mes connaissances restreintes en assembleur, je n'ai pas trouvé de solution à ce problème.
J'ai bien essayé un autre compilateur, mais cela a engendré d'autres problèmes beaucoup plus compliqués :(

Je travaille sur une version Linux Suse 10.3, et ma version de gcc est la 4.2.1.

Voyez-vous une solution à ce problème?

Cordialement,

Mik

Réponse :

Salut,

A vrai dire je ne vois pas trop... Essaye d'utiliser les instructions "pushl" à la place de "push" pour voir, au cas où... Mais j'avoue que c'est assez curieux car je n'ai jamais eu ce problème. Si ça ne marche toujours pas, essaye de chercher de la doc sur la syntaxe utilisée par gas (c'est le nom de l'assembleur de gcc).

Bonne chance !

Geo, le 29/05/2007 :

Bon bon bon... Je me suis arrêté au test du shellcode. J'ai suivi l'article au doigt et à l'oeil, puis après j'ai ça :

geo@saphira:~/shellcodes$ gcc -o testasm testasm.c
/tmp/cc1ypNyL.s: Assembler messages:
/tmp/cc1ypNyL.s:41: Warning: indirect jmp without `*'
geo@saphira:~/shellcodes$ ./testasm
Erreur de segmentation (core dumped)
geo@saphira:~/shellcodes$

En gros ça marche pas. Pourquoi donc ? (Je ne comprends pas tout mais je teste l'article la première fois pour ensuite me plonger en profondeur dedans).

Pour info, j'utilise ubuntu feisty fawn, et j'ai GCC (mais je ne connais pas le numéro de la version. En tout cas je doute que ça puisse venir de là...)

Réponse :

La gestion de la pile sous gcc4.x est pas la meme que celle des autres gcc, résultat le "jmp %esp" fait sauter trop haut sur la pile. Voici un autre petit code que je vien de faire pour pallier à ce problème :

*****************************
char sh[] = "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\x04"
"\xb3\x01\xeb\x05\x59\xb2\x0d\xcd\x80\xe8"
"\xf6\xff\xff\xffHello World !";

void * SCode() {
return &sh;
}

int main()
{
SCode();
asm("jmp * %eax");
return 0;
}
**********************

Heurs

Poster un commentaire

Les commentaires sont soummis à certaines règles, qui sont une question de bon sens.

Utilisez-les à bon escient. Vous pouvez donnez votre opinion, vos critiques, nous signaler des fautes, apporter des précisions. Vous pouvez également nous poser des questions ; nous essaierons de vous répondre dans la mesure du possible.

Ne confondez pas commentaires et forum ; votre commentaire doit être en rapport avec l'article. Si vous souhaitez donner un commentaire général sur le site, envoyez-nous plutôt un mail.

Merci de nous laisser votre adresse e-mail, afin que nous puissions vous recontacter si besoin. Le code HTML n'est pas interprété dans les commentaires.

Les commentaires sont soummis à une validation des administrateurs. S'ils ne respectent pas ces règles, ils seront systématiquement refusés. Merci de votre compréhension ;-)