• STATISTIQUES
  • Il y a eu un total de 2 membres et 9041 visiteurs sur le site dans les dernières 24h pour un total de 9 043 personnes!


    Membres: 2 605
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [EN] HackQuest
    Logic: 12, JavaScript: 14, Applet: 6, CrackIt: 13, Crypto: 11, Internet: 3, Exploit: 7, Stegano: 12, Flash: 1, Programmi...
    Challenges
    [EN] Reddit
    Subreddit dédié à la sécurité informatique.
    Hacking
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [EN] xda-developers
    Très bon site pour les gros bidouilleurs de smartphone de windows à androïd et de Apple jusqu'...
    Phreaking
    [EN] Security Traps
    Site de challenge qui prétend être construit non pas dans le but de parfaire vos connaissances, mais plutôt dan...
    Challenges
    [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C] le truc du dimanche qui sert à rien
23-12-2012, 20h33 (Modification du message : 23-12-2012, 20h35 par gruik.)
Message : #1
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
[C] le truc du dimanche qui sert à rien
un petit code qui ne sert absolument à rien en soit, à part être un peu didactique, sur la façon de simuler un try/except et capter un signal levé avec les fonctions sigsetjmp()/siglongjmp(), sur l'utilisation de la lib officielle de désassemblage sous linux et parfaitement sous-documentée : libopcodes, et sur une instruction assembleur aussi peu connue que peu utile : ud2

miroir du code ici pour plus de kawaïness

Code C :

#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
#include <bfd.h>
#include <dis-asm.h>

static jmp_buf escape;
extern char addr;

void pouet(int sig, siginfo_t *si, void *uc) {
        int ok = 1, c = 0;
        disassemble_info info;

        if ((sig != SIGILL) || (si->si_code != ILL_ILLOPN) || (si->si_addr != &addr)) ok = 0;
        if (ok) {
                INIT_DISASSEMBLE_INFO (info, stderr, fprintf);
                info.buffer = (unsigned char *)&addr;
                info.buffer_length = -1;
                info.buffer_vma = addr;
                fprintf (stderr, "illegal opcode : \"");
                c += (*print_insn_i386) (addr, &info);
                fprintf (stderr, "\" (");
                while (c--) fprintf (stderr, "\\x%02x", (unsigned int)*(&addr+1-c));
                fprintf (stderr, ") found at %p\n", &addr);
        }
        siglongjmp(escape, ok+1);
}

int main (void) {
        struct sigaction sa;
        sa.sa_sigaction = pouet;
        sa.sa_flags = SA_SIGINFO;
        sigfillset(&sa.sa_mask);
        sigaction(SIGILL, &sa, NULL);
        if (sigsetjmp(escape, 1) == 0) {
                asm volatile("addr: ud2");
        }
        return 0;
}
 


le fonctionnement global est le suivant, on déclare notre structure sa et on lui indique que la fonction de callback pour gerer les interruptions de type SIGILL est pouet(), la fonction sigaction remonte le tout au kernel

on tombe ensuite sur un if qui dépend du retour de sigsetjmp(), cette fonction sert en gros à faire une image de l'état du programme au moment où on invoque la fonction (ça sauvegarde le contexte de pile, l'env et les signaux concrètement)
la fonction retourne 0 si elle est invoquée directement et un nombre non nul si elle revient à travers un siglongjmp(), donc première fois qu'on tombe dessus, on rentre dans le if

là on cherche simplement à exécuter une instruction assembleur inline ud2, cette instruction ne sert qu'à une chose : feindre un opcode invalide, ce qui aura pour effet de lever une exception
notez le trick kawaï du extern char *addr en début de programme et du "addr: ud2" qui nous permet de référencer proprement l'adresse de notre instruction dans le binaire

une exception est donc levée et comme prévu c'est donc pouet() qui la récupère, on vérifie juste qu'elle correspond bien à celle que l'on attendait (signal SIGILL, type ILL_ILLOPN, à l'adresse addr), et le cas échéant on la désassemble et on affiche un kiki rigolo (ou pas mais on s'en fout)

alors vous me direz ça à l'air bien pénible d'utiliser la libopcodes et je vous répondrais qu'effectivement elle est aussi complète (elle permet de désassembler un grand nombre d'architectures) que peu documentée et pénible à utiliser, néanmoins elle a l'avantage d'être présente chez à peu près tout le monde (livrée via binutils, gdb et objdump reposent dessus typiquement) et l'exemple fourni ici pourra donc facilement être compilé et testé Wink

Code BASH :

$ sudo apt-get install binutils-dev
$ gcc -Wall pouet.c -o pouet -lopcodes
$ ./pouet
illegal opcode : "ud2    " (\x0f\x0b) found at 0x456789
 


enfin, siglongjmp() nous ramène sur notre if (sigsetjmp()) qui cette fois-ci, revenant à travers siglongjmp(), ne sera pas pris et ainsi le programme finira de mourir paisiblement sans les haut-le-coeur qu'eut pu lui occasionner une instruction spécialement vouée à l'empoisonner tel le vitriol dans la gamelle du chien... je m'égare surement.

en espérant que ça en ait intéressé certains parmi vous Big Grin
+1 (3) -1 (1) Répondre
23-12-2012, 22h46
Message : #2
Kiwazaru Hors ligne
Padawan d'un super escargot
*



Messages : 284
Sujets : 26
Points: 139
Inscription : Mar 2012
RE: [C] le truc du dimanche qui sert à rien
Useless.

*Ok je sors.*
Toucher au Kernel, c'est un peut comme se shooter au LSD, on pense pouvoir tout faire mais ça finit souvent mal.
+1 (0) -1 (0) Répondre
23-12-2012, 23h15
Message : #3
Dobry Hors ligne
Tueur de lamouz
*



Messages : 206
Sujets : 25
Points: 73
Inscription : Aug 2011
RE: [C] le truc du dimanche qui sert à rien
Je suis pas d'accord, c'est très interessant, et je dois dire que je ne connaissais pas l'existence de plus de la moitié des instructions que tu utilises, je dois dire que je n'ai pas eu le courage de lire la doc sur chaque précisement mais je vais regarder plus en détails dès que j'aurais quelques minutes de libres.
Aestuārium Erudītiōnis

There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
+1 (0) -1 (0) Répondre
23-12-2012, 23h21
Message : #4
sakiir Hors ligne
[sakiir@Ubuntu]:~$ ./ExploitMe ShellC0de
*



Messages : 411
Sujets : 51
Points: 34
Inscription : Sep 2012
RE: [C] le truc du dimanche qui sert à rien
J'aimerais comprendre ... :')
+1 (0) -1 (0) Répondre
24-12-2012, 01h26
Message : #5
ark Hors ligne
Psyckomodo!
*****



Messages : 1,033
Sujets : 48
Points: 317
Inscription : Sep 2011
RE: [C] le truc du dimanche qui sert à rien
Sympa comme article :)
C'est vrai que le contexte est vraiment inutile, mais ça permet de voir pas mal de trucs, merci !
+1 (0) -1 (0) Répondre
24-12-2012, 01h30
Message : #6
notfound Hors ligne
#!/usr/bin/env bash
*



Messages : 687
Sujets : 47
Points: 271
Inscription : Sep 2012
RE: [C] le truc du dimanche qui sert à rien
Comme on dit : Inutile donc indispensable.
Ça permet d'apprendre des choses Wink
+1 (0) -1 (0) Répondre
24-12-2012, 02h45
Message : #7
sakiir Hors ligne
[sakiir@Ubuntu]:~$ ./ExploitMe ShellC0de
*



Messages : 411
Sujets : 51
Points: 34
Inscription : Sep 2012
RE: [C] le truc du dimanche qui sert à rien
Comme tes canard ??? :p
+1 (0) -1 (0) Répondre
24-12-2012, 02h55
Message : #8
notfound Hors ligne
#!/usr/bin/env bash
*



Messages : 687
Sujets : 47
Points: 271
Inscription : Sep 2012
RE: [C] le truc du dimanche qui sert à rien
On touche pas à mon beau canard !
+1 (0) -1 (0) Répondre
24-12-2012, 11h11
Message : #9
sakiir Hors ligne
[sakiir@Ubuntu]:~$ ./ExploitMe ShellC0de
*



Messages : 411
Sujets : 51
Points: 34
Inscription : Sep 2012
RE: [C] le truc du dimanche qui sert à rien
:') ahah
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut