cs_elpens
Messages postés260Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention 3 novembre 2007
-
21 sept. 2007 à 15:24
cs_elpens
Messages postés260Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention 3 novembre 2007
-
26 sept. 2007 à 08:32
Bonjour à tous,
J'aimerai trouver l'addresse de retour (mémoire) d'une fonction API, c'est pourquoi je vous demande votre aide...
Voilà comment je compte procéder:
1) Lancer l'application à l'aide de la fonction createProcess //Jusque-là, ca va...
2) Trouver les frontières (boundaries) de l'import Table en mémoire
3) Trouver les frontières (boundaries) du Stub programm
4) Trouver le Byte FF dans le code et être sûr que l'on a bien affaire à l'instruction call (assembler)
5) Une fois la function call trouvée, contrôler quelle se trouve bien dans la plage mémoire de l'Import Table définie avant
6) Si oui, alors l'addresse suivante sera l'addresse de retour...
7) Trouver le Byte E8 dans le code (également l'instruction call)
8) Rechercher dans le registre (suivant E8) l'addresse qui nous permettera de vérifier si elle fait partie de la plage Stub
9) Si oui, alors l'addresse suivante sera l'addresse de retour...
Je voudrais réaliser cela en C++.
Je viens de débuter ce "challenge" et toute aide sera la bienvenue à partir du point 2 ;-)
Naturellement, si quelqu'un connait un autre moyen de procéder, je suis preneur.
Voilà, j'espère avoir été clair et vous remercie ne serait-ce pour avoir lu ce message jusqu'au bout.
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 21 sept. 2007 à 17:06
salut je n'ai pas bien compris ce que tu appelles adresse de retour
un call X c'est mettre le contenu d'eip dans la pile, incrémenter esp, et en même temps faire un jump X
// on calcule la taille des 3 instructions situees entre l1 et l2
asm("movl $l2, %eax");
asm("subl $l1, %eax");
// on enregistre dans la variable j
asm("movl %eax, _j");
// on appelle func qui va récupérer l'adresse du movl %eax, _i juste après
asm("call func");
asm("movl %eax, _i");
// on appelle func2, qui va plcer notre adresse de retour calculée à la place de son adresse de retour
asm("call func2");
// ainsi le ret n'est pas effectué !
asm("ret");
printf("l'adresse de retour de func2 etait bien %d", i+j);
return 0;
}
cs_elpens
Messages postés260Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention 3 novembre 2007 24 sept. 2007 à 08:43
Oui et non....
Le principe que tu utilises dans cet exemple est correcte. Seulement, mes fonctions call ne se trouvent pas dans mon code, mais dans celui du .exe
J'essaie de réexpliquer la chose:
- Dans un premier temps, je vais "executer" un .exe avec CreateProcess(myExe.exe,...)
- Dans mon myExe.exe, il y aura des appels de fonctions API (call ntdll.RtlRaiseException;)
Je voudrai donc détecter tout les call de fonction API, et retrouver l'addresse à laquelle ils reviennent une fois la fonction effectué
Je sais qu'il a des choses (stupides) à améliorer, mais je voulais juste tester si je pouvais sortir les instructions call qui ont la valeur E8, mais c'est un echec.
printf(
"0x%X\tcall %.2X %.2X %.2X %.2X \n", myOffset-5, callAddress[3], callAddress[2], callAddress[1], callAddress[0]);
}
}
myOffset++;
}
Cette partie fonctionne plus ou moins correctement, maintenant, il faudrait que je trouve les différentes pattern qui me permettent de retrouver les instructions call.
Comme vous pouvez le constater, je les recherche pour l'instant à l'aide de:
- E8 0x00 00 00 00
- FFD7 //mais là il faut s'attaquer au registre... ouch
- FF15 0x00 00 00 00
Et il me semble qu'il existe plus de pattern, mais j'ai un peu de la peine à bien comprendre les instructions dans le manuel architecture d'Intel...