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 :

probleme de pointeur


Sujet :

C

  1. #21
    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
    Citation Envoyé par bulki Voir le message
    Peut-être:

    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
     
    #include <stdlib.h>
    #include <stdint.h>
     
    char sysCall_exit[]=
      "\xB8\x01\x00\x00\x00"
      "\xBB\x05\x00\x00\x00"
      "\xCD\x80";
     
    int
    main (void)
    {
      uintptr_t *ret;
     
      ret = (uintptr_t *)(&ret + 7);
      *ret = (uintptr_t)sysCall_exit;       
      return 0;
    }
    qui donne ça:

    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
    21
    22
     
    08048384 <main>:
     8048384:       8d 4c 24 04             lea    0x4(%esp),%ecx
     8048388:       83 e4 f0                and    $0xfffffff0,%esp
     804838b:       ff 71 fc                pushl  -0x4(%ecx)
     804838e:       55                      push   %ebp
     804838f:       89 e5                   mov    %esp,%ebp
     8048391:       51                      push   %ecx
     8048392:       83 ec 10                sub    $0x10,%esp
     8048395:       8d 45 f8                lea    -0x8(%ebp),%eax
     8048398:       83 c0 1c                add    $0x1c,%eax
     804839b:       89 45 f8                mov    %eax,-0x8(%ebp)
     804839e:       8b 55 f8                mov    -0x8(%ebp),%edx
     80483a1:       b8 14 a0 04 08          mov    $0x804a014,%eax
     80483a6:       89 02                   mov    %eax,(%edx)
     80483a8:       b8 00 00 00 00          mov    $0x0,%eax
     80483ad:       83 c4 10                add    $0x10,%esp
     80483b0:       59                      pop    %ecx
     80483b1:       5d                      pop    %ebp
     80483b2:       8d 61 fc                lea    -0x4(%ecx),%esp
     80483b5:       c3                      ret
     80483b6:       90                      nop
    Mais c'est beaucoup trop fragile. D'ailleurs tu peux voir qu'à l'entrée de la fonction main, y'a un prologue différent par rapport aux autres fonctions.
    On était sous Windows, tu repasses sous un code linux, en l'occurrence celui ci ne fonctionne pas, celui la parcontre fonctionne sur 32 et 64 bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdint.h>
     
    char sysCall_exit[]=
      "\xB8\x01\x00\x00\x00"
      "\xBB\x05\x00\x00\x00"
       "\xCD\x80";
     
    int main (void)
    {
       uintptr_t *ret = (uintptr_t *)(&ret + 2);
       *ret = (uintptr_t)sysCall_exit;
       return 0;
    }
    et pitié mets nous une syntaxe intel quand tu désassembles :
    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
    21
    Dump of assembler code for function main:
    0x08048354 <main+0>:	lea    ecx,[esp+0x4]
    0x08048358 <main+4>:	and    esp,0xfffffff0
    0x0804835b <main+7>:	push   DWORD PTR [ecx-0x4]
    0x0804835e <main+10>:	push   ebp
    0x0804835f <main+11>:	mov    ebp,esp
    0x08048361 <main+13>:	push   ecx
    0x08048362 <main+14>:	sub    esp,0x10
    0x08048365 <main+17>:	lea    eax,[ebp-0x8]
    0x08048368 <main+20>:	add    eax,0x8
    0x0804836b <main+23>:	mov    DWORD PTR [ebp-0x8],eax
    0x0804836e <main+26>:	mov    edx,DWORD PTR [ebp-0x8]
    0x08048371 <main+29>:	mov    eax,0x8049550
    0x08048376 <main+34>:	mov    DWORD PTR [edx],eax
    0x08048378 <main+36>:	mov    eax,0x0
    0x0804837d <main+41>:	add    esp,0x10
    0x08048380 <main+44>:	pop    ecx
    0x08048381 <main+45>:	pop    ebp
    0x08048382 <main+46>:	lea    esp,[ecx-0x4]
    0x08048385 <main+49>:	ret    
    End of assembler dump.

  2. #22
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    En effet c'est dû au prologue pas comme sur le reste des fonctions ce qui fait que l'adresse de retour est un peu plus haut ...en tâtonnant cela a fonctionné ( avec un décalage tout comme sur le code de bulki )

    Au fait je suis sous linux et le shellCode est pour linux aussi. J'ai marqué en commentaire l'équivalent sous windows.


    Merci pour vos explications !

Discussions similaires

  1. probleme de pointeur ....
    Par berg dans le forum C
    Réponses: 6
    Dernier message: 12/01/2006, 23h46
  2. Probleme de pointeur
    Par Naruto_kun dans le forum C
    Réponses: 17
    Dernier message: 14/12/2005, 21h47
  3. Probleme de pointeurs
    Par mickyoun dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2004, 18h15
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 21h26
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 14h19

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