Comment executer du code qui se trouve dans un buffer ?

Comment executer du code qui se trouve dans un buffer ? - C++ - Programmation

Marsh Posté le 03-11-2002 à 19:15:27    

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 )

Reply

Marsh Posté le 03-11-2002 à 19:15:27   

Reply

Marsh Posté le 03-11-2002 à 19:17:04    

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)
Reply

Marsh Posté le 03-11-2002 à 19:19:40    

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

Reply

Marsh Posté le 03-11-2002 à 19:20:15    

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

Reply

Marsh Posté le 03-11-2002 à 19:21:21    

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.

Reply

Marsh Posté le 03-11-2002 à 19:23:51    

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)
Reply

Marsh Posté le 03-11-2002 à 19:24:06    

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 ?

Reply

Marsh Posté le 03-11-2002 à 20:14:44    

windows

Reply

Marsh Posté le 03-11-2002 à 20:34:31    

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.

Reply

Marsh Posté le 05-11-2002 à 00:01:04    

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
Reply

Marsh Posté le 05-11-2002 à 00:01:04   

Reply

Marsh Posté le 05-11-2002 à 19:51:30    

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

Reply

Marsh Posté le 06-11-2002 à 14:57:53    

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 )-
Reply

Marsh Posté le 06-11-2002 à 21:52:03    

Merci bcp

Reply

Marsh Posté le 07-11-2002 à 05:15:55    

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
Reply

Marsh Posté le 08-11-2002 à 00:43:44    

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 )-
Reply

Marsh Posté le 08-11-2002 à 02:58:09    

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
Reply

Marsh Posté le 08-11-2002 à 19:03:26    

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 )-
Reply

Marsh Posté le 09-11-2002 à 03:43:18    

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

Reply

Marsh Posté le 10-11-2002 à 01:29:38    

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
Reply

Marsh Posté le 10-11-2002 à 01:34:32    

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).  
 
 

Reply

Marsh Posté le 10-11-2002 à 03:15:35    

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

Reply

Marsh Posté le 10-11-2002 à 03:21:20    

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

Reply

Marsh Posté le 10-11-2002 à 11:08:59    

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 )-
Reply

Marsh Posté le 10-11-2002 à 11:35:11    

BlackGoddess a écrit a écrit :

et pile = (en anglais) ?



stack


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

Marsh Posté le 10-11-2002 à 17:26:40    

ah oui c vrai merci :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 11-11-2002 à 03:55:43    

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
Reply

Marsh Posté le 12-11-2002 à 03:09:22    

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

Reply

Marsh Posté le 12-11-2002 à 09:12:27    

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


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 12-11-2002 à 10:03:48    

voué

Reply

Marsh Posté le 13-11-2002 à 04:08:34    

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
Reply

Marsh Posté le 13-11-2002 à 08:26:08    

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


---------------
-( BlackGoddess )-
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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