IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[Shellcode] Récupérer une string via "pop edi"


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut [Shellcode] Récupérer une string via "pop edi"
    Bonjour,

    Je suis entrain d'analyser un shellcode et je constate à la fin de celui-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "\x50\xff\x55\xf4\x39\xd8\x0f\x84\x14\xff\xff\xff\x83\xc7\x07\x57\xff\xd0\xc9\xc3"
    "\xe8\xc2\xff\xff\xff"
    "msvcrt.dll\n"
    En débuggant le shellcode, je constate que cette chaîne de caractère est récupérée au travers un "pop edi".

    Je voudrais tester cela en faisant un petit code asm sous visual C++ de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    __asm
    {
    	push    ebp		
    	mov     ebp,esp
    	mov     esp,ebp		
    	sub     esp,0x30
           ...	
           pop edi        ; <- je pointe sur ma chaine de caractères
           ...
    }
    Mais je ne vois pas comment je dois m'y prendre pour passer ainsi une chaîne de caractère afin de la récupérer via un "pop edi". Quelqu'un pourrait il me faire part de la méthode ou m'expliquer le principe?

    Merci

  2. #2
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    Pour ma part je ne comprend pas bien la question:
    Tu veux utiliser la MFC donc (en assembleur inline cela paraît un peu contradictoire mais tu as certainement de bonnes raisons).
    L'appel est de forme cCall dans ces cas là et c'est à toi de restaurer la pile.

    Il semblerait que le Lp demandé par cette api soit passé en entrée (via un push edi donc) et normalement récupéré en sortie par pop edi.

    mov edi Lp

    *push...
    *push edi
    *...

    Call MFC

    *pop...
    *pop edi
    *...

    *selon le nombre d'arguments utilisés par l'api de la MFC

  3. #3
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Pour ma part je ne comprend pas bien la question
    Oui je ne suis surement pas très clair dans ma requête.

    Tu veux utiliser la MFC donc (en assembleur inline cela paraît un peu contradictoire mais tu as certainement de bonnes raisons).
    Euh tu as déduis cela à partir de quoi car ce n'est pas du tout le cas...

    Il semblerait que le Lp demandé par cette api soit passé en entrée (via un push edi donc) et normalement récupéré en sortie par pop edi.

    mov edi Lp
    Justement ici ce n'est pas cela qui est mis en place et l'objet de ma question est justement de quelle manière cela a été réalisé?

    J'ai fourni la fin du shellcode que j'étudie où on aperçoit la chaine de caractères.
    En désassemblant, il n'y a pas au préalable de "mov edi Lp" suivi de "push edi" mais uniquement un "pop edi" pour pointer directement sur cette chaîne passée en fin de shellcode.

    Je me dis qu'il y a surement une directive assembleur à spécifier et si c'est bien le cas, c'est celle-ci que j'aimerais trouver.

  4. #4
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    msvcrt est est le nom de module de la dll de la MFC (ce n'est pas une supposition, c'est une affirmation).

    est une directive d'un HLL bien connu, utilisant les { et les ; à tour de bras, pour inclure de l'assembleur inline.

    de quelle manière cela a été réalisé ?
    Il faut que tu regardes dans la MFC et (re)trouves l'API du module utilisée. Regardes dans les arguments et tu (re)trouveras ton push Lp string.

    Maintenant, si tu expliquais ce que tu veux faire avec le contenu d'edi: Le copier, mesurer le nombre de caratère avec ou sans EOS... il serait nettement plus aisé de te faire une réponse ciblée et pertinente...

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    msvcrt est est le nom de module de la dll de la MFC (ce n'est pas une supposition, c'est une affirmation).
    est une directive d'un HLL bien connu, utilisant les { et les ; à tour de bras, pour inclure de l'assembleur inline.
    Je suis d'accord mais en aucun cas cela à un rapport avec l'utilisation d'API . J'aurais dû mettre une autre chaîne de caractères. En tout cas peu importe celle-ci.

    J'analyse un shellcode comme j'ai déjà dit, celui-ci n'est en aucun cas précédé d'un appel d'une autre fonction. On le charge en mémoire et on l'exécute. Ce shellcode harcode l'API LoadLibrary(), effectue un "pop edi", récupères ainsi un pointeur sur la chaîne de caractères en question (à la fin du shellcode), fait ensuite un "push edi" et enfin le call de LoadLibrary().

    Je voudrais connaître le principe de fonctionnement, le principe théorique? Pour essayer de mettre cela en pratique, j'utilise l'assembleur inline.

  6. #6
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    push eax         un argument sur la pile
    call D$esp-0C    call sur Lp passé en argument (2)
    cmp eax ebx      comparaison entre le retour de ton call et le contenu (?) d'ebx
    je xxx           si egalité saut au label xxx
    add edi 7        saute les 7 premiers ascii contenu dans edi (j'imagine..)
    push edi         Passe le famaux Lp a ton famaux call trumuche
    call eax         Call à une adresse contenue dans eax et différente de celle ebx
    leave            typiquement du code visual (Masm en fin de chaîne :mouarf:)
    ret              ret pas propre comme Masm les aime avec un leave bien pourri
    call ...         Je pense que c'est un call appelé en cas d'égalité eax ebx
    Cela semble correspondre à ta description

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer une string dans un TObject
    Par Delphi-ne dans le forum Langage
    Réponses: 6
    Dernier message: 05/07/2009, 23h16
  2. [Reflexion] Comment récupérer une class via son chemin python
    Par anthyme dans le forum Général Python
    Réponses: 2
    Dernier message: 27/12/2007, 13h16
  3. Récupérer une valeur via un autre script
    Par Olivier Regnier dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2007, 10h12
  4. Récupérer une string dans un fichier
    Par lynchmaniac dans le forum ANT
    Réponses: 3
    Dernier message: 27/12/2006, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo