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 :

lançer un code contenu dans un buffer


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    rien
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : rien
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut lançer un code contenu dans un buffer
    Kikou tout le monde!
    Je fais appel à vous car je suis tombé sur un code, je sais ce qu'il fait, je sais qu'il utilise un pointeur sur fonction mais j'ai du mal à comprendre la syntaxe utilisée. donc si une personne sympa pouvait me commenter au maximum la syntaxe de la ligne commentée car je ne voit pas comment se transmet l'adresse du buffer.
    merci d'avance!

    Voici le code:(il vient d'un tuto ici: http://re-xe.com/?p=505)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char code[] = "\xEB\x68\x33\xC9\x64\x8B\x71\x30\x8B\x76\x0C\x8B\x76\x1C\x8B\x46\x08\x8B\x7E\x20\x8B\x36\x38\x4F\x18\x75\xF3\xC3\x60\x8B\x6C\x24\x24\x8B\x45\x3C\x8B\x54\x28\x78\x03\xD5\x8B\x4A\x18\x8B\x5A\x20\x03\xDD\xE3\x34\x49\x8B\x34\x8B\x03\xF5\x33\xFF\x33\xC0\xFC\xAC\x84\xC0\x74\x07\xC1\xCF\x0D\x03\xF8\xEB\xF4\x3B\x7C\x24\x28\x75\xE1\x8B\x5A\x24\x03\xDD\x66\x8B\x0C\x4B\x8B\x5A\x1C\x03\xDD\x8B\x04\x8B\x03\xC5\x89\x44\x24\x1C\x61\xC3\x83\xEC\x0C\x8B\xEC\xE8\x8E\xFF\xFF\xFF\x8B\xD0\x68\x8E\x4E\x0E\xEC\x52\xE8\x9B\xFF\xFF\xFF\x89\x45\x04\x68\x7E\xD8\xE2\x73\x52\xE8\x8D\xFF\xFF\xFF\x89\x45\x08\x33\xDB\xEB\x31\x58\x88\x58\x0A\x50\xFF\x55\x04\x8B\xD0\x68\xA8\xA2\x4D\xBC\x52\xE8\x71\xFF\xFF\xFF\x89\x45\x0C\x33\xDB\xEB\x25\x5E\x88\x5E\x09\xEB\x2E\x5F\x88\x5F\x0B\x53\x56\x57\x53\xFF\x55\x0C\x53\xFF\x55\x08\xE8\xCA\xFF\xFF\xFF\x75\x73\x65\x72\x33\x32\x2E\x64\x6C\x6C\x23\xE8\xD6\xFF\xFF\xFF\x53\x68\x65\x6C\x6C\x63\x6F\x64\x65\x23\xE8\xCD\xFF\xFF\xFF\x68\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x23";
     
    int main(int argc, char **argv)
    {
    int (*func)();
    func = (int (*)()) code; //pourquoi ne donne t'on pas directement &code[0]??
    (int)(*func)();
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Bonjour,

    La ligne en question transtype (« caste ») l'adresse de « code » en mémoire en pointeur de fonction et l'affecte à « func ». Apparemment, les données contenues dans le tableau de caractères « code » sont en fait du code compilé en langage machine, prêt à être exécuté.

    Seulement, ça ne fonctionnera pas en l'état car les systèmes d'exploitation courants, notamment sur PC, rangent code, données et données en lecture seule dans des segments différents et les segments de données sont configurés pour être privés du droit d'exécution. Il est fort probable que cela se termine en segfault.

    Sache que lorsqu'on définit le type d'une variable, les termes qui le composent sont toujours à gauche du nom de variable, sauf pour les parenthèses d'un pointeur de fonction « (…) » ou les crochets d'un pointeur de tableau « […] ».

    La ligne 5 se décompose alors comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        int (*func)(); // Nom de la variable à déclarer
        int (*func)(); // … précédée par « * » : un pointeur
        int (*func)(); // Parenthèses nécessaires éviter une ambiguïté
        int (*func)(); // L'expression s'applique à une fonction sans paramètre ou dont le nombre est inconnu
        int (*func)(); // Cette fonction est de type int, donc renvoie un entier
    … et la ligne 6 se lit donc ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        func = (int (*)()) code; // Type pointeur sans le nom de variable
        func = (int (*)()) code; // Parenthèses pour les mêmes raisons
        func = (int (*)()) code; // Pointeur sur fonction de type int
        func = (int (*)()) code; // Parenthèses encadrant l'expression : transtypage
        func = (int (*)()) code; // On transtype la valeur de « code », donc l'adresse du tableau
        func = (int (*)()) code; // … et on affecte cette adresse à « func », déclarée pour cela une ligne plus haut.

  3. #3
    Membre averti
    Homme Profil pro
    rien
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : rien
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut
    merci à toi Obsidian d'avoir éclairé ma lanterne!
    je comprend un peu la logique sur la section .data dans le format PE, mais apparemment sur le tuto, il se sert de ça pour lancer son shellcode...
    malgré que je sois en accord avec toi pour le coté "non-executable" de la section .data d'un exe...
    (...Peut être que le compilateur change les attributs de la section pour le rendre executable? mais je ne pense pas... (il n'est quand même pas si intelligent que ça non?), de plus, je ne m'avancerai pas par manque de connaissances précises sur la chose...
    Si d'ailleurs si quelqu'un connait le pourquoi du comment du dilemme, je suis preneur!)
    sinon, j'étais assez loin de penser que cela servait à caster.
    (j'avais un doute, mais je me croyais à côté de la plaque!)
    merci pour les couleurs sur le texte, c'est beaucoup plus clair maintenant!
    PS: Désolé pour le lien, mais quand je clique dessus, il est fonctionnel...
    à toute!

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    La gestion des droits sur les pages mémoire se fait par l'OS et le CPU.
    Donc il faut avoir une vieille version de ton OS et/ou les options de sécurité désactivées.

    Typiquement, pour profiter des ces failles :
    1) Ne PAS compiler avec l'ASLR
    2) Ne PAS compiler avec les canaris/cookies de sécurité
    3) Désactiver les protections sur pile/tas
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Membre averti
    Homme Profil pro
    rien
    Inscrit en
    Février 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : rien
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 13
    Par défaut
    merci metalman pour ces précision, car je croyais que l'ASLR était une protection mise en place par windows, j'étais loin de penser que c'était une "option" de compilation... (comme quoi, j'ai encore beaucoup de route à faire...).
    Je vais clore le sujet.
    merci à vous d'avoir pris le temps de répondre à mes question!
    à plus tard

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Windows doit pouvoir le gérer, mais de souvenir c'est une option dans VS...
    En effet : les vieux Windows ne savent pas charger aléatoirement les @ de début...

    Ah ! en cherchant... je crois que tout est en option de compil'/link ! (cf les pièces jointes)
    Images attachées Images attachées   
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

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

Discussions similaires

  1. Code contenu dans une variable
    Par tilb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/01/2009, 22h13
  2. Réponses: 15
    Dernier message: 09/05/2008, 17h11
  3. Réponses: 7
    Dernier message: 11/03/2007, 09h35
  4. Afficher le code contenu dans un include?
    Par Death83 dans le forum Langage
    Réponses: 9
    Dernier message: 02/09/2006, 08h59
  5. Utiliser openGL et obtenir le contenu dans un buffer
    Par delfare dans le forum OpenGL
    Réponses: 7
    Dernier message: 21/04/2006, 14h13

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