Execution de code dans DS [Résolu]

Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
- - Dernière réponse : cs_Nasman
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
- 26 sept. 2005 à 08:48
hello ...

question importante - pour moi -

y a-t-il moyen d executer du code contenu dans le Data Segment ?

je veux dire....

je cree unn pointeur . celui ci pointera vers uune zone du data segment
( si il y a moyen l allouer de la mem dans CS suis preneur)

on alloue ded la memoire et on copie colle a partir du disque un code assemblé/linké .

en faisant dans le prog principal un call sur le pointeur, le code copié devrqit etre executé;

je ne parle ici pas des compilcatons / pbs de ce systeme, je veux juste savoir une chose:



est-ce possible ?



je ne pense pas, etant donne qu apres l'execution d une instruction, un registre est incrementé.... enfin j en sais rien



si non :



est-il possible d'allouer de la mem dans le Code Segment ? la encore, je doute ... enfin ... prions le Seigneur.

Audaces fortuna juvat , non ?

++

ad

_______________________


Omnia vincit labor improbus
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
3
Merci
SOUS WINDOWS:
Voir 3eme param de VirtualProtect (positionner le flag PAGE_EXECUTE).
VirtualAlloc idem.

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
3
Merci
Si tu veux virer le header il te faut connaitre la structure des
fichiers PE pour trouver où ton programme commence (où sont les
instructions).

Tu trouvera des infos à l'adresse suivante



http://www.madchat.org/vxdevl/papers/winsys/windowsring3.txt



Lorsque le programme exe est chargé en mémoire le code commence généralement à l'adresse 00401000

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 200 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Nasman
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
Je ne suis pas spécialiste de trucs aussi pointus mais peut-être que je pourrais faire avancer le schmillblick.

Le code que tu devrais insérer est-il de longueur fixe ? Dans ce cas on
peut imaginer modifier les infos du header du programme (de quel type
de fichier s'agit-il, 16 bits, 32 bits, PE ?) pour laisser de la place
au programme à insérer.

L' insertion devrait pouvoir s'effectuer dans la zone des données mais
l'exécution est plus problématique. Il faudrait définir la section des
données comme readable, writable (normal) mais aussi executable. Ceci
doit pouvoir être modifié avec un éditeur hexa en changeant les octets
régissant les droits d'accès aux sections.

Tu devrais choisir entre:

Insérer le code dans la section code : dans ce cas la section code doit être writable



Insérer le code dans la section data : dans ce cas la section data doit être exécutable



Pour voir mieux la faisabilité de la chose je pense que le format du fichier exécutable doit être pris en compte.

.com (1 seule section CS=DS) peut-être plus facile à gérer

.exe 16 bits (peut-être qu'un call far permet de "sauter" dans la
section data mais je ne sais pas si on peut la rendre exécutable)

.exe 32 bits (je pense que plus de possibilités sont offertes mais il faut savoir modifier les accès aux sections).
Commenter la réponse de cs_Nasman
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
heu ...alors:

"Le code que tu devrais insérer est-il de longueur fixe" oui , d une
certaine facon, mais cette taille n'est connue qu apres la compilation
du prog.


" Tu devrais choisir entre:

Insérer le code dans la section code : dans ce cas la section code doit être writable

Insérer le code dans la section data : dans ce cas la section data doit être exécutable"



bah oui et justement ma question c est : comment on fait ca ? en C++ je veux dire, ou si c est pas possible en asm



pour les far jumps j'y avais deja pense mais la ya des segfaults ( selon Funto)



pour VirtualProtect et VirtualAlloc je ne sais pas ce que c est.

petite precision: c'est pour Windows; le portage pour Nux est
prevu mais l'AT&T, c'est chiant. ca attendra que la version win
marche.


_______________________


Omnia vincit labor improbus
Commenter la réponse de Arnaud16022
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
VirtualAlloc y en a plein mes sources, t'auras pas de malaise pour en trouver. Faut passer par cette fonction pour allouer de la mémoire correctement alignée.
En plus de MSDN, faut lire Richter et tu sauras tout, pas compliqué du tout.
VirtualProtect change les drapeaux de page mémoire, encore plus simple.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
hum suis allé voir sur MSDN pour VirtualAlloc, ya meme un exemple de
code pour ca, le seul pb c est qu'ils utilisent des termes d'anglais
que je ne connais pas lol



bon alors en gros, pur etre sur:

J'utilise VirtualAlloc un peu comme malloc, en utilisant le flag
PAGE_EXECUTE ( a propos, pk pas PAGE_EXECUTE_READWRITE ? il faut bien
que j'y ecrive dans cette mem.... )

ensuite j'y copie mon code, lequel commence, en asm, par un label et se finit par un ret

dans le prog je fais, en asm, un call sur le pointeur que m'a donné
VirtualAlloc, et qd le code est executé ca revient comme un grand au
prog principal, puisqu'il n'y a qu'a depiler l'adresse... non ? ya une
couille qqpart ou c'est cesé marcher ?

moi en tout cas j'essaye comme ca.

merci beaucoup

++

ad

_______________________


Omnia vincit labor improbus
Commenter la réponse de Arnaud16022
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
0
Merci
PAGE_EXECUTE_READWRITE devrait aller.
J'utiliserais le JMP que je mettrais sur stack et le dépilerais pour retour depuis ce code mais tu peux tester ta version, les 2 peuvent s'admettre si elles sont correctement codées (l'asm que tu dois mettre a l'adresse allouée).

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
salut,

un petit exemple d'injection et execution de code dans un process.
http://www.asmfr.com/code.aspx?id=19632

dans empty.asm, tu trouvera un code qui lance un process en le bloquant.
il alloue un bloc memoire(EXEC/READ/WRITE) dans le process cible.
le code infiltre.asm est initialisé et inséré dans ce bloc memoire.
on modifie le contexte de thread afin de pointer eip sur le bloc memoire.
on relance le thread qui execute infiltre.asm.

@++
Commenter la réponse de cs_patatalo
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
ah oui mais la ya comme qui dirait un gros pb:

c'est que ca dépasse de fort loin mes maigres connaissances en asm lol

admettons que je veuille mettre en memoire ce code:



segment .text

global _asm_main

_asm_main:

enter 0,0

pusha

mov eax,0

popa

leave

ret



on peut pas dire que ce soit méga sophistiqué comme code. bon jle
compile (nasm -f win32 test.asm), jle linke (ld test.obj -o test.exe
--entry _asm_main, ld est le linker de dev-c++), et je me retrouve avec
un exe de 3Ko...ce qui me semble deja enorme comparé au code.

maintenant si je le chager avec le desassembleur de VC6, impossible de
retrouver ce code dans tout ce fourbi ...par contre ya partout du code
bizarre et inconnu.



ceci dit, j'ai essayé ton prog sur mon test.exe (modifié avec une boucle infinie) ca marche bien ton truc ^^



++

ad


_______________________


Omnia vincit labor improbus
Commenter la réponse de Arnaud16022
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
re,

3Ko est une bonne taille car tu doit ajouter le pe header.

@++
Commenter la réponse de cs_patatalo
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
bah oui mais j'en veux pas moi du header ! moi tout ce que je veux
c'est le code machine correspondant au code asm , rien de plus rien de
moins.

comment je fais pour virer tout le header ? jveux dire, il s'arrete où ? il a une taille prédéfinie?

_______________________


Omnia vincit labor improbus
Commenter la réponse de Arnaud16022
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
a ce moment là, tu dois compiler en binaire.
nasm -f bin test.asm
par contre, tu ne pourras pas linker pour produire un exe.

@++
Commenter la réponse de cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
[ORG 0]
[BITS 32]

start:
enter 0,0
pushad
mov eax,0
popad
leave
ret

nasm -f bin test.asm
Commenter la réponse de cs_patatalo
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
patatalo -> pour le -f bin j'avais déja essayé, le pb c'est qu'apres le linker il arrive pas a ouvrir le fichier objet

Nasman -> cool merci bcp ^^

_______________________


Omnia vincit labor improbus
Commenter la réponse de Arnaud16022
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
J'ai trouvé un utilitaire qui permet de visualiser les différents éléments des fichiers PE



http://www.magma.ca/~wjr/PEview.zip



tu verras peut-être mieux les différentes sections, où elles commencent et ce qu'elles contiennent
Commenter la réponse de cs_Nasman
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
0
Merci
re,

c'est juste une doc sur le format PE qu'il te faut

http://win32assembly.online.fr/tutorials.html
et notament:
http://win32assembly.online.fr/pe-tut1.html
...
http://win32assembly.online.fr/pe-tut7.html

@++
Commenter la réponse de cs_patatalo
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
0
Merci
alors :

tout d'abord, j'arrive a executer la fonction que je veux

maintenant le probleme c'est les variables...exemple (nasm)



segment .bss

donnee resd 1

segment .text

label:

mov [donnee],dword 1

ret



bah qd j'execute la fonction label, ca plante. j'ai également essayé une grosse bidouille du style:

code_vide:

nop

nop

nop

nop

label

mov [code_vide],dword 1

ca plante idem



une suggestion ?

merci beaucoup

_______________________

Omnia vincit labor improbus
Commenter la réponse de Arnaud16022
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
Bonjour,



Pour ce qui est du plantage, s'agit-il d'un plantage à la compilation ou à l'exécution.

Si c'est à la compilation il est probable que ce soit parce que Nasm
n'apprécie pas le mot Label comme étiquette. Pour info je me suis déjà
fait avoir avec une étiquette appelée fs (confondue avec le registre de
segment du même nom). De même si tu appelle une étiquette mov, eax,
int, etc...



Appelle ton nom de label par etiquette, il y a de fortes chances que celà résolve ton problème.
Commenter la réponse de cs_Nasman