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

  FORUM HardWare.fr
  Programmation
  C

  explication du code "Red Pill" / instruction SIDT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

explication du code "Red Pill" / instruction SIDT

n°1403082
suizokukan
Posté le 08-07-2006 à 23:04:32  profilanswer
 

Sur ce blog très intéressant (http://invisiblethings.org/papers/redpill.html) consacré aux roots-kits il y a un morceau de code dont je ne comprends pas le fonctionnement :
 

Code :
  1. int swallow_redpill () {
  2.        unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
  3.        *((unsigned*)&rpill[3]) = (unsigned)m;
  4.        ((void(*)())&rpill)();
  5.        return (m[5]>0xd0) ? 1 : 0;
  6.      }

 
 

The heart of this code is actually the SIDT instruction (encoded as 0F010D[addr]), which stores the contents of the interrupt descriptor table register (IDTR) in the destination operand, which is actually a memory location. What is special and interesting about SIDT instruction is that, it can be executed in non privileged mode (ring3) but it returns the contents of the sensitive register, used internally by operating system.


 
 
L'idée est de déclencher une instruction SIDT mais je ne comprends pas comment cette fonction y parvient. Quelqu'un pourrait-il me décomposer le contenu de la fonction ? (ou au moins me donner un indice). Merci !


---------------
rule #1 : trust the python
mood
Publicité
Posté le 08-07-2006 à 23:04:32  profilanswer
 

n°1403091
simple_stu​pid
Keep It Simple Stupid
Posté le 08-07-2006 à 23:46:52  profilanswer
 

Bon, je vais essayer de répondre, mais je ne garantis rien, si quelqu'un de plus expérimenté veut confirmer/infirmer...
 

Code :
  1. int swallow_redpill () {
  2.        unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";  /* les 3 premiers char de rpill corrsponde à 0X0F010D, code de l'instruction SIDT */
  3.        *((unsigned*)&rpill[3]) = (unsigned)m;   /* là, c'est tricky: on écrese les 0 de queue de rpill par l'adresse de m, qui va contenir la valeur du registre IDTR */
  4.        ((void(*)())&rpill)();   /* appel effectif de l'instruction IDTR en spécifiant l'adresse utilisée pour le mémoriser la valeur du registre en question */
  5.        return (m[5]>0xd0) ? 1 : 0;  /* on compare la valeur renvoyée reflétant le contenu du registre en question */
  6. /* s'il est supérieure à une certaine valeur, c'est que c'est l'adresse a été fournie par une machine virtuelle, donc qu'on tourne sur un OS virtuel. Apparemment, ce code dépend de la machine virtuelle, d'où sa conclusion qu'on peut l'utiliser pour faire du fingerprinting (un peu comme nmap) */
  7.      }

 
 
Conclusion: en fait, elle bidouille du code en C en pour appeller l'instruction en question en passant par son code hexa (elle concatène l'instruction avec son paramètre, et marque la fin avec '\xc3' dans rpill), sans passer par de l'assembleur : rpill représente l'instruction qui va être appellée, ensuite elle compare la valeur retournée par l'instrcution à une valeur limite pour vérifier si on tourne sur une VMM
Je ne sais pas pourquoi elle n'utilise pas de l'assembleur.


Message édité par simple_stupid le 08-07-2006 à 23:48:39
n°1403093
0x90
Posté le 08-07-2006 à 23:48:32  profilanswer
 
n°1403095
simple_stu​pid
Keep It Simple Stupid
Posté le 08-07-2006 à 23:53:05  profilanswer
 

0x90 a écrit :

pour que ca reste portable.


Ouais, j'y ai pensé, mais de toute façon ça ne tourne que sous Intel, et ça dépend de la VMM utilisée.
 
SInon, je tiens à préciser que cette Johanna a récemment trouvé un "proof of concept" permettant de faire des root-kits invisibles, dans certaines conditions:
 
http://linuxfr.org/2006/07/04/21062.html
 
Ses travaux n'ont pas encore été vérifiés.

n°1403161
suizokukan
Posté le 09-07-2006 à 10:16:17  profilanswer
 

> simple_stupid : merci pour tes explications, elles sont très claires.


---------------
rule #1 : trust the python

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

  explication du code "Red Pill" / instruction SIDT

 

Sujets relatifs
nettoyage de code vba accesscode pour manager IIS avec asp.net/c#
cherche code source virusAdapter un code généré sous Dev C++ vers du Solaris 5.8 (Unix)
code unicode dans un script => non compris par le navigateur ?code d'erreur copie de fichier[Script bat]
Je ne comprend pas tout... Une petite explication serait sympathique.Code pour remplacer du texte par un autre.
Code pour remplacer du texte par un autre.[VBA] Plantage du code selon les versions d'Office
Plus de sujets relatifs à : explication du code "Red Pill" / instruction SIDT


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