Calcul sans instructions sur x86

Cet article traite de l'utilisation inhabituelle des fonctionnalités du mode protégé de l' architecture x86 - pour effectuer des calculs sans exécuter d'instructions, c'est-à-dire en raison des mécanismes internes du processeur: commutation de tùches matérielles , gestion intelligente de la mémoire et logique non triviale d' appel d'un gestionnaire d'interruption . Comme vous le savez , tout systÚme quelque peu complexe a l' exhaustivité de Turing , il n'est donc pas surprenant de le trouver à des endroits inattendus dans le x86 naturellement évolué. J'invite sous la coupe ceux qui s'intéressent à de telles perversions de bas niveau.





Cette publication est basĂ©e sur un article intitulĂ© «La machine bizarre de page-faute: leçons de calcul sans instruction» . Cela rĂ©chauffe l'Ăąme que l'un de ses co-auteurs, Sergey Bratus , soit diplĂŽmĂ© de longue date de Phystech . J'ai appris ce travail pour la premiĂšre fois dans l'article de Gwern Barwen "Surprisingly Turing-Complete" , qui contient de nombreux exemples Ă©tonnants de systĂšmes Turing-complets. D'ailleurs, une partie de celui-ci a Ă©tĂ© traduite en HabrĂ© , mĂȘme si seules trois phrases sont attribuĂ©es au phĂ©nomĂšne dĂ©crit dans cet article.





2013 , x86-64, long mode, . x86 .





, , , " ", . , : -, , , — ( QEMU, ). -, , . , , red pill, , . red pills , "", , , . red pill , , , "" . , , . , . : Neutrino(2016 .), Conficker(2008 .), Rebhip(2011 .), IRC : Phatbot(2008 .), Rbot, SDbot/Reptile, Mechbot, SpyBot ( ). -, . "" unikernel.





Red pill est un programme de détection d'environnement virtuel.  Pilule bleue - hyperviseur malveillant
Red pill — , . Blue pill —

"" , , - ? , x86.





IA-32 , . call gates , , . , , — , ; . x86-64 .





, ( , , ), — 32-bit Linux ( ) double fault, , . Double fault , - ; , . , , double fault , , , , Linux , double fault , kernel panic "" . double fault - , triple fault, .





x86 , task-state segment(TSS). , , . EIP



(instruction pointer) — , ESP



(stack pointer) — , CR3



— ( , page directory), EAX



ECX



, .





Contenu TSS.  Faites attention Ă  l'emplacement de CR3, EIP, EAX, ECX, EDX, ESP.
TSS. CR3, EIP, EAX, ECX, EDX, ESP.

, , . , , GDT(Global Descriptor Table) — IDT(Interrupt Descriptor Table) — . , , : memory segment descriptor — (, ), TSS descriptor — task-state segment, interrupt-gate descriptor — , , — far call. , — , — .





-

, , , -? , , page fault double fault, 4- . , , ( , x86 ) ESP



4. , ESP



, ? , 32 , double fault-.





. , , EIP



, , 0xFFFFFFFF



. page fault, . , page fault :





if (esp == 0) {
    goto double_fault_handler;
} else {
    esp -= 4;
    goto page_fault_handler;
}
      
      



- , 
 - . , "" . ( IDT GDT) TSS, CR3



, , , , (, TSS, ). IDTR GDTR ( TSS, ) IDT GDT, , "" ⇒ ⇒ ⇒ CR3



⇒ IDT GDT, . IDT TSS, .





Relation entre IDT, GDT et TSS.  TR (Task Register) contient l'index du descripteur TSS actuel dans le GDT.
IDT, GDT TSS. TR (Task Register) TSS GDT.

movdbz-

, "" :





  1. , "". IDT GDT, .





  2. TSS, , . , TSS EIP



    , ESP



    , CR3



    .





  3. "" TSS , ( ), ESP > 0



    , ESP



    4, ESP



    .





  4. CR3



    2 , ESP



    TSS, GDT (. Task Register) .





  5. 3 , , EIP



    , , page fault; double fault.





, : rsrc



— ESP



, TSS; rdest



— ESP



, TSS, GDT CR3



TSS. label_zero



— , double fault, label_nonzero



— page fault. ESP



, 4, , .





if (rsrc == 0) {
    rdest = rsrc;
    goto label_zero;
} else {
    rdest = rsrc - 1;
    goto label_nonzero;
}
      
      



— , movdbz



, move-branch-if-zero-or-decrement (-----). , subtract-and-branch-if-negative (-----), movdbz



( ), - . , , — - Brainfuck movdbz



-.





, movdbz



:





movdbz rdest, rsrc, label_nonzero, label_zero
      
      



( ), . movdbz



, x86. EIP



TSS.





real-mode A20 high memory, , . , Intel , , , . , ESP



( #SS



— stack-segment fault), . ESP



, 4 "" , 0 1023, 0 4095 ( 4 ). , , .





,





: 4 "destination TSS" ESP



, CR3



. , , ESP



, TSS, -- , . CR3



, , CR3



IDT



, , — "". TSS — , ; , movdbz



. "" TSS ECX



EDX



( TSS ). , TSS ESP



, CR3



TSS c rdest



, .





Busy bit





busy bit, TSS GDT , . , , 5 . , , . , , . , , , , , 8 10, .





: GDT , TSS! GDT 16 , 8 — , , TSS, EAX



ECX



. , TSS EAX



ECX



TSS ( , TSS) busy bit-. , TSS 4 busy bit TSS GDT . IDT GDT — , 8 16 .





, " "? -, , , — red pill, . -, x86, . -, , , , " " , . — " ", "" , . , , .





( ):












All Articles