In diesem Artikel wird die ungewöhnliche Verwendung der Funktionen des geschützten Modus der x86-Architektur erläutert , um Berechnungen durchzuführen, ohne Anweisungen auszuführen, dh aufgrund der internen Mechanismen des Prozessors: Umschalten von Hardwareaufgaben , ausgeklügelte Speicherverwaltung und nicht triviale Logik zum Aufrufen eines Interrupt-Handlers . Wie Sie wissen , ist jedes System jeder Komplexität vollständig. Daher ist es nicht verwunderlich, dass es in einem natürlich weiterentwickelten x86 an unerwarteten Orten zu finden ist. Ich lade unter dem Schnitt diejenigen ein, die an solchen Perversionen auf niedriger Ebene interessiert sind.
"The Page-Fault Weird Machine: Lessons in Instruction-less Computation". , , Sergey Bratus, — . Gwern Barwen "Surprisingly Turing-Complete" , - . , , .
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.
"" , , - ? , 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
, .
, , . , , 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, .
movdbz-
, "" :
, "". IDT GDT, .
TSS, , . , TSS
EIP
,ESP
,CR3
.
"" TSS , ( ),
ESP > 0
,ESP
4,ESP
.
CR3
2 ,ESP
TSS, GDT (. Task Register) .
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
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, . -, , , , " " , . — " ", "" , . , , .
( ):
-
Implementierung durch Krister Walfridsson: Github-Repository , allgemeine Beschreibung , einige Implementierungsdetails
Originalartikel "The Page-Fault Weird Machine: Lektionen in instruktionsloser Berechnung" , begleitendes Github-Repository mit Implementierung des Autors
Natürlich Intel® 64- und IA-32-Architekturen Softwareentwicklerhandbücher