Assemblytaal en x86-programmeren voor systemen op laag niveau · Les

Basistechnieken voor reverse-engineering

Pas uw debugging- en disassemblyvaardigheden toe om eenvoudige binaries te analyseren, functies te identificeren en programmalogica zonder broncode te begrijpen.

Les 3 van 411 stappen

Basistechnieken voor reverse-engineering is een gratis Assemblytaal en x86-programmeren voor systemen op laag niveau-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Assemblytaal en x86-programmeren voor systemen op laag niveau. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Assemblytaal en x86-programmeren voor systemen op laag niveau bevat in totaal 4 lessen.

Wat is reverse engineering?

Reverse engineering (RE) is het proces waarbij je software analyseert om de interne werking ervan te begrijpen zonder toegang tot de oorspronkelijke broncode. Zie jezelf als een detective voor programma's!

Je neemt een gecompileerd programma (een binair bestand) en werkt terug om te achterhalen wat het doet, hoe het dat doet en soms waarom.

Je RE-gereedschapskist

Voor reverse engineering gebruik je voornamelijk twee soorten programma's:

  • Disassemblers: deze programma's zetten machinecode (de onbewerkte bytes van een programma) terug om in voor mensen leesbare assemblytaal. Bekende voorbeelden zijn objdump, IDA Pro en Ghidra. Ze zijn je 'ogen' op de instructies van het programma.
  • Debuggers: met programma's zoals GDB (GNU Debugger) kun je een programma stap voor stap uitvoeren, de uitvoering pauzeren en op elk moment de inhoud van registers en geheugen inspecteren. Ze zijn je 'handen' om met het actieve programma te werken.

Maak kennis met ons doelprogramma

Voor deze les analyseren we een eenvoudig x86-assemblyprogramma. Stel je voor dat je alleen de gecompileerde versie hebt en de logica ervan moet achterhalen!

Dit programma simuleert een eenvoudige 'wachtwoordcontrole' door twee hardgecodeerde waarden te vergelijken en op basis van het resultaat een bericht af te drukken.

section .data
    msg_access db "Access granted!", 0xA
    len_access equ $ - msg_access
    msg_denied db "Access denied.", 0xA
    len_denied equ $ - msg_denied

section .text
    global _start

_start:
    ; Simulate checking a "password" value
    mov eax, 1234       ; Our "secret" password value
    mov ebx, 5678       ; A "user-provided" value

    cmp eax, ebx        ; Compare secret with user input
    je .access_granted  ; If equal, jump to access granted

.access_denied:
    mov eax, 4          ; sys_write
    mov ebx, 1          ; stdout
    mov ecx, msg_denied
    mov edx, len_denied
    int 0x80
    jmp .exit

.access_granted:
    mov eax, 4          ; sys_write
    mov ebx, 1          ; stdout
    mov ecx, msg_access
    mov edx, len_access
    int 0x80

.exit:
    mov eax, 1          ; sys_exit
    mov ebx, 0          ; Exit code 0
    int 0x80

Compileren en disassembleren

Eerst zouden we ons assemblyprogramma compileren naar een uitvoerbaar bestand. Op Linux gebruik je hiervoor meestal een assembler, zoals NASM, en een linker, zoals LD.

nasm -f elf32 program.asm -o program.o
ld -m elf_i386 program.o -o program

Daarna gebruiken we een disassembler zoals objdump om de machinecode terugvertaald naar assembly te bekijken:

objdump -d program

Dit is een voorbeeld van wat je kunt zien:

08048060 <_start>:
8048060: b8 d2 04 00 00 mov $0x4d2,%eax
8048065: bb 36 16 00 00 mov $0x1636,%ebx
804806a: 39 d8 cmp %ebx,%eax
804806c: 74 1c je 804808a <.access_granted>

Beginpunten herkennen

Bij reverse engineering zoek je een van de eerste dingen naar het beginpunt van het programma. Hier begint de uitvoering.

Bij Linux-uitvoerbare bestanden die vanuit assembly zijn gecompileerd, heet het beginpunt vaak _start. In onze gedisassembleerde uitvoer zie je het label <_start> op adres 08048060.

Hieraan zie je precies waar de CPU begint met het uitvoeren van instructies wanneer het programma wordt geladen.

Programmastroom en sprongen volgen

Om de logica van een programma te begrijpen, moet je de uitvoeringsstroom volgen. Voorwaardelijke sprong-instructies zijn belangrijk om beslissingen te begrijpen, zoals if/else-instructies.

In ons voorbeeld zien we na het vergelijken van eax en ebx met cmp %ebx,%eax de instructie je 804808a <.access_granted>.

  • cmp: vergelijkt twee waarden en stelt CPU-vlaggen in.
  • je (Jump if Equal): als het resultaat van de vergelijking gelijk was, springt de uitvoering naar adres 0804808a, ons blok .access_granted.
  • Als de waarden niet gelijk zijn, gaat de uitvoering verder met de volgende instructie in de reeks, het blok .access_denied.

Systeemaanroepen begrijpen

Programma's communiceren met het besturingssysteem via systeemaanroepen. Op Linux x86 (32-bits) worden deze meestal aangeroepen met de instructie int 0x80.

Vóór int 0x80 worden specifieke registers met waarden geladen:

  • eax: bevat het nummer van de systeemaanroep, bijvoorbeeld 4 voor sys_write en 1 voor sys_exit.
  • ebx, ecx, edx: bevatten argumenten voor de systeemaanroep, bijvoorbeeld de bestandsdescriptor, het bufferadres en de lengte voor sys_write.

Door deze patronen te observeren, kun je acties herkennen zoals schrijven naar de console of het beëindigen van het programma.

Tekenreeksen en gegevens extraheren

Berichten en andere statische gegevens worden opgeslagen in gegevenssecties van het binaire bestand. Je kunt deze vaak bekijken met objdump -s -j .data program of objdump -s -j .rodata program.

In de assembly zie je instructies die het adres van deze tekenreeksen in een register laden, bijvoorbeeld mov ecx, 0x8049080, waarbij 0x8049080 naar een tekenreeks verwijst.

In ons voorbeeld staan de berichten "Access granted!" en "Access denied." in de sectie .data, en worden hun adressen doorgegeven aan sys_write.

De oorspronkelijke logica reconstrueren

Door al deze observaties te combineren, kunnen we de oorspronkelijke logica van het programma reconstrueren:

  • Het begint bij _start.
  • Het laadt twee specifieke gehele waarden in eax en ebx.
  • Het vergelijkt deze twee waarden.
  • Als ze gelijk zijn, springt het naar een sectie die "Access granted!" naar de console afdrukt.
  • Als ze niet gelijk zijn, gaat het verder naar een sectie die "Access denied." naar de console afdrukt.
  • Na het afdrukken wordt het programma netjes beëindigd.

Dit is de kern van reverse engineering: de bedoeling en het gedrag van een programma begrijpen op basis van de gecompileerde vorm.

Korte controle

Bekijk het volgende uiteengezette x86-fragment. Neem aan dat 0x402000 de tekenreeks "Yes\n" bevat en 0x402008 "No\n" bevat.

0x401000: mov eax, 0x5
0x401005: mov ebx, 0x5
0x40100a: cmp eax, ebx
0x40100c: jne 0x401018
0x40100e: mov edi, 0x402000 ; "Yes\n"
0x401013: call 0x401040 <puts@plt>
0x401018: mov edi, 0x402008 ; "No\n"
0x40101d: call 0x401040 <puts@plt>

Samenvatting van de les

In deze les heb je de fundamentele technieken van elementaire reverse-engineering geleerd:

  • Begrijpen wat RE is en waarom het belangrijk is.
  • Belangrijke hulpmiddelen herkennen, zoals disassemblers (objdump) en debuggers (GDB).
  • Het startpunt van het programma (_start) lokaliseren.
  • De programmastroom volgen met voorwaardelijke sprongen (cmp, je).
  • Systeemaanroepen (int 0x80) en hun parameters herkennen.
  • Betekenisvolle tekenreeksen en gegevens uit het binaire bestand halen.

Door deze technieken toe te passen kun je beginnen met het reconstrueren van de logica en het gedrag van programma's, zelfs zonder hun oorspronkelijke broncode!

Gratis beginnen

Leer Assembly met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
12
Lessen
48

Veelgestelde vragen

Is de les “Basistechnieken voor reverse-engineering” gratis?

Ja — de volledige tekst van “Basistechnieken voor reverse-engineering” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Assemblytaal en x86-programmeren voor systemen op laag niveau wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Assemblytaal en x86-programmeren voor systemen op laag niveau bevat in totaal 4 lessen.

Wat leer ik in “Basistechnieken voor reverse-engineering”?

Pas uw debugging- en disassemblyvaardigheden toe om eenvoudige binaries te analyseren, functies te identificeren en programmalogica zonder broncode te begrijpen. Je oefent met Assemblytaal en x86-programmeren voor systemen op laag niveau door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Assemblytaal en x86-programmeren voor systemen op laag niveau te beginnen?

Ervaring vooraf is niet nodig. Assemblytaal en x86-programmeren voor systemen op laag niveau op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Basistechnieken voor reverse-engineering”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Assemblytaal en x86-programmeren voor systemen op laag niveau?

Ja. Elke les over Assemblytaal en x86-programmeren voor systemen op laag niveau bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. GDB gebruiken voor Assembly-debugging
  2. Introductie tot disassemblytools
  3. Basistechnieken voor reverse-engineering
  4. Dynamische analyse met tracing en hooking
← Terug naar Assemblytaal en x86-programmeren voor systemen op laag niveau