Stel we schrijven een webserver die van een browser (bijvoorbeeld Firefox, of Internet Explorer) een aanvraag krijgt voor een bepaalde webpagina. Bijvoorbeeld http://www.e-klassen.nl/. Laten we er vanuit gaan dat er ergens een stukje van het programma bestaat die de URL kopieert in een buffer waarin 20 tekens kunnen.
Belangrijk om te weten is dat functies, stukjes van een programma ook een bakje in het geheugen hebben, net als buffers. Zo'n functie verwijst dan weer terug naar het volgende deel van het programma. Deze verwijzing staat opgeslagen na de buffer. Het stukje geheugen waar de buffer staat ziet er dan zo uit:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
Buffer | Verwijzing | |||||||||||||||||||
--> |
Nu gaan we met de functie de URL in de buffer plaatsen. Als deze URL bijvoorbeeld 'http://www.google.nl/' is,dan komt de 'h' in geheugencel 1, de 't' in 2, de volgende t in 3, de 'p' in 4, enz. Het geheugen ziet er dan zo uit:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
Buffer | Verwijzing | |||||||||||||||||||
h | t | t | p | : | / | / | w | w | w | . | g | o | o | g | l | e | . | n | l | --> |
Maar wat nu als de URL langer is dan wat in deze 20 geheugencellen past? Stel je bijvoorbeeld voor dat hij een lengte heeft van precies 21 geheugencellen, zoals http://www.google.com. Een slordig geschreven programma controleert daar niet op met als gevolg dat er 21 geheugencellen worden geschreven. Met andere woorden: het returnadres wordt overschreven, kijk maar:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
Buffer | Verwijzing | |||||||||||||||||||
h | t | t | p | : | / | / | w | w | w | . | g | o | o | g | l | e | . | c | o | m |
Door een handige URL te maken kun je nu het programma laten doen wat je maar wilt! Stel dat je aan het eind van je URL bijvoorbeeld het adres van het begin van de buffer invult (in de vorm die computers begrijpen, d.w.z., nullen en enen). Dat betekent dat wanneer het programma de verwijzing uitvoert, niet wordt teruggesprongen naar het programma, maar naar de instructie die in bakje 1 staat. En laat dat nu net het begin van de buffer zijn die door de aanvaller wordt ingevuld. Dat betekent dus dat een aanvaller zijn eigen instructies kan laten uitvoeren. Deze instructies noem je de payload ofwel de lading van een exploit. Je kunt als aanvaller nu alles doen wat mogelijk is: de harde schijf formatteren, botsoftware downloaden en installeren, etc.
Het klinkt ongelooflijk, maar deze onzettend domme programmeerfout is schuld aan een enorme hoeveelheid wormen en virussen. Natuurlijk is het iets ingewikkelder met echte programmeertalen, maar verder is alles precies zoals hierboven is beschreven.
Opdracht
Maak nu de eindopdracht "What the hack?". Download hiervoor het volgende Word document:
In deze opdracht ga je zelf aan de slag als hacker. Dit doe je natuurlijk niet in een echt netwerk op echte computers, maar in een gesimuleerde omgeving.
Om te starten met de opdracht moet er een netwerk worden gesimuleerd met virtuele computers die kunnen worden aangevallen. Hiervoor gebruik je een programma dat op een bootable usb-stick staat die je docent in bezit heeft. Vraag je docent om verdere instructies.