Cover
Aloita nyt ilmaiseksi 1_Lecture_1.pdf
Summary
# Basisbegrippen en datarepresentatie
Dit onderwerp introduceert de fundamentele bouwstenen van digitale informatie, zoals bits en bytes, en verklaart hoe deze gerelateerd zijn aan hexadecimale waarden, inclusief de transformatie van menselijke concepten naar hun binaire representatie.
### 1.1 Bits en bytes
Een **bit** is de kleinste eenheid van informatie in een computer. Het kan twee waarden aannemen: 0 of 1. Deze waarden worden fysiek gerepresenteerd door de aanwezigheid of afwezigheid van elektrische stroom in elektronische componenten zoals transistors en condensatoren [3](#page=3) [5](#page=5) [7](#page=7).
Een **byte** is een groep van 8 bits. Dit is een veelvoorkomende standaardgrootte voor het opslaan en verwerken van informatie. Met 8 bits kan een byte $2^8 = 256$ verschillende waarden representeren [3](#page=3).
### 1.2 Hexadecimale representatie
Hexadecimale getallen worden gebruikt als een meer compacte manier om binaire getallen weer te geven. Het hexadecimale systeem is een basis-16 systeem, wat betekent dat het 16 unieke symbolen gebruikt: de cijfers 0 tot en met 9, en de letters A tot en met F [3](#page=3).
* Elk hexadecimaal cijfer kan precies 4 bits representeren [3](#page=3).
* Een byte (8 bits) kan worden gerepresenteerd door 2 hexadecimale cijfers [3](#page=3).
> **Voorbeeld:** De hexadecimale waarde `A8` representeert een byte. `A` staat voor 1010 in binair, en `8` staat voor 1000 in binair. Samen `10101000` [3](#page=3).
### 1.3 Van menselijke concepten naar bits
De transformatie van concepten die voor mensen begrijpelijk zijn naar de binaire representatie die computers kunnen verwerken, is een gelaagd proces [5](#page=5) [7](#page=7).
1. **Menselijke Producten:** Dit zijn de eindresultaten waar gebruikers direct mee interageren, zoals websites, softwareapplicaties, mobiele apps en videogames [5](#page=5) [7](#page=7).
2. **Frameworks, Engines, Libraries, SDKs:** Deze worden gebruikt om menselijke producten te bouwen [5](#page=5) [7](#page=7).
3. **Programmeertalen:** Deze worden gebruikt om frameworks en libraries te creëren. Programmeertalen kunnen worden ingedeeld in "high-level" of "low-level" talen [5](#page=5) [7](#page=7).
4. **Compilers, Linkers, Bundlers:** Deze tools vertalen broncode van programmeertalen naar uitvoerbare programma's [5](#page=5) [7](#page=7).
5. **Besturingssystemen, Runtimeomgevingen, CPU, Registers, Geheugen:** Dit zijn de omgevingen waarin programma's worden uitgevoerd [5](#page=5) [7](#page=7).
6. **Logic Gates:** Hardwarecomponenten zoals transistors en condensatoren worden georganiseerd in logic gates om de functies van het besturingssysteem en de CPU te implementeren [5](#page=5) [7](#page=7).
7. **Fysieke Elementen en Elektriciteit:** De hardware zelf is opgebouwd uit fysieke materialen (zoals silicium) die elektrische stromen gebruiken om bits te representeren [5](#page=5) [7](#page=7).
> **Tip:** Begrijpen hoe deze lagen op elkaar inwerken is cruciaal voor het begrijpen van computerwetenschappen en cybersecurity, omdat kwetsbaarheden op elk niveau kunnen bestaan. We focussen ons echter op de interne werking van computerwetenschappen, niet op de diepere fysica van elektronica [6](#page=6).
---
# Bestanden en processen in context
Dit gedeelte verkent de fundamentele concepten van bestanden en processen, hun onderlinge relatie en de rol van 'magic bytes' bij bestandsidentificatie, geïllustreerd met voorbeelden uit websites en videogames.
### 2.1 De aard van bestanden
Een bestand kan worden gedefinieerd als data die statisch op een opslagmedium, zoals een harde schijf, is opgeslagen. De vraag "is het dezelfde als een proces?" wordt hierbij opgeworpen. Bestanden worden opgeslagen op de schijf en draaien niet zelfstandig. De hash van een bestand zal niet veranderen wanneer alleen de bestandsnaam wordt gewijzigd [14](#page=14).
### 2.2 De aard van processen
Een proces daarentegen is een actief programma dat in het geheugen draait. Om een proces te laten draaien, is een uitvoerbaar bestand nodig dat van de schijf naar het geheugen wordt geladen. Processen werken vaak samen met andere processen. Er wordt ook gesproken over threads als iets gerelateerd aan processen, met de opmerking dat hierover in toekomstige colleges dieper op ingegaan zal worden [15](#page=15).
### 2.3 Executables versus processen
Een executable is een specifiek type bestand dat uitvoerbare code bevat, oftewel instructies voor het besturingssysteem en uiteindelijk de CPU. Een bestand, zoals eerder vermeld, is statisch op schijf, terwijl een proces actief in het geheugen draait. In de context van dit vak worden de termen 'executable', 'programma' en 'binary' als synoniemen gebruikt [16](#page=16).
### 2.4 Relatie tussen bestanden en processen
In essentie is alles een bestand, en alles draait als een proces op een bepaald "iets". Een website wordt bijvoorbeeld gemaakt met HTML, CSS en JavaScript, mogelijk met behulp van frameworks en libraries. De website wordt gehost op een server die een webserverprogramma draait. De browser van de gebruiker, zelf ook een programma dat op een pc draait, rendert de website. De code van de browser is geschreven in programmeertalen zoals C++ of Rust. Dit illustreert hoe bestanden (zoals de code van de website of de browser) leiden tot processen (de draaiende webserver, de rendert de browser) [10](#page=10) [12](#page=12).
Een videogame, zoals Hogwarts Legacy, wordt gemaakt met een game engine zoals Unreal Engine, die zelf is geschreven in C++. Zelfs op consoles zoals de PlayStation 5 worden deze games uiteindelijk opgeslagen als bestanden en draaien ze als processen op het besturingssysteem van de console [11](#page=11).
### 2.5 Magic bytes voor bestandsidentificatie
"Magic bytes" zijn de eerste paar bytes van een bestand die vaak bepalen welk type bestand het is. Dit is een methode om de inhoud van een bestand te identificeren, ongeacht de extensie [17](#page=17).
**Voorbeelden van magic bytes:**
* `42 4D` → BMP-bestand [17](#page=17).
* `89 50 4E 47 0D 0A 1A 0A` → PNG-bestand [17](#page=17).
* `FF D8 FF` → JPG-bestand [17](#page=17).
* `4D 5A` → DOS MZ Executable (.exe) [17](#page=17).
Het `file`-commando in Linux gebruikt deze magic bytes om te bepalen welke software gebruikt moet worden om een bestand te openen. Windows gebruikt daarentegen voornamelijk bestandsextensies (.exe,.pdf,.docx) voor deze beslissing [18](#page=18).
> **Tip:** De magic bytes van een bestand veranderen niet als je alleen de extensie van het bestand wijzigt. Een `bestand.docx` zal dus nog steeds de magic bytes van een Word-document bevatten, zelfs als je het hernoemt naar `bestand.pdf` [18](#page=18).
> **Voorbeeld:** Als je een afbeelding downloadt, kan het besturingssysteem de magic bytes lezen om te herkennen dat het een PNG-bestand is, zelfs als de extensie per ongeluk `.txt` is. Vervolgens kan het de juiste afbeeldingssoftware gebruiken om het te openen.
---
# Tekstcoderingen en hun evolutie
Deze sectie behandelt de historische ontwikkeling van tekstcoderingen, beginnend bij de fundamenten van ASCII, de beperkingen ervan, en de introductie van Unicode en UTF-8 als oplossingen voor internationale tekens en efficiënte dataopslag.
### 3.1 De noodzaak van tekstcoderingen
Tekstcoderingen, ook wel bekend als "binary to text encoding", zijn essentieel voor het transformeren van bits naar leesbare tekst. Het primaire doel hiervan is het correct "opslaan" of "overdragen" van data, met name wanneer deze data niet noodzakelijkerwijs gestandaardiseerde karakters bevat, zoals binnen de Engelse taal. De vraag hoe karakters, zoals het Engelse alfabet, opgeslagen zouden worden in computers met behulp van nullen en enen, leidde tot de ontwikkeling van deze coderingen [22](#page=22).
### 3.2 ASCII: de Amerikaanse standaard
ASCII, wat staat voor "American Standard Code for Information Interchange", is een vroege standaard die een mapping definieerde tussen gangbare karakters (voornamelijk het Engelse alfabet) en speciale toetsen van teletype-apparaten, en numerieke waarden (decimaal en hexadecimaal). De ASCII-tabel toont deze standaard [23](#page=23) [24](#page=24).
#### 3.2.1 Kenmerken van ASCII
ASCII gebruikt 7 bits om een karakter op te slaan. Dit betekent dat met 1 byte (8 bits), er voldoende ruimte is om een ASCII-karakter op te slaan, met één bit over [23](#page=23).
#### 3.2.2 Beperkingen van ASCII
Hoewel ASCII goed werkte voor Engelstalige gebruikers, kampte het met significante beperkingen wanneer het aankwam op het representeren van karakters uit andere talen, zoals 'ç', 'è', 'ß', of karakters uit bijvoorbeeld het Japans ('おはよう'). Zelfs met het gebruik van een extra byte per karakter, bleek dit geen effectieve oplossing. Dit leidde tot het ontstaan van meerdere, regio-specifieke coderingen, wat de dataoverdracht tussen verschillende continenten bemoeilijkte, vooral met de opkomst van het internet [25](#page=25).
### 3.3 Unicode: een universele oplossing
Unicode is de hedendaagse standaard die fungeert als een "codepoint"-systeem, waarbij elk karakter een uniek nummer toegewezen krijgt. Een belangrijk kenmerk van Unicode is dat het de ASCII-standaard probeert te behouden, zodat er meer karakters gerepresenteerd kunnen worden zonder de opslagvereisten drastisch te verhogen. Bijvoorbeeld, het karakter 'A' wordt in ASCII gerepresenteerd als 41 (hexadecimaal), en in Unicode als U+0041 [26](#page=26).
### 3.4 UTF-8: efficiënte codering van Unicode
UTF-8 is een voorbeeld van een karaktercodering die gebruikmaakt van Unicode. Er bestaan ook andere UTF-coderingen, zoals UTF-16 en UTF-32. UTF-8 is een variabele lengte codering, wat betekent dat de benodigde opslagruimte afhangt van het Unicode-nummer van het karakter [27](#page=27).
#### 3.4.1 Kenmerken van UTF-8
* **Backward compatibility:** ASCII-karakters behouden hun originele opslagformaat van 1 byte, waardoor UTF-8 achterwaarts compatibel is met ASCII [27](#page=27).
* **Variabele lengte:** Karakters met hogere Unicode-nummers, zoals recente emoji's, vereisen meer bytes voor opslag [27](#page=27).
* **Wijdverbreid gebruik:** UTF-8 is momenteel de meest gebruikte codering, naar schatting wordt deze door minstens 98% van alle webpagina's gebruikt [27](#page=27).
> **Tip:** Begrijpen hoe Unicode werkt als een abstracte verzameling van tekens, en UTF-8 als een concrete manier om die tekens op te slaan, is cruciaal voor het oplossen van compatibiliteitsproblemen.
> **Voorbeeld:** Een simpele letter 'A' vereist in UTF-8 slechts 1 byte (net als in ASCII). Een complexere Chinese karakters kan echter 3 bytes vereisen, en een emoji kan zelfs 4 bytes nodig hebben. Dit maakt UTF-8 efficiënt voor documenten die voornamelijk westerse tekens bevatten, terwijl het toch de representatie van een breed scala aan internationale karakters mogelijk maakt.
---
# Praktische analyse en hacking technieken
Dit onderwerp verkent hoe uitvoerbare bestanden, die machinecode bevatten, ook leesbare tekstuele informatie kunnen bevatten en hoe deze elementen statisch gemanipuleerd kunnen worden voor hackingdoeleinden [32](#page=32) [33](#page=33).
### 4.1 Inzicht in uitvoerbare bestanden
Een uitvoerbaar bestand (executable) is een binair bestand dat instructies bevat die direct door de CPU begrepen en uitgevoerd kunnen worden. Hoewel de kern van een uitvoerbaar bestand bestaat uit machinecode die niet direct menselijk leesbaar is, bevatten veel van deze bestanden ook tekstuele data, zoals strings, die gecodeerd zijn met standaarden zoals ASCII of Unicode. Deze tekstuele componenten zijn vaak toegankelijk en kunnen worden onderzocht met specifieke tools [32](#page=32).
> **Tip:** Het principe hierbij is dat een uitvoerbaar bestand *alle* informatie bevat die het nodig heeft om te functioneren [32](#page=32).
### 4.2 Statische analyse met hex-editors en string-analyse
Statische hacking technieken maken gebruik van analyse van het bestand zelf, zonder het uit te voeren. Twee belangrijke tools in dit proces zijn [33](#page=33) [34](#page=34):
* **String-analyse:** Deze methode zoekt naar leesbare tekstuele reeksen binnen een binair bestand. Dit kan helpen om potentiële aanvalspunten of interessante informatie te identificeren [33](#page=33) [34](#page=34).
* **Hex-editors:** Een hex-editor stelt de gebruiker in staat om de ruwe binaire data van een bestand te bekijken en te bewerken in hexadecimale weergave. Dit maakt het mogelijk om zelfs de kleinste bits en bytes aan te passen [34](#page=34) [35](#page=35).
### 4.3 Manipulatie van uitvoerbare bestanden
De manipulatie van een uitvoerbaar bestand voor statische hacking kan stapsgewijs worden uitgevoerd:
1. **Hex dump genereren:** De binaire inhoud van een uitvoerbaar bestand kan worden gedumpt naar een hexadecimaal bestand. Dit gebeurt typisch met een commando zoals `xxd` [35](#page=35).
> **Voorbeeld:** `xxd if-hello > if-hello.hex` [35](#page=35).
2. **Bewerken in hex-editor:** Het gegenereerde hexadecimale bestand wordt vervolgens geopend met een tekst- of hex-editor. Hier kan de gewenste wijziging in de tekstuele (ASCII) bytes van het programma worden aangebracht. De instructie beschrijft het voorbeeld van het veranderen van een letter in de tekst [35](#page=35).
3. **Herstellen naar binair:** Na de aanpassingen in het hexadecimale bestand, wordt deze weer omgezet naar een binair bestand. Dit kan wederom met de `xxd` tool, maar dan in de reverse modus (`-r`) [36](#page=36).
> **Voorbeeld:** `xxd -r if-hello.hex > if-hello-patched` [36](#page=36).
4. **Uitvoerbaar maken en uitvoeren:** Het nieuw gecreëerde, gepatchte bestand moet uitvoerbaar gemaakt worden met de juiste permissies (bijvoorbeeld met `chmod +x`). Vervolgens kan het gewijzigde programma worden uitgevoerd om het effect van de manipulatie te observeren [36](#page=36).
Door deze technieken kunnen aanvallers de functionaliteit van een programma subtiel aanpassen, bijvoorbeeld om specifieke output te genereren of de flow van de uitvoering te beïnvloeden, zonder de oorspronkelijke broncode te hoeven te zien [33](#page=33).
---
# Opzet van de leeromgeving
Deze sectie beschrijft de essentiële stappen en componenten voor het opzetten van een functionele leeromgeving voor praktische oefeningen, inclusief virtuele machines en een introductie tot Capture The Flag (CTF) labs [37](#page=37).
### 5.1 Virtuele Machines
Voor een effectieve leeromgeving zijn specifieke virtuele machines (VM's) vereist die verschillende doeleinden dienen [38](#page=38).
#### 5.1.1 Windows-client voor malware-analyse
Een Windows-client is noodzakelijk voor het uitvoeren van malware-analyses. Dit stelt studenten in staat om te oefenen met het onderzoeken van kwaadaardige software in een gecontroleerde omgeving [38](#page=38).
#### 5.1.2 Linux-machine voor systeemleren
Een Linux-machine is essentieel voor het leren van fundamentele "operating system things". Er zijn diverse distributies die hiervoor geschikt zijn [38](#page=38):
* **Remnux:** Een specifieke Linux-distributie gericht op beveiligingsanalyse [38](#page=38).
* **Kali Linux:** Een populaire distributie voor penetratietesten en beveiligingsonderzoek [38](#page=38).
* **Debian zonder GUI:** Een gestripte versie van Debian zonder grafische gebruikersinterface kan ook volstaan [38](#page=38).
**Tip:** Zorg ervoor dat je virtuele machines installeert en configureert zonder dat er daadwerkelijk malware aanwezig is tijdens het installatie- of downloadproces [39](#page=39).
### 5.2 Introductie tot Capture The Flag (CTF) Labs
Capture The Flag (CTF) labs vormen een belangrijk onderdeel van de praktische leerervaring [39](#page=39).
#### 5.2.1 Wat is een "FLAG"?
In de context van CTF's is een "FLAG" een specifieke tekenreeks, vaak in het formaat `FLAG-000000`, die gevonden moet worden om een uitdaging te voltooien. Het spelen van CTF's stelt studenten in staat om hun beveiligingsvaardigheden in een competitieve en uitdagende omgeving toe te passen [39](#page=39).
---
## Veelgemaakte fouten om te vermijden
- Bestudeer alle onderwerpen grondig voor examens
- Let op formules en belangrijke definities
- Oefen met de voorbeelden in elke sectie
- Memoriseer niet zonder de onderliggende concepten te begrijpen
Glossary
| Term | Definition |
|------|------------|
| Bit | De kleinste eenheid van digitale informatie, die slechts twee waarden kan aannemen: 0 of 1. |
| Byte | Een groep van 8 bits, die vaak wordt gebruikt als de basiseenheid voor gegevensopslag en -verwerking in computers. |
| Hexadecimaal | Een positioneel talstelsel met basis 16, dat gebruikmaakt van de cijfers 0-9 en de letters A-F om waarden weer te geven. |
| Framework | Een verzameling van bibliotheken, tools en conventies die ontwikkelaars een gestructureerd kader bieden voor het bouwen van softwaretoepassingen. |
| Compiler | Een computerprogramma dat broncode geschreven in een programmeertaal vertaalt naar een machinecode die door de processor kan worden uitgevoerd. |
| Besturingssysteem (OS) | De software die de hardwarebronnen van een computer beheert en diensten levert aan applicaties, zoals Windows, macOS of Linux. |
| CPU (Central Processing Unit) | Het brein van de computer, verantwoordelijk voor het uitvoeren van instructies en berekeningen. |
| Register | Een kleine, zeer snelle geheugeneenheid binnen de CPU die tijdelijk gegevens en instructies opslaat die momenteel worden verwerkt. |
| Logische poort (Logic Gate) | Een basiseenheid in digitale circuits die logische bewerkingen uitvoert op binaire inputs om een enkele binaire output te produceren. |
| Transistor | Een halfgeleidercomponent die gebruikt kan worden als schakelaar of versterker in elektronische circuits, essentieel voor moderne computerhardware. |
| Bestand (File) | Een verzameling gegevens die is opgeslagen op een opslagmedium, zoals een harde schijf, met een naam en metadata. |
| Proces (Process) | Een instantie van een programma dat momenteel wordt uitgevoerd door het besturingssysteem, met zijn eigen geheugenruimte en systeembronnen. |
| Executable | Een bestand dat machinecode bevat die door de CPU kan worden uitgevoerd; het is een programma. |
| Magic Bytes | De eerste paar bytes van een bestand die vaak de bestandstype-identificatie aangeven, gebruikt door software om te bepalen hoe het bestand moet worden geïnterpreteerd. |
| Hex Editor | Een softwaretool die het mogelijk maakt om de binaire inhoud van bestanden op byte-niveau te bekijken en te bewerken. |
| ASCII (American Standard Code for Information Interchange) | Een vroege tekencodering die 7 bits gebruikt om 128 tekens, voornamelijk uit het Engelse alfabet en speciale symbolen, weer te geven. |
| Unicode | Een internationale standaard die een uniek nummer (codepoint) toewijst aan elk teken, ongeacht het platform, de applicatie of de taal, om wereldwijde tekensets te ondersteunen. |
| UTF-8 (Unicode Transformation Format - 8-bit) | Een variabele-lengte tekencodering voor Unicode die achterwaarts compatibel is met ASCII en efficiënt is voor de meeste tekens, vooral die in veelgebruikte talen. |
| Hash / Checksum | Een cryptografische functie die een invoer van willekeurige grootte omzet in een uitvoer van vaste grootte, gebruikt voor gegevensintegriteitscontroles en wachtwoordopslag. |
| Static Hacking | Een methode van analyse waarbij een programma wordt onderzocht zonder het daadwerkelijk uit te voeren, vaak door de code of data te inspecteren. |
| Virtual Machine (VM) | Een softwarematige simulatie van een computersysteem waarop besturingssystemen en applicaties kunnen worden uitgevoerd, geïsoleerd van de hostmachine. |
| CTF (Capture The Flag) | Een type cybersecuritycompetitie waarbij deelnemers uitdagingen moeten oplossen om "flags" (stukjes informatie) te vinden en te verzamelen. |