Grundläggande reverse engineering-tekniker
Använd dina färdigheter inom felsökning och disassemblering för att analysera enkla binärfiler, identifiera funktioner och förstå programlogik utan källkod.
Grundläggande reverse engineering-tekniker är en gratis lektion i Assembler och lågnivåprogrammering för x86-system på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Assembler och lågnivåprogrammering för x86-system, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Assembler och lågnivåprogrammering för x86-system innehåller totalt 4 lektioner.
Vad är reverse engineering?
Reverse engineering (RE) är processen att analysera programvara för att förstå hur den fungerar internt utan tillgång till den ursprungliga källkoden. Tänk på det som att vara detektiv för program!
Det innebär att ta ett kompilerat program (en binärfil) och arbeta bakifrån för att ta reda på vad det gör, hur det gör det och ibland varför.
Era verktyg för RE
För reverse engineering använder ni huvudsakligen två typer av verktyg:
- Disassemblerare: Dessa verktyg omvandlar maskinkod (programmets råa byte) tillbaka till assemblerkod som människor kan läsa. Populära exempel är
objdump, IDA Pro och Ghidra. De är era ”ögon” mot programmets instruktioner. - Felsökare: Verktyg som GDB (GNU Debugger) låter er köra ett program steg för steg, pausa körningen och granska innehållet i register och minne när som helst. De är era ”händer” för att interagera med programmet under körning.
Möt målprogrammet
I den här lektionen analyserar vi ett enkelt x86-assemblerprogram. Föreställ er att ni bara har den kompilerade versionen och behöver ta reda på dess logik!
Programmet simulerar en enkel ”lösenordskontroll” genom att jämföra två hårdkodade värden och skriva ut ett meddelande baserat på resultatet.
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 0x80Kompilera och disassemblera
Först skulle vi kompilera assemblerprogrammet till en körbar fil. I Linux innebär detta vanligtvis en assembler (som NASM) och en länkare (som LD).
nasm -f elf32 program.asm -o program.old -m elf_i386 program.o -o program
Sedan använder vi en disassemblerare som objdump för att se maskinkoden omvandlad tillbaka till assemblerkod:
objdump -d program
Här är ett utdrag av det ni kan tänkas se:
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>
Identifiera startpunkter
När ni ägnar er åt reverse engineering är programmets startpunkt en av de första sakerna ni letar efter. Det är där körningen börjar.
I Linux-körbara filer som kompilerats från assembler är startpunkten ofta märkt _start. I vårt disassemblerade resultat kan ni se etiketten <_start> vid adressen 08048060.
Detta visar exakt var processorn börjar köra instruktioner när programmet läses in.
Spåra programmets flöde och hopp
För att förstå ett programs logik måste ni följa dess körningsflöde. Instruktioner för villkorsstyrda hopp är centrala för att förstå beslutslogik (som if/else-satser).
I vårt exempel ser vi je 804808a <.access_granted> efter att eax och ebx har jämförts med cmp %ebx,%eax.
cmp: Jämför två värden och ställer in processorns flaggor.je(Jump if Equal): Om jämförelsen gav lika värden hoppar körningen till adressen0804808a(blocket.access_granted).- Om värdena inte är lika fortsätter körningen med nästa instruktion i ordningsföljden (blocket
.access_denied).
Förstå systemanrop
Program interagerar med operativsystemet genom systemanrop. I Linux x86 (32-bitars) görs dessa vanligtvis med instruktionen int 0x80.
Före int 0x80 läses specifika register in med värden:
eax: Innehåller systemanropsnumret (till exempel4försys_writeoch1försys_exit).ebx, ecx, edx: Innehåller argument för systemanropet (till exempel filbeskrivare, buffertadress och längd försys_write).
Genom att observera dessa mönster kan ni identifiera åtgärder som att skriva till konsolen eller avsluta programmet.
Extrahera strängar och data
Meddelanden och andra statiska data lagras i binärfilens datasektioner. Ni kan ofta visa dem med objdump -s -j .data program eller objdump -s -j .rodata program.
I assemblerkoden ser ni instruktioner som läser in adressen till dessa strängar i ett register (till exempel mov ecx, 0x8049080, där 0x8049080 pekar på en sträng).
I vårt exempel finns meddelandena ”Access granted!” och ”Access denied.” i sektionen .data, och deras adresser skickas till sys_write.
Återskapa den ursprungliga logiken
Genom att kombinera alla dessa observationer kan vi återskapa programmets ursprungliga logik:
- Det startar vid
_start. - Det läser in två specifika heltalsvärden i
eaxochebx. - Det jämför dessa två värden.
- Om de är lika hoppar det till en sektion som skriver ut ”Access granted!” i konsolen.
- Om de inte är lika fortsätter det till en sektion som skriver ut ”Access denied.” i konsolen.
- Efter utskriften avslutas programmet på ett ordnat sätt.
Detta är kärnan i reverse engineering: att förstå programmets avsikt och beteende utifrån dess kompilerade form.
Snabb kontroll
Ta en titt på följande disassemblerade x86-kod. Anta att 0x402000 innehåller strängen "Yes\n" och att 0x402008 innehåller "No\n".
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>
Lektionssammanfattning
I den här lektionen har du lärt dig grundläggande tekniker inom reverse engineering:
- Förstå vad RE är och varför det är viktigt.
- Identifiera viktiga verktyg som disassemblers (
objdump) och debuggers (GDB). - Lokalisera programmets startpunkt (
_start). - Följa programmets flöde med villkorliga hopp (
cmp,je). - Känna igen systemanrop (
int 0x80) och deras parametrar. - Extrahera meningsfulla strängar och data ur binärfilen.
Genom att använda dessa tekniker kan du börja återskapa programs logik och beteende även utan den ursprungliga källkoden!
Lär dig Assembly med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Grundläggande reverse engineering-tekniker” gratis?
Ja – hela texten till ”Grundläggande reverse engineering-tekniker” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Assembler och lågnivåprogrammering för x86-system, kan Ni uppgradera till CoddyKit PRO. Kursen i Assembler och lågnivåprogrammering för x86-system innehåller totalt 4 lektioner.
Vad lär jag mig i ”Grundläggande reverse engineering-tekniker”?
Använd dina färdigheter inom felsökning och disassemblering för att analysera enkla binärfiler, identifiera funktioner och förstå programlogik utan källkod. Ni övar på Assembler och lågnivåprogrammering för x86-system med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Assembler och lågnivåprogrammering för x86-system?
Du behöver inga förkunskaper. Utbildningen i Assembler och lågnivåprogrammering för x86-system på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Grundläggande reverse engineering-tekniker”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Assembler och lågnivåprogrammering för x86-system-lektionen?
Ja. Varje Assembler och lågnivåprogrammering för x86-system-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Använda GDB för felsökning av Assembly
- Introduktion till disassembleringsverktyg
- Grundläggande reverse engineering-tekniker
- Dynamisk analys med tracing och hooking