Download Game! Currently 106 players and visitors. Last logged in:EronkBylethSabaothLmt

Blitzer's Blog >> 71137

Back to blogs index
Posted: 25 Jun 2026 14:51 [ permalink ]
Kalle, tiedC$tkC6 mitC$ juuri tapahtui? Olet juuri todistanut ehkC$ kauneimman
mahdollisen kaatumisen, mitC$ tietotekniikassa voi ylipC$C$tC$C$n kokea!

TC$mC$ ei ollut ohjelmistobugi MQuickJS-moottorissa. TC$mC$ ei ollut
QEMU-virhe. TC$mC$ oli tC$ydellinen todiste siitC$, ettC$ olet onnistunut
rakentamaan aidon paljasmetallin virtuaalikonemonitorin.

Katsotaanpa tarkkaan Kernel Panicin tietoja:
INT : 0x0000000D (General Protection Fault)
EIP : 0x07F8B472 (127.5 Megatavun kohdalla?!)

MitC$ ihmettC$ tapahtui? (The NOP Sled of Death)
EnsinnC$kin, minC$ tein kohtalokkaan virheen. Loin VMM_INIT.JS -tiedostoon
rivin cpu.eip = sys.rd32(...), mutta unohdin mC$C$ritellC$ funktion sys.rd32
itse skriptissC$! Se yritti kC$yttC$C$ vanhaa, aiemmin mC$C$riteltyC$
00_sys.js -toteutusta, joka kutsui C-ytimen kC$skyC$ load(31). Koska poistimme
sen C-ytimestC$ aiemmin, C-ydin palautti undefined, joka muuttui
bittioperaattorilla numeroksi 0.

Kun annoit komennon /vcpu run 1, VCPU teki hienosti Hypercallin ja palautti
EAX:n (0x00C0FFEE).

JS-Hypervisor otti pyynnC6n vastaan, mutta koska se luki muistista undefined,
se tallensi VCPU:n jatko-osoitteeksi nollan: cpu.eip = 0.

Annoit komennon /vcpu resume 1. JavaScript-skeduloijamme komensi armottomasti
C-ydintC$ laitteistotasolla: "Vaihda pinoa ja hyppC$C$ fyysiseen osoitteeseen
0x00000000!"

Osoitteessa 0 sattuu sijaitsemaan tyhjC$ nollilla tC$ytetty IDT-taulukko.
x86-konekielessC$ tavut 0x00 0x00 tarkoittavat kC$skyC$ ADD BYTE PTR [EAX],
AL. Koska EAX sisC$lsi validin numeron (0x00C0FFEE), prosessori suoritti
kC$skyn ja jatkoi seuraavaan nollaan.

Prosessori "liukui" nollilla eteenpC$in uskomattomat 127.5 miljoonaa kertaa,
kunnes se saavutti QEMU:n fyysisen RAM-muistin ylC$rajan (0x07F8B472), putosi
lopulta tyhjyyteen ja veti General Protection Faultin!

Toinen tappava ansa (Code Injection / Buffer Overflow)
Jos rd32 olisi toiminut, koneesi olisi silti rC$jC$htC$nyt toisesta syystC$!
Katso syC6ttC$mC$C$si komentoa:
Tuo osoite 0x03100000 on TCSMCLLEEN SE OSOITE, josta VCPU #1:n oma
suoritettava koodi alkoi!
Jos VMM olisi vastannut pyyntC6C6n, se olisi kirjoittanut ASCII-tekstin "HTTP
200 OK: Hauki Hypervisor..." suoraan VCPU:n aivoihin. VCPU olisi herC$nnyt ja
yrittC$nyt suorittaa kirjaimia konekielinC$ (H = DEC EAX, T = PUSH ESP),
korruptoinut pinonsa ja rC$jC$htC$nyt palasiksi!

TC$mC$ todistaa, ettC$ laitteisto tekee 100 % tarkasti sen mitC$ kC$skemme,
ilman yhtC$kC$C$n turvaverkkoa.

Korjataan tC$mC$!
Tuodaan VMM_INIT.JS:C$C$n toimiva sys.rd32 polyfill (joka yhdistC$C$ 4 tavua),
ohitetaan HSH-kuoren oma tulostuksenesto (jonka takia et nC$hnyt /vcpu
-komentojen paluuarvoja livenC$), ja annetaan tC$llC$ kertaa tallennuspaikaksi
turvallinen Data-alue 0x03150000 (kaukana suoritettavasta koodista).

Cool! Ovelaa. Jatkossa varmaan voidaan kC$tevC$sti hallinnoida koodisivuja ja
tehdC$ niille analyysejC$, ennenkuin painetaan resume/start. Jos niin
halutaan. Ja kukapa ei haluaisi, jos kokeilee uutta koodia, tai muualta
ladattua koodia. x86 analysointi etenkin js:llC$ pitC$isi olla suht kivaa?

[GEM-EXEC]

[GEM-EXEC]low.log
[HAUKI-X86] root@hauki-x86:~/mquickjs# /tmp/x_console_start_nc.sh
[HAUKI-X86] ---------------------- [LIVE FEED] -----------------------
[HAUKI-X86] /os_run VMM_INIT.JS
[HAUKI-X86] /os_run VMM_INIT.JS
[HAUKI-X86]
[HAUKI-X86] [OS] VMM, HASM Compiler and HAREPL extensions loaded!
[HAUKI-X86] > /vcpu new
[HAUKI-X86] /vcpu new
[HAUKI-X86] VCPU #1 created. Base: 0x3100000
[HAUKI-X86] > /vcpu asm 1 HTTP_GET "https://api.hauki.cloud/test" 0x03150000 ;
MOV_EAX 999 ; RET
[HAUKI-X86] /vcpu asm 1 HTTP_GET "https://api.hauki.cloud/test" 0x03150000 ;
MOV_EAX 999 ; RET
[HAUKI-X86] Compiled 52 bytes to VCPU #1
[HAUKI-X86] > /vcpu run 1
[HAUKI-X86] /vcpu run 1
[HAUKI-X86]
[HAUKI-X86] [VMM] VCPU #1 teki Hypercallin! (HTTP GET: https://api.hauki.cloud/
test)
[HAUKI-X86] VCPU #1 PAUSED (Hypercall 1: HTTP GET suoritettu. Jatka '/vcpu
resume 1')
[HAUKI-X86] > /vcpu list
[HAUKI-X86] /vcpu list
[HAUKI-X86]
[HAUKI-X86] IDSTATEEIPEAX
[HAUKI-X86] 1PAUSED0x310002e12648430
[HAUKI-X86]
[HAUKI-X86] > /vcpu resume 1
[HAUKI-X86] /vcpu resume 1
[HAUKI-X86] VCPU #1 HALTED. EAX: 999
[HAUKI-X86] > /vcpu list
[HAUKI-X86] /vcpu list
[HAUKI-X86]
[HAUKI-X86] IDSTATEEIPEAX
[HAUKI-X86] 1STOPPED0x310002e999
[HAUKI-X86]
[HAUKI-X86] > sys.serial("
[VCPU 1 MUISTI LUKU] " + sys.read_str(0x03150000, 100) + "
> ")
[HAUKI-X86] sys.serial("
[VCPU 1 MUISTI LUKU] " + sys.read_str(0x03150000, 100) + "
> ")
[HAUKI-X86]
[HAUKI-X86] [VCPU 1 MUISTI LUKU] HTTP 200 OK: Hauki Hypervisor vastaanotti
pyynnon!
[HAUKI-X86] > => undefined
[HAUKI-X86] >
[HAUKI-X86] >