Je ne comprend pas ce code....

Je ne comprend pas ce code.... - C - Programmation

Marsh Posté le 16-10-2006 à 17:55:07    

Salut , je ne comprend pas la signification de ce code :
 

Code :
  1. #include <stdlib.h>
  2. #include <string.h>
  3. char shellcode[]=
  4. "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x37\x59\x88\x51\x0a\xbb"
  5. "\x77\x1d\x80\x7c"    //***LoadLibraryA(libraryname) IN WinXP sp2***
  6. "\x51\xff\xd3\xeb\x39\x59\x31\xd2\x88\x51\x0b\x51\x50\xbb"
  7. "\x28\xac\x80\x7c"   //***GetProcAddress(hmodule,functionname) IN sp2***
  8. "\xff\xd3\xeb\x39\x59\x31\xd2\x88\x51\x06\x31\xd2\x52\x51"
  9. "\x51\x52\xff\xd0\x31\xd2\x50\xb8\xa2\xca\x81\x7c\xff\xd0\xe8\xc4\xff"
  10. "\xff\xff\x75\x73\x65\x72\x33\x32\x2e\x64\x6c\x6c\x4e\xe8\xc2\xff\xff"
  11. "\xff\x4d\x65\x73\x73\x61\x67\x65\x42\x6f\x78\x41\x4e\xe8\xc2\xff\xff"
  12. "\xff\x4f\x6d\x65\x67\x61\x37\x4e";
  13. /*MessageBox shellcode for Windoew xp sp2 */
  14. int main ()
  15. {
  16. int *ret;
  17. ret=(int *)&ret+2;
  18. printf("Shellcode Length is : %d",strlen(shellcode));
  19. (*ret)=(int)shellcode;
  20. return 0;
  21. }


 
Merci


Message édité par big_dadi_fat le 15-11-2006 à 18:15:40
Reply

Marsh Posté le 16-10-2006 à 17:55:07   

Reply

Marsh Posté le 16-10-2006 à 17:56:41    

hexa
 
après je connais pas la programmation win32, mais ça me semble hasardeux comme méthode
de toute façon doit en manquer un bout, là


Message édité par Elmoricq le 16-10-2006 à 17:57:42
Reply

Marsh Posté le 16-10-2006 à 18:00:27    

C'est du code machine, des opcodes en gros.

Reply

Marsh Posté le 16-10-2006 à 18:07:17    

en tout cas ... ils parlent d'exploit dans la parti où il y a ce code ..

Reply

Marsh Posté le 16-10-2006 à 18:12:37    

ouais enfin "exploit" en anglais, hein, c'est pas du tout le même sens qu'en français

Reply

Marsh Posté le 16-10-2006 à 18:14:27    

http://forum-images.hardware.fr/themes_static/images_forum/1/exclam.gif


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 16-10-2006 à 18:17:39    

.


Message édité par big_dadi_fat le 20-10-2006 à 18:20:16
Reply

Marsh Posté le 16-10-2006 à 18:22:35    

Méthode de hacking.
 
Après, selon l'endroit où tu l'as trouvé : c'est un piège-à-con, ou alors, c'est vrai mais corrigé depuis longtemps, ou alors c'est vrai et ça fonctionne, mais à quoi cela peut bien te servir ?
Sachant que la première possibilité est la plus courante, à base de h4ck3rzz w4rl0rdz qui jettent des trucs au hasard dans un fichier .txt en pronant la c0nspir4ti0n.


Message édité par Elmoricq le 16-10-2006 à 18:26:33
Reply

Marsh Posté le 16-10-2006 à 18:25:38    

C'est un piège à con. C'est un exemple d'utilisation de ... je sais pas comment ça s'appelle [:dawa] Mais le petit programme d'exemple à un trou, et va appliquer le shell code.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 16-10-2006 à 18:38:04    

.

Message cité 2 fois
Message édité par big_dadi_fat le 20-10-2006 à 18:20:26
Reply

Marsh Posté le 16-10-2006 à 18:38:04   

Reply

Marsh Posté le 16-10-2006 à 18:55:32    

big_dadi_fat a écrit :

Je ne comprend pas bien ce que tu dis là...  :sweat:  
Je ne vois pas ce qu'un piége vien faire dans un petit magazine de securité et de programmation ......


 
C'est quoi ce magazine ?  [:dawa]
 

big_dadi_fat a écrit :

je veux savoir c'est quoi ce code, ce n'ai pas sorcier !


 
Ben personnellement j'ai pas fait w4rl0rdz en formation :(

Reply

Marsh Posté le 16-10-2006 à 18:58:12    

Elmoricq a écrit :

C'est quoi ce magazine ?  [:dawa]


 
MISC, je l'ai ici [:dawa]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 16-10-2006 à 18:58:15    

big_dadi_fat a écrit :

Je ne vois pas ce qu'un piége vien faire dans un petit magazine de securité et de programmation ......


 
c est pas le code le piege
c est le magazine [:god]

Reply

Marsh Posté le 16-10-2006 à 19:01:40    

.


Message édité par big_dadi_fat le 20-10-2006 à 18:20:38
Reply

Marsh Posté le 16-10-2006 à 19:04:08    

kadreg a écrit :

MISC, je l'ai ici [:dawa]


caÿ bieng ?
genre c'est du niveau de ces fichiers .txt qui se baladent un peu partout et qui font la joie des étudiants, ou c'est un peu sérieux ? [:dawa]

Reply

Marsh Posté le 16-10-2006 à 19:07:35    

Non, c'est plus sérieux. Par exemple, le bout de code là, on va pas de dire ce qu'il fait et tagada itoo, mais pourquoi es ce que cela crée des failles, et comment ça marche (ici, l'écrasement du point de retour de la fonction main), explication du contenu du shellCode (ce n'est que les opcodes directs, c'est tout con).  
 
Par contre, c'est totalement hors de prix, et tu fini avec un super mal de crane à la fin, c'est souvent un poil complexe. J'ai laissé tombé, je suis trop nul :o

Message cité 2 fois
Message édité par kadreg le 16-10-2006 à 19:07:51

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 16-10-2006 à 19:09:47    

Oked [:romf]

Reply

Marsh Posté le 16-10-2006 à 19:12:33    

.

Message cité 1 fois
Message édité par big_dadi_fat le 20-10-2006 à 18:20:50
Reply

Marsh Posté le 16-10-2006 à 19:15:24    

kadreg a écrit :

Non, c'est plus sérieux. Par exemple, le bout de code là, on va pas de dire ce qu'il fait et tagada itoo, mais pourquoi es ce que cela crée des failles, et comment ça marche (ici, l'écrasement du point de retour de la fonction main), explication du contenu du shellCode (ce n'est que les opcodes directs, c'est tout con).  
 
Par contre, c'est totalement hors de prix, et tu fini avec un super mal de crane à la fin, c'est souvent un poil complexe. J'ai laissé tombé, je suis trop nul :o


hors de prix faut pas non plus exagerer, 7,50 euros tous les deux mois c'est pas la mort pour un magazine. Ceci dit c'est vrai qu'il faut quand meme pas mal de connaissances en systemes et reseaux pour pouvoir aborder les articles un peu pointus.

Message cité 1 fois
Message édité par P-Y le 16-10-2006 à 19:17:01
Reply

Marsh Posté le 16-10-2006 à 19:17:00    

P-Y a écrit :

hors de prix faut pas non plus exagerer, 7,50 euros tous les deux mois c'est pas la mort pour un magazine.


 
8 euros, ça vient d'augmenter :o
 


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 16-10-2006 à 19:20:55    

big_dadi_fat a écrit :

euh je ne vous suis plu là  :sweat:


Bah en gros, la suite de caracteres en Hexa correspondent a du code assembleur, et apparement ce code se lancera si l'utilisateur valide une MessageBox.Apres pour ce que fait le code, j'ai pas le courage de traduire tous les opcodes :D. Ceci etant dit, je sais pas pourquoi tu veux absolument le savoir, mais si tu veux te mettre au C, c'est clairement pas le meilleur moyen de commencer...
 

kadreg a écrit :

8 euros, ça vient d'augmenter :o


Ah tiens, j'ai pas fait gaffe :whistle:


Message édité par P-Y le 16-10-2006 à 19:21:49
Reply

Marsh Posté le 16-10-2006 à 19:52:27    

.

Message cité 1 fois
Message édité par big_dadi_fat le 20-10-2006 à 18:21:02
Reply

Marsh Posté le 16-10-2006 à 20:19:39    

big_dadi_fat a écrit :

Je programme en C depuis un bon moment et je n'ai jamais vu un code de se genre, c'est pour ca que je me demander ....


ok d'accord, effectivement c'est vrai que c'est pas banal comme syntaxe, mais ca compile et ca fait ce que c'est sense faire, meme si c'est pas tres legal :p

Reply

Marsh Posté le 16-10-2006 à 22:40:05    

je peux jouer ? [:god]
 
bon, alors d'abord, voici l'assembleur à l'origine des opcodes :

Code :
  1. 00417000 31 C0            xor         eax,eax
  2. 00417002 31 DB            xor         ebx,ebx
  3. 00417004 31 C9            xor         ecx,ecx
  4. 00417006 31 D2            xor         edx,edx
  5. 00417008 EB 37            jmp         shellcode+41h (417041h)
  6. 0041700A 59               pop         ecx  
  7. 0041700B 88 51 0A         mov         byte ptr [ecx+0Ah],dl
  8. 0041700E BB 77 1D 80 7C   mov         ebx,7C801D77h
  9. 00417013 51               push        ecx  
  10. 00417014 FF D3            call        ebx  
  11. 00417016 EB 39            jmp         shellcode+51h (417051h)
  12. 00417018 59               pop         ecx  
  13. 00417019 31 D2            xor         edx,edx
  14. 0041701B 88 51 0B         mov         byte ptr [ecx+0Bh],dl
  15. 0041701E 51               push        ecx  
  16. 0041701F 50               push        eax  
  17. 00417020 BB 28 AC 80 7C   mov         ebx,7C80AC28h
  18. 00417025 FF D3            call        ebx  
  19. 00417027 EB 39            jmp         shellcode+62h (417062h)
  20. 00417029 59               pop         ecx  
  21. 0041702A 31 D2            xor         edx,edx
  22. 0041702C 88 51 06         mov         byte ptr [ecx+6],dl
  23. 0041702F 31 D2            xor         edx,edx
  24. 00417031 52               push        edx  
  25. 00417032 51               push        ecx  
  26. 00417033 51               push        ecx  
  27. 00417034 52               push        edx  
  28. 00417035 FF D0            call        eax  
  29. 00417037 31 D2            xor         edx,edx
  30. 00417039 50               push        eax  
  31. 0041703A B8 A2 CA 81 7C   mov         eax,7C81CAA2h
  32. 0041703F FF D0            call        eax  
  33. 00417041 E8 C4 FF FF FF   call        shellcode+0Ah (41700Ah)
  34. 00417046 db 'user32.dll',4Eh
  35. 00417051 E8 C2 FF FF FF   call        shellcode+18h (417018h)
  36. 00417056 db 'MessageBoxA',4Eh
  37. 00417062 E8 C2 FF FF FF   call        shellcode+29h (417029h)
  38. 00417067 db 'Omega7',4Eh


Donc alors en fait, stout con : la ligne 10 fait un saut indirect vers l'adresse virtuelle de LoadLibrary (7C801D77h), et charge la dll user32.dll, permettant ainsi d'utiliser MessageBox().
Puis une fois qu'on a le handle de user32.dll, on le transmet en paramètre, ainsi qu'un pointeur vers la chaine 'MessageBoxA' à la fonction GetProcAddress() par le biais de son adresse virtuelle (7C80AC28h), qui permettra de récupérer l'adresse de la fonction MessageBoxA() exportée par user32.dll (ligne 18)
Enfin, une fois qu'on a récupéré cette adresse, on s'en sert pour afficher une jolie MessageBox qui affiche le message "Omega7" (ligne 28) Et enfin, on sort du programme par ExitProcess() et son adresse virtuelle 7C81CAA2h (ligne 32).
A noter ici que les pointeurs des chaines de caractères sont stockées sur la pile à cause du call qui les précede (et qui place l'adresse suivant ce call sur le sommet de la pile (esp), laquelle adresse est ensuite récupérée dans le registre ecx via le "pop ecx" qui suit chaque appel indirect (jmp shellcode xxx)).
 
Quant à la signification du main(), tout con aussi :
- ligne 19 : on déclare un pointeur
- ligne 20 : on rectifie ce pointeur pour le faire pointer sur l'adresse de retour de main (on pointe donc sur ESP)
- ligne 22 : on remplace l'adresse de retour du main par l'adresse de shellcode, ceci permettra donc à shellcode de s'éxecuter dés que main sera fini. Le programme sera ensuite terminé par le ExitProcess() contenu dans shellcode.
 
Bref, un truc de petite bite, y'a rien de bien méchant là dedans : code automodifié + écrasement de pile [:god]
 
edit: quand je vous dit que l'assembleur ça roxxe [:kbchris]


Message édité par Harkonnen le 16-10-2006 à 22:46:48

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-10-2006 à 22:57:00    

kadreg a écrit :


Par contre, c'est totalement hors de prix, et tu fini avec un super mal de crane à la fin, c'est souvent un poil complexe. J'ai laissé tombé, je suis trop nul :o


complexe, ça ? [:pingouino]
c'est un truc de gamin, me dit pas que t'es pas capable de piger ça ?
 

kadreg a écrit :

8 euros, ça vient d'augmenter :o


8 € pour ça ? et ben putain, même le journal de Mickey est plus instructif [:pingouino]

Message cité 2 fois
Message édité par Harkonnen le 16-10-2006 à 22:58:14

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-10-2006 à 22:58:23    

Harkonnen a écrit :

complexe, ça ? [:pingouino]
c'est un truc de gamin, me dit pas que t'es pas capable de piger ça ?


 
sisi, je comprends, mais il faut un minimum de backgroud, connaitre ESP, tout ça. Et j'ai jamasi trop pratiqué l'assembleur, je ne suis pas un compilateur


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 16-10-2006 à 23:04:19    

kadreg a écrit :

sisi, je comprends, mais il faut un minimum de backgroud, connaitre ESP, tout ça. Et j'ai jamasi trop pratiqué l'assembleur, je ne suis pas un compilateur


ben disons que si y'a une leçon à tirer de ça, c'est que si on commence à faire le con avec ESP, alors on peut facilement faire des trucs pas cools !
quand on se met à l'assembleur, le truc le plus important à savoir est qu'on ne fait jamais le con avec ESP, sauf si on sait ce qu'on fait. car mine de rien, ici, c'est la pierre angulaire de ce hack, aussi bien au niveau du code assembleur (avec le call qui place les adresses des chaines de caractères sur la pile, donc à l'adresse pointée par ESP), qu'au niveau du code C (initialisation d'une variable locale juste après le début de la fonction, donc pointée par ESP-2 -ESP contenant l'adresse de retour de main()-, et rectification de l'adresse de cette variable pour faire pointer ret sur l'adresse de retour (&ret + 2))
 
moralité : il faut pas faire le con avec ESP [:petrus75]


Message édité par Harkonnen le 16-10-2006 à 23:06:48

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-10-2006 à 11:27:16    

.


Message édité par big_dadi_fat le 20-10-2006 à 18:21:17
Reply

Marsh Posté le 17-10-2006 à 12:14:08    

euh... ok c'est pas bien méchant comme hack, mais c'est quand même d'un certain niveau, faut comprendre certains concepts comme la pile, little endian, comment sont créees les variables locales à une fonction, etc...
commence donc par apprendre le C à fond, on verra après hein [:pingouino]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-10-2006 à 11:07:30    

.

Message cité 1 fois
Message édité par big_dadi_fat le 20-10-2006 à 18:21:29
Reply

Marsh Posté le 18-10-2006 à 11:08:38    

j'memmerdais, alors j'ai voulu faire mumuse [:god]
voici le désassemblage de main()

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. char shellcode[]=
  5. "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xeb\x37\x59\x88\x51\x0a\xbb"
  6. "\x77\x1d\x80\x7c"    //***LoadLibraryA(libraryname) IN WinXP sp2***
  7. "\x51\xff\xd3\xeb\x39\x59\x31\xd2\x88\x51\x0b\x51\x50\xbb"
  8. "\x28\xac\x80\x7c"   //***GetProcAddress(hmodule,functionname) IN sp2***
  9. "\xff\xd3\xeb\x39\x59\x31\xd2\x88\x51\x06\x31\xd2\x52\x51"
  10. "\x51\x52\xff\xd0\x31\xd2\x50\xb8\xa2\xca\x81\x7c\xff\xd0\xe8\xc4\xff"
  11. "\xff\xff\x75\x73\x65\x72\x33\x32\x2e\x64\x6c\x6c\x4e\xe8\xc2\xff\xff"
  12. "\xff\x4d\x65\x73\x73\x61\x67\x65\x42\x6f\x78\x41\x4e\xe8\xc2\xff\xff"
  13. "\xff\x4f\x6d\x65\x67\x61\x37\x4e";
  14. /*MessageBox shellcode for Windoew xp sp2 */
  15. int main ()
  16. {
  17. 00401000  sub         esp,8  
  18. int *ret;
  19. ret=(int *)&ret+2;
  20. 00401003  lea         eax,[esp+8]  
  21. 00401007  mov         dword ptr [esp],eax  
  22. printf("Shellcode Length is : %d",strlen(shellcode));
  23. 0040100A  mov         eax,offset shellcode (403018h)  
  24. 0040100F  lea         edx,[eax+1]  
  25. 00401012  mov         cl,byte ptr [eax]  
  26. 00401014  add         eax,1  
  27. 00401017  test        cl,cl  
  28. 00401019  jne         main+12h (401012h)  
  29. 0040101B  sub         eax,edx  
  30. 0040101D  push        eax   
  31. 0040101E  push        offset string "Shellcode Length is : %d" (4020E4h)  
  32. 00401023  call        dword ptr [__imp__printf (40209Ch)]  
  33. (*ret)=(int)shellcode;
  34. 00401029  mov         ecx,dword ptr [esp+8]  
  35. 0040102D  mov         dword ptr [ecx],offset shellcode (403018h)  
  36. return 0;
  37. 00401033  xor         eax,eax  
  38. }  
  39. 00401035  add         esp,10h  
  40. 00401038  ret


On constate à la ligne 38 que l'adresse de shellcode est transférée dans la zone mémoire pointée par ecx, lequel ecx contient l'adresse de retour de main(), pointée par ESP+8.
Par contre, avec le débugger on s'aperçoit que dés que l'accolade fermante du main est atteinte, ESP revient comme par magie à sa valeur initiale, ce qui fait que ce hack de gamin ne fonctionne pas avec le compilo de VC++ Express [:god]
J'imagine que le runtime de la CRT doit sauvegarder ESP avant le main(), et ensuite le restaurer. Je sais pas si GCC possède cette sécurité, des amateurs pour tester ? [:dawa]
 
Au passage, on remarquera aussi que la fonction strlen() est inlinée.
 
Voila, c'était juste pour m'occuper [:god]


Message édité par Harkonnen le 18-10-2006 à 11:09:08

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-10-2006 à 11:11:11    

Moi quand je m'ennuie, je mange un kisscool.

Reply

Marsh Posté le 18-10-2006 à 11:14:57    

Elmoricq a écrit :

Moi quand je m'ennuie, je mange un kisscool.


 
Et tu postes à 11h11:11.

Reply

Marsh Posté le 18-10-2006 à 11:18:41    

.

Message cité 1 fois
Message édité par big_dadi_fat le 20-10-2006 à 18:21:47
Reply

Marsh Posté le 18-10-2006 à 11:21:05    

big_dadi_fat a écrit :


je suis sure que tout ces brob n'étais pas là avant que je n'éxecute le prog (celui de 1ér poste) ...  :(  
Merci


ça n'a rien à voir du tout
de toute façon, si tu utilises Visual C++ Express, le shellcode n'est jamais exécuté comme je viens de le signaler.
et même s'il était exécuté, tout ce qu'il fait c'est afficher une pauvre MessageBox, rien de plus.
y'a un bug dans ton code, coco
 

Elmoricq a écrit :

Moi quand je m'ennuie, je mange un kisscool.


moi je participe à l'éducation des masses nourries au Java :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-10-2006 à 11:23:56    

.

Message cité 2 fois
Message édité par big_dadi_fat le 20-10-2006 à 18:21:58
Reply

Marsh Posté le 18-10-2006 à 11:25:16    

big_dadi_fat a écrit :

Ben justement il ne poséde pas cette securité j'ai tester avec code::blocks (compilo GCC) , et j'ai des prob, je ne sais pas si vous avez lu le poste avant le tien mais .....  :(


ça n'a *rien* à voir ! rien du tout !
le probleme est ailleurs


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-10-2006 à 11:26:48    

Harkonnen a écrit :


moi je participe à l'éducation des masses nourries au Java :o


 
strébien java, spice de dino :o  
 
Au moins, on se retrouve pas à faire ce genre de conneries par accident :op


Message édité par kadreg le 18-10-2006 à 11:27:09

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 18-10-2006 à 11:27:56    

big_dadi_fat a écrit :

Comment ca rien à voir ! alors que je vien d'avoir tout ces prob aprés avoir executer le code avec Code::Blocks ..  :(


mais non, ça n'a rien à voir ! explique moi en quoi le fait d'afficher une MessageBox peut foutre ton système en l'air ? tu as lu l'explication que j'ai faite sur le source que tu as posté ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 18-10-2006 à 11:32:04    

L'ASM ça peut format c: dans IE alors nous fait pas croire n'importe quoi monsieur Harkonnen :o

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed