BootToeterę«

Door Infant op woensdag 5 maart 2014 17:18 - Reacties (19)
Categorie: -, Views: 4.767

Het volgende verhaal is een warrige aaneenschakeling van omstandigheden, met als resultaat 8 bytes aan code die je pc oneindig lang laat piepen... u bent wederom... gewaarschuwd.
Disclaimer: Ik kan niet spellen. Als er geen rood streepje onder staat, is het goed. Als er iets stuk gaat, of in de fik vliegt heb ik het niet gedaan.
Once upon a time...
... ondertussen al weer een heel tijdje geleden was de Rabobank op het lumineuze idee gekomen om mij een verdachte envelop op te sturen, met daarin een soort van usb sleutel achtig ... ding....

It smells funny...
Dit is exact hoe hij eruit zag.

Met daarop zoals u ziet de vraag: Is dit de sleutel tot je nieuwe woning?

...

Ehm... moet ik die vraag beantwoorden?
Ik zet in op: Nee.
(Tenzij mijn nieuwe huis USB heeft. Dat zou vet zijn, zolang het maar backwards compatible is met 1.0).

Stiekem hoopte ik natuurlijk dat het wederom een gratis flashdrive betreft. Ik heb al een hele stapel met USB sticks liggen, maar heb er nog nooit eentje gekocht. Ik krijg ze altijd overal bij, echt heel bizar.

Ik had hem bijna in de PC gestoken om uit te vinden hoe groot hij was, toen mijn alu-hoedje heftig begon te vibreren. (Mijn alu-hoedje spreekt met een zwaar Amsterdams accent.)

Alu-hoedje: Ja ho! Wacht eens even! Je gaat nu toch zeker niet zomaar een wilde USB stick in je PC zitten vrotten! Ben je gek ofzo? Wat als een of andere oost-europeaan er een vieze rootkit op heeft gezet? Of wat als het eigenlijk zo'n prank stick is, die elk kwartier lekker je CAPSLOCK aan zet. Of wat nou als het de hele tijd vieze(re) berichtjes op je facebook pagina plemt?

Ja, daar kon het alu-hoedje wel eens gelijk in hebben. Misschien is het wel helemaal niet van de Rabobank. Misschien is dit wel de nieuwe manier van phishing. Je weet het niet.

Qua phising is hardware natuurlijk de beste manier om op plekken waar geld overgemaakt wordt, eens lekker tussen jouw en de bank te gaan zitten.

De de facto methode om dan toch uit te vinden wat we nu in huis hebben (en of het inderdaad de sleutel tot mijn nieuwe huis betreft) is door een zo veilig mogelijke digitale omgeving op te zetten, waar werkelijk niks fout kan gaan, en alles mag.

U kunt dit thuis ook:

Pak een notebook. Het liefst een beetje recent, en trek alle vormen van rf-chips eruit die niet strikt noodzakelijk zijn voor de normale werking. Hierbij moet u denken aan:
- WiFi a/b/c/d/e/f/g/h
- WiMax chips
- Bluetooth V1/2/3/4 dan wel met of zonder LE/EDR of HS.
- Modems met draade
- Modems met HSDPA/GMS/UMTS/EDGE en andere rommel.

Zolang het meuk de ether in strooit, bent u niet veilig.
Zorg vervolgens voor een volle accu. (Agreggaat mag ook, maar dan wel op diesel.)

Sloop de harde schijf en/of elke andere vorm van opslag er uit. Ook brakke optische WORM-media mogen er eigenlijk niet in.
Neem vervolgens met deze notebook plaats in een stalen container zover mogelijk van uw huis vandaan. (Al verkrijgbaar vanaf 89 Euro.) of onder water. (Water werkt bijna evengoed als lood tegen straling.)

Alles wat nu nog resteert is een USB-live-key met een van de volgende linux-distributies er op (u mag zelf kiezen welke, ik heb Mint gekozen.)
And we are good to go!

Dus... ik steek de rabo-stick in mijn kaal geplukte notebook, en wacht tot elk teken van activiteit ontbreekt. Helaas, er gebeurt niks.

Het commando usb-device vertelt mij dat het helaas geen mass storage device is, maar een usbhid. :( En dat betekend dat er naar alle waarschijnlijkheid geen data opgezet kan worden.

Dus...

Nou, verhaal afgelopen. WTF Rabobank? Why! Why?!
In ieder geval doet internet bankieren het nog.

Toch maar eens wat verder kijken, het was toch een regenachtig weekend.

Het manufacturer veld van de rabo-stick gaf aan dat het door WebKey gemaakt is.
Je kunt het zo gek niet verzinnen, of je kunt het krijgen. USB sticks met PMS kleur bijvoorbeeld: rood zal dat wel zijn denk ik.

Nader onderzoek leert dat PMS nog meer betekenissen heeft...

Zijn wij nu verder nog iets wijzer geworden? Nee.
En toch wou ik dit weekend graag iets nieuws gaan leren. Deze usb-rommel bracht mij op een idee:
De boot-toeter. (Spreek uit als: boet toeter)

Ik wou een key maken waar je je computer of notebook van op kan starten. En het enige wat er dan gebeurt, is dat je pc gaat piepen. Verder niks. Dit zou al meer functionaliteit bieden als de rabo-key (die doet namelijk niks.) en het is vast heel leerzaam.

Het geluidje wat ik bedoel, is het geluid wat de pc speaker maakt.
Als je een laptop of pc aan zet, en zoveeel mogelijk toetsen tegelijk ingedrukt houd, kun je het waarschijnlijk horen. Er zijn meerdere manieren om dit geluidje uit uw apparaat te dwingen. Onder windows kun je een command promp starten, CTRL+G en dan Enter in drukken, dat wil wel eens werken.


Anyway, de vraag die nu opkomt is: Hoe maak je iets opstartbaar?

Een gemiddelde PC gebruiker met gemiddelde kennis van hoe het internet en google werkt, denkt nu:

"Ah, ik heb een vraag. Ik vertaal hem naar het Engles, en plemp hem in google. Vervolgens klik ik op elk ding wat ik tegenkom net zolang tot ik het antwoord vind."

Prima. De eerste link was bij mij Utility to make flash drives bootable - O'Reilly Media

Het eerste antwoord op deze site levert een link naar mijn favoriete fabrikant op, namelijk HP.
De link die ze noemen, is deze.

Zoals bijna elke link op elk forum wat meer dan 10 jaar oud is, gaat de link nergens heen. En belanden we netjes op de support pagina van HP. (Waarschuwing! Sluit onmiddellijk het tabblad/venster met de HP support pagina! De HP support pagina is een doolhof van kapotte links en niks zeggende informatie. Voor je het weer ben je een uur verder, en voel je grijze massa je neus uit druipen.)

Ik stop hier eigenlijk ook gewoon.Ik wil helemaal niks downloaden. Ze zijn toch niet g.v.d. met een Nokia bezig?

Ik wil gewoon dingen in kunnen tikken op mijn toetsenbord, en dat dat dan gebeurt. Op mijn rekenmachine kan ik ook gewoon 1+1 in drukken, en dan doet hij dat. Waarom kan dat op een PC niet?
Het antwoord hierop weet ik niet.
Ergens tussen 1970 en 2014 is het doel van een PC zoek geraakt. Als je nu een PC koopt voor 2000 Euro, krijg je na het aanzetten een zwart scherm met een knipperend streepje en geen mogelijkheid om er iets mee te doen.

Maf he?

Het enige "programma" wat er op een lege PC zonder besturings systeem draait, is in 99% van de gevallen het BIOS.
Als je je notebook of pc aan zet, gaat het BIOS meestal allerlei testjes zitten doen, om vervolgens het eerste apparaat waarvan hij op kan starten te benaderen.
Van dit apparaat leest hij vervolgens de eerste 512 bytes aan gegevens in, en plemt deze in het geheugen.
Deze 512 bytes komen uit de zogenaamde boot secor van een opslag apparaat.

Nadat deze 512 bytes volledig automatisch in het geheugen zijn ingeladen, gaat de CPU van je computer de eerste byte bekijken en proberen uit te voeren.

Dat klinkt eenvoudig toch?

We hoeven dus alleen maar een manier te hebben om iets in die 512 bytes te zetten, en we're done. Hier moeten instucties komen te staan (opcodes), die uw pc kan uitvoeren met als ultiem eind doel, een irritant piepje te maken.

Normale(re) mensen zouden nu een stukje assembly schrijven, wat vervolgens door een assembler vertaald wordt naar byte code.
Maar dat is veel te high-level voor onze toepassing. Assembers doet denken aan compilers, en compilers zijn vandaag evil. Plus, die zouden we moeten downloaden, en dat willen we niet.

Je kunt de opcodes ook gewoon met de hand in typen. We hoeven alleen maar een tabelletje te hebben zodat we een grof idee hebben welke instructie wat doet. (Ik vond deze persoonlijk wel duidelijk.) en we moeten een manier hebben om bytes in de eerste sector van een usbstick te zetten. (Kan ook met bovengenoemde hex editor.)
Het maken van... een irritant piepje.
De benodigdheden om een stuk code te schrijven op een PC, is een PC met daarop een reeds draaiend stuk code. Dit is een beetje een kip-ei probleem. Om mijn voorgenoemde apparaat met een knipperende streepje enig leven in te blazen, heb je dus eerst een werkende PC nodig.

Je moet hier gewoon niet te lang over na willen denken, dus we gaan snel verder.

Onder Linux is dingen tikken en op usb-sticks zetten allemaal vrij eenvoudig. Je kunt bij bijna elke distributie out of the box in C gaan zitten programmeren, of nog beter: commando's in de shell in tikken:

Je kunt met bijv. het commando:

code:
1
echo -en "\x12" >file


De hexadecimale waarde waarde van 12 (wat 18 is in een decimaal stelsel) in het bestand genaamd 'file' weg schrijven.

Met hexdump of xxd kun je het vervolgens weer terug lezen.

code:
1
2
hexdump file
xxd file


En met dd kun je het bestand naar een willekeurig apparaat weg schrijven. De usbstick in mijn geval is sdb. Het commando wordt dan:

code:
1
dd if=file of=/dev/sdb bs=1 count=512


Makkelijk he?

Dit is natuurlijk wel een gruwelijk onoverzichtelijke trage manier om een programma te schrijven. Stel je voor dat je op deze manier flappy-fucking-bird in elkaar moet zetten. Jeez.

Onder Windows is het een heel ander verhaal, en kun je eigenlijk out of the box....
...helemaal niks.

Het eerste wat je in Windows altijd moet doen, is zo snel mogelijk een nieuwe browser downloaden die niet Internet Explorer heet.

Omdat ik nog niet echt een programma heb gevonden wat bij Windows 7 mee geleverd word om bits heen en weer te wiebelen, raad ik in dit geval voor het algehele gemak een hex-editor aan. Deze bijvoorbeeld.

Er is een character in de ASCII-tabel, wat dus ook gelijk mijn favoriete nummer is: 0x07, het zogenaamde beep character.
Als je dit karakter op een of andere manier uit je toetsenbord weet te persen, piept de computer.

Het voldoet bij ons om dit karakter oneindig vaak naar het scherm te printen. Dit kan door middel van een BIOS interrupt call, en de wiki heeft hier zelfs een extreem bruikbaar voorbeeld wat maar een klein beetje verbouwd hoeft te worden:
Invoking an interrupt can be done using the INT x86 assembly language instruction. For example, to print a character to the screen using BIOS interrupt 0x10, the following x86 assembly language instructions would be executed:

code:
1
2
3
mov ah, 0x0e
mov al, '!'
int 0x10

Je kunt dit als volgt lezen: de mov instructie (kort voor move) gevolgd door 0x0E zet de waarde 0x0E in het AH register.
Vervolgens zet hij het character ! in het AL register met een soortgelijke instructie, en vervolgens wordt de instructie int met als argument 0x10 uitgevoerd.

Gewapend met de gekleurde tabel van een paar alinea's terug, en eventueel deze pagina, kunnen we kijken waar dit naar vertaalt.
Er bestaat werkelijk een hele rits aan MOV instructies, allemaal met een aparte opcode. Degene die naar register AH schrijft, heeft als code 0xB4, en moet dus als argument 0x0E hebben.

Vervolgens willen wij graag de waarde 0x07 in het AL register plaatsen. De opcode die een mov naar het AL regiser doet heeft als opcode 0xB0.

Vervolgens moeten we de INT instructie aanroepen (0xCD) met het interrupt die we willen uitvoeren. (0x10).

Het enige wat we nu nog willen, is dat de code telkens bij het begin begint. Als we verder geen code schrijven gaat de CPU namelijk dood vrolijk verder met de volgende byte uitvoeren. Deze zal hoogst waarschijnlijk de waarde 0x00 hebben, wat geen geldige instructie is.

In plaats daarvan moeten we een JUMP doen. Een JMP instructie met opcode 0xEB verwacht als argument het aantal regels dat hij terug of verder moet. In dit geval kan hij alle voorgaande instructies overbruggen, zodat gewoon de eerste instructie weer uitgevoerd wordt en het hele feestje opnieuw begint.

Tot nu toe ziet het zaakje er als volgt uit:

code:
1
B4 0E B0 07 CD 10 EB


Dat zijn 7 bytes. De jump moet dus 7 bytes terug.

Om eenvoudig achter de hex-waarde van -7 te komen stelt de windows calculator een beetje teleur. Als omweg kunt u in windows calc in de programmer mode gaan zitten (Alt+3) en 255 - 7 in toetsen in dec mode. Verervolgens dient u op het hex bolletje duwen. Het antwoord is 0xF8. Dat is -7 in 2's complement notatie.

Dat hoeft er dus alleen nog maar achter. Verder is het belangrijk dat onze bootsector op de laatste twee plekken 0x55 0xAA heeft staan:
The BIOS merely passes control to whatever exists there, as long as the sector meets the very simple qualification of having the boot record signature of 0x55, 0xAA in its last two bytes.
Okee, whatever.

Het eind resultaat is dan:

code:
1
B4 0E B0 07 CD 10 EB F8


Dit hoeft dus alleen maar op een USB-stick geknalt te worden. In het HxD venstertje ziet dat er zo uit:


Venstertje met wat meuk.


En het resultaat klinkt ongeveer exact zo: Youtube link.

Dit is denk ik het meest korte programma wat ik ooit gemaakt heb, wat ook nog iets doet. Het is net iets langer als een telefoon nummer, maar geen probleem om uit je hoofd te leren.

Voor het gemak heb ik de sector hier in een zipje staan, zodat u hem met bijv. deze net iets gebruikersvriendelijkere tool ook eens op een USB stick kan kwakken. Ik heb er als redelijk wat collega's mee ge´rriteerd.

Ohja, bedankt Rabobank. Echt waar. Bedankt.