Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1042 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Comment executer du code qui se trouve dans un buffer ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comment executer du code qui se trouve dans un buffer ?

n°238918
246tNt
Resistance is futile
Posté le 03-11-2002 à 19:15:27  profilanswer
 

Voila, en gros je definit une fonction :
 

Code :
  1. void fun() {
  2. // Do something
  3. }


 
 
Maintenant, je voudrait copier le 'code' de cette fonction dans un buffer genre char[1024]. Et puis quand il est dans le buffer, l'executer. ( En fait, je le copie dans le buffer a travers le reseaux c pour pouvoir faire une application qui vas chercher ses propres modules )

mood
Publicité
Posté le 03-11-2002 à 19:15:27  profilanswer
 

n°238919
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-11-2002 à 19:17:04  profilanswer
 

Alors la, je comprends pas du tout ce que tu veux faire  :??:  
 
Pourquoi la copier dans un buffer ?


---------------
J'ai un string dans l'array (Paris Hilton)
n°238920
HappyHarry
Posté le 03-11-2002 à 19:19:40  profilanswer
 

faire exploser la pile et exécuter du code **malicieux** ?  :sarcastic:

n°238922
246tNt
Resistance is futile
Posté le 03-11-2002 à 19:20:15  profilanswer
 

Ben parce que j'ai deux ordis.
 
La fonctions je la tape et compile sur l'un même plutot avec de l'assembleur que du code C pour etre sur qu'il a a pas de dependences vers d'autre truc )
 
Et je doit l'envoyer et l'executer sur un autre PC

n°238924
246tNt
Resistance is futile
Posté le 03-11-2002 à 19:21:21  profilanswer
 

Non pour faire un buffer overflow, c pas a moi de lancer l'execution, j'aurai qu'a mettre le code en remplacant de l'ancien code executable.
 
 
Le but c d'avoir un prog qui peut downlaoder dynamiquement des extensions.

n°238928
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 03-11-2002 à 19:23:51  profilanswer
 

Ton truc, ça s'appelle du code auto-généré. C'est très en vogue dans le monde des démos, mais je vois mal l'utilité de ce genre de technique au quotidien, hormis pour faire mumuse avec SoftICE pour faire des trucs vilains  :non:


---------------
J'ai un string dans l'array (Paris Hilton)
n°238929
lorill
Posté le 03-11-2002 à 19:24:06  profilanswer
 

246tNt a écrit a écrit :

Non pour faire un buffer overflow, c pas a moi de lancer l'execution, j'aurai qu'a mettre le code en remplacant de l'ancien code executable.
 
 
Le but c d'avoir un prog qui peut downlaoder dynamiquement des extensions.




ben c'est pas comme ca qu'on fait...  
windows ou unix ?

n°238951
246tNt
Resistance is futile
Posté le 03-11-2002 à 20:14:44  profilanswer
 

windows

n°238965
lorill
Posté le 03-11-2002 à 20:34:31  profilanswer
 

246tNt a écrit a écrit :

windows




dommage  [:sinclaire]  
 
Fin d'une maniere ou d'une autre, quand tu veux utiliser des plugins, tu passes par des bibliothèques partagées, pas par de l'évaluation dynamique de code.
 
Une autre solution, c'est d'inclure un interpreteur dans ton programme et d'écrire les modules dans ce langage interprété. Ca peut se faire assez facilement avec des langages comme Python, Ruby ou Lua.

n°239625
Musaran
Cerveaulté
Posté le 05-11-2002 à 00:01:04  profilanswer
 

Code :
  1. char buffer[SUFFISAMMENT];
  2. int taille= /*deviner*/;
  3. memcopy(buffer, fun, taille);
  4. typedef void (funtype)(); //type de la fonction
  5. funtype* funptr= (funtype*)buffer;
  6. funptr(); //exécuter (tous au abris !)


Mais tu fais fausse route...
Déjà, c'est pas sûr que l'OS permette d'exécuter des données qui ne sont pas dans une page exécutable.
Et même, c'est de la voltige sans filet.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le 05-11-2002 à 00:01:04  profilanswer
 

n°240079
246tNt
Resistance is futile
Posté le 05-11-2002 à 19:51:30  profilanswer
 

Oui en effet j'ai remarqué ...
 
J'ai reuissi a le faire mais :
 - Faut ecrire le code en assembleur pour etre sur de sa taille et que les appel au api ne dependent pas de la place ou se trouve le code.
 - Faut fixer que le buffer doit etre dans une page executable

n°240531
blackgodde​ss
vive le troll !
Posté le 06-11-2002 à 14:57:53  profilanswer
 

pour la page executable :
 
void* buffer = VirtualAlloc(0, TailleDuBuffer, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 
memcpy(buffer, fun, Taille);
 
typedef void (funtype)();//type de la fonction
funtype* funptr= (funtype*)buffer;
funptr();//exécuter
 
au bout d'une longue série de test je suis arrivé a executer du code de cette maniere, mais c'est extrement dur : en effet, le code ne doit faire appel à aucun autre segment du fichier .exe (pas de segment de données, donc pas de chaines de caractères écrites en dur, pas de ressources, pas de relocation (on peut se débrouiller en appelant directement LoadLibraryA et GetProcAddress par leurs adresses directes, mais le code ne sera alors absolument pas portable : sur chaque version de win ces adresses diffèrent, et également le code à executer peut contenir des 'sauts' du moment qu'ils sont indiqués comme 'saut 3 octets plus bas', mais pas des sauts contenant une adresse (call))
 
(j'écris cela pour un but purement informatif)


---------------
-( BlackGoddess )-
n°240901
246tNt
Resistance is futile
Posté le 06-11-2002 à 21:52:03  profilanswer
 

Merci bcp

n°241078
Musaran
Cerveaulté
Posté le 07-11-2002 à 05:15:55  profilanswer
 

blackgoddess a écrit a écrit :

...mais pas des sauts contenant une adresse (call))


Dans du code source, cela correspond uniquement à un appel de fonction (ctor et operateurs C++ inclus), ou il y a d'autre situations ?


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°241591
blackgodde​ss
vive le troll !
Posté le 08-11-2002 à 00:43:44  profilanswer
 

euh ... en général, un appel vers une fonction, si g bien compris, se code comme cela :
 
void MyFunc(void)
{
  // code
}
 
puis, à un endroit dans le code :
 
MyFunc();
 
cela se traduit par un call, mais l'argument de call est un certain nombre d'octets (nombre signé) qui indique la ou doit continuer l'execution.
 
un call avec une adresse, c'est en général pour une API (liée au linkage avec la table d'importation, ou appelée avec LoadLibrary/GetProcAddress)
 
Pour les operateurs C++, je suis désolé mais je ne connais pas bien le sujet, je cherche la dessus en ce moment :)


---------------
-( BlackGoddess )-
n°241624
Musaran
Cerveaulté
Posté le 08-11-2002 à 02:58:09  profilanswer
 

BlackGoddess a écrit a écrit :

Pour les operateurs C++, je suis désolé mais je ne connais pas bien le sujet, je cherche la dessus en ce moment :)



Concrètement, ce sont des appels de fonctions déguisés.
Le mecanisme virtuel des classes peut ajouter 1 indirection + 1 indiçage + 1 indirection à l'appel.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°241923
blackgodde​ss
vive le troll !
Posté le 08-11-2002 à 19:03:26  profilanswer
 

lorsqu'on fait par exemple :
 
typedef class _myclass
{
   _myclass(void) {}
   int DoAnything(void) {return 0;}
} MyClass, *pMyClass;
 
puis à un endroit du code :
 
pMyClass MyObject = new MyClass;
 
MyClass est copié de son endroit original de la mémoire pour être exécuté ou c'est juste un "artifice" et en fait on appelle tjs les mm func, aux mm endroits ?


---------------
-( BlackGoddess )-
n°242086
LeGreg
Posté le 09-11-2002 à 03:43:18  profilanswer
 

a quoi sert le typedef de MyClass??
 
je veux bien comprendre pour pMyClass,
mais la tu ne serais pas en train de faire
un mix inutile entre C++ et C?
 
de plus je crois comprendre que tu demandes si le code est duplique a chaque instance de MyClass
et je repondrai: heureusement que non parce qu'un  
objet de 1 octet qui compterait un million de lignes de code associees, ca poserait un petit probleme de memoire pour l'instancier plein de fois.  
 
tout ce qui est duplique par objet ce sont les donnees (les membres directs sans indirection) (et un pointeur vers la table virtuelle ou la table de type s'il y a lieu).
 
A+
LeGreg

n°242436
Musaran
Cerveaulté
Posté le 10-11-2002 à 01:29:38  profilanswer
 

On apelle toujours les mêmes fonctions.
C++ n'a pas de fonctions/code dynamiques, seulement des appels de fonctions dynamiques.
 
En C++, le typedef n'est plus nécessaire, et le (void) est implicite:

Code :
  1. class MyClass{
  2.   _myclass() {}
  3.   int DoAnything() {return 0;}
  4. }*pMyClass;


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°242439
chrisbk
-
Posté le 10-11-2002 à 01:34:32  profilanswer
 

Musaran a écrit a écrit :

Code :
  1. char buffer[SUFFISAMMENT];
  2. int taille= /*deviner*/;
  3. memcopy(buffer, fun, taille);
  4. typedef void (funtype)(); //type de la fonction
  5. funtype* funptr= (funtype*)buffer;
  6. funptr(); //exécuter (tous au abris !)


Mais tu fais fausse route...
Déjà, c'est pas sûr que l'OS permette d'exécuter des données qui ne sont pas dans une page exécutable.
Et même, c'est de la voltige sans filet.




 
simple question, c quoi des pages executable ? (eg quand je fais un call sur un tableau alloué au malloc stdart, ca passe tres bien).  
 
 

n°242488
LeGreg
Posté le 10-11-2002 à 03:15:35  profilanswer
 

chrisbk a écrit a écrit :

 
simple question, c quoi des pages executable ? (eg quand je fais un call sur un tableau alloué au malloc stdart, ca passe tres bien).



 
Il faut que par defaut ce soit supporte par l'OS
et par le processeur.
Ca n'a aucun sens sous windows par exemple
ou sous linux.
 
Par contre ce dont l'OS protege en general
c'est contre les executable stacks
je n'ai pas entendu parler de protection
contre les executable heaps.
 
[OT]Tiens ca me rappelle que je viens de revoir Tron en
DVD. "vous ne pourrez plus executer de code en dehors
du Master Control Program. le Master control program sait ce qui est bon pour vous " :) [/OT]
 
LeGreg

n°242492
LeGreg
Posté le 10-11-2002 à 03:21:20  profilanswer
 

Citation :

Par contre ce dont l'OS protege en general
c'est contre les executable stacks
je n'ai pas entendu parler de protection
contre les executable heaps.


 
enfin je veux dire que l'utilisation de la pile
pour les exploits etait relativement facile (pour un hacker)  
et proteger contre son execution n'a casse  
aucun programme existant,
par contre proteger le tas de l'execution
a une raison d'etre plus faible (c'est un peu plus
difficile a exploiter comme faille). Et cela risque effectivement
de casser un certain nombre de codes qui reposent la dessus et ne tiennent pas compte d'une eventuelle protection de l'OS.
 
LeGreg

n°242533
blackgodde​ss
vive le troll !
Posté le 10-11-2002 à 11:08:59  profilanswer
 

tas = heap ?
et pile = (en anglais) ?
 
parce quer les API sur le sujet prennent les noms anglais, et chui perdu enter les 2 a chaque fois :p


---------------
-( BlackGoddess )-
n°242543
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 10-11-2002 à 11:35:11  profilanswer
 

BlackGoddess a écrit a écrit :

et pile = (en anglais) ?



stack


---------------
J'ai un string dans l'array (Paris Hilton)
n°242703
blackgodde​ss
vive le troll !
Posté le 10-11-2002 à 17:26:40  profilanswer
 

ah oui c vrai merci :)


---------------
-( BlackGoddess )-
n°242872
Musaran
Cerveaulté
Posté le 11-11-2002 à 03:55:43  profilanswer
 

chrisbk a écrit a écrit :

simple question, c quoi des pages executable ?


page: bloc de mémoire tel que l'OS l'alloue.
executable: considéré comme contenant du code.
 
Comme c'est déjà dit, un OS pourrait très bien refuser l'exécution de code dans une page non déclarée exécutable, ou qu'il n'a pas lui-même marquée comme telle.
 
C'est le même principe appliqué aux pages read-only qui fait qu'on peut violer une constante globale sous Windows 9x et pas sous NT/2000/Xp.

Code :
  1. char* msg= "bla !";
  2. msg[0]= 'B'; //Dispositif anti-OS moderne


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°243274
LeGreg
Posté le 12-11-2002 à 03:09:22  profilanswer
 

viole, viole.. mais qui te dit qu'elle n'etait pas consentante ?
 
(la memoire :D )
 
LeGreg

n°243300
blackgodde​ss
vive le troll !
Posté le 12-11-2002 à 09:12:27  profilanswer
 

char* msg = "bla !";
 
cela définit une constante ?????


---------------
-( BlackGoddess )-
n°243324
chrisbk
-
Posté le 12-11-2002 à 10:03:48  profilanswer
 

voué

n°243882
Musaran
Cerveaulté
Posté le 13-11-2002 à 04:08:34  profilanswer
 

consentante... constante...
Tu m'as l'air bien parti, voici une friandise licencieuse: http://www-users.cs.york.ac.uk/~susan/joke/polly.htm
Celui qui arrive à le traduire est vachement fort... ou obsédé.
 
Les chaînes littérales sont des constantes, en toute logique il faudrait écrire:

Code :
  1. const char* msg = "bla !";

La conversion en "char*" sera dépréciée, mais quand ?


Message édité par Musaran le 13-11-2002 à 04:09:14

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°243889
blackgodde​ss
vive le troll !
Posté le 13-11-2002 à 08:26:08  profilanswer
 

bin ... déjà les maths en francais c pas mon truc ... mais alors en anglais ... :d


---------------
-( BlackGoddess )-
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Comment executer du code qui se trouve dans un buffer ?

 

Sujets relatifs
Question sur le code des pages webPourquoi ce code déforme ma page ?
Comment dire à Norton antivirus que tel script peut s'éxécuterQui peut me dire comment intégrer cette variable ds le code ?
compilateur en code machinekomment configurer UltraEdit pour compiler et executer?
Question de nioubi sur le forum PPC : affichage du code des smileys.NET >> Optimisation de code
faire executer un vbs...Expressions régulières (Jakarta oro - j'trouve pas de doc)
Plus de sujets relatifs à : Comment executer du code qui se trouve dans un buffer ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR