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

  1. #1
    Membre à l'essai
    Lecture d'un exécutable sous la forme de tableau d'octets
    Bonjour,
    Dans le cadre d'un mémoire, je développe actuellement un programme permettant de sélectionner un fichier.exe, puis d'afficher son contenu sous forme d'octet à la manière d'un shellcode (\x45 \x76 \x00 ...)
    Cependant, je suis en face d'un problème, voici mon programme:
    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
    23
    24
    25
    26
    27
    void MainWindow::generate_shellcode()
    {
     
        qDebug()<<"\t===========================================================\n\t=\t  Génération du shellcode\t\t=\n\t===========================================================\n\n";
     
        //int i; //On initialise le curseur i
        //char c; //On initialise le curseur c
        QFile fichier(_file_path);
        if(fichier.open(QIODevice::ReadOnly)) //Si le fichier s'ouvre..
        {
             qDebug()<<"Fichier ouvert";
             _shellcode = fichier.readAll(); //_shellcode etant un QByteArray
             _sizeData = sizeof(_shellcode); //_sizeData est un unsigned char
             qDebug()<<"La taille de data est: "<<_sizeData;
             _shellcode.resize(_sizeData);
             qDebug()<<"\nVoici le shellcode: \n"<<_shellcode<<"\n";
             fichier.close();
     
        }
        else { //Sinon  on affiche une erreur
            qDebug()<<"Impossible d'ouvrir le fichier !";
            QString err = "Impossible d'ouvrir le fichier !";
            afficher_err(err);
     
        }
     
    }


    Cependant, j'obtient le résultat suivant:
    ================================
    = Génération du shellcode =
    ================================


    Fichier ouvert
    La taille de data est: 8

    Voici le shellcode:
    "MZ\x90\x00\x03\x00\x00\x00"

    Or mon fichier en .exe est bien plus grand que 8 octets, et il me semble que la lecture de celui-ci s'arrête à cause des caractère \x00 (fin de ligne).
    Je cherche donc comment contourner ce problème.
    Merci d'avance de vos réponses.

  2. #2
    Modérateur

    Bonsoir,

    Ton problème vient de la ligne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    _sizeData = sizeof(_shellcode);

    L'opérateur sizeof ne renvoie pas la taille de ce qui vient d'être lu, mais la taille de la variable en mémoire (= sizeof(QByteArray)), indépendante de la taille du fichier lu.
    Il te faut utiliser à la place la fonction membre size() de QByteArray :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    _sizeData = _shellcode.size();


    Cependant, tu mentionnes en commentaire // _sizeData est un unsigned char, je rappelle au cas où que la valeur maximale de ce type est de 255.
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).
    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Mes extensions FireDVP (Firefox), ChroDVP (Chrome) : suivi des nouveaux messages, boutons/raccourcis et bien plus !

  3. #3
    Membre à l'essai
    Tout d'abord merci beaucoup de ta réponse winjerome.
    En effet, size() fonctionne beaucoup mieux j'obtiens bien la taille attendue.
    J'ai également regardé pour le type de _sizeData, autant pour moi je me suis trompé je l'avais désigné comme étant un int (peut-être qu'un long int serait plus approprié à l'avenir selon la taille des fichiers lus...).
    Maintenant mon qDebug() n'affiche plus les octets mais ca ne doit pas être sorcier, je retourne à mes recherches.

    Encore merci

###raw>template_hook.ano_emploi###