Assembly-sprog og x86-systemprogrammering på lavt niveau · Lektion

Grundlæggende reverse engineering-teknikker

Anvend Deres debugging- og disassembly-færdigheder til at analysere simple binære filer, identificere funktioner og forstå programlogik uden kildekode.

Lektion 3 af 411 trin

Grundlæggende reverse engineering-teknikker er en gratis Assembly-sprog og x86-systemprogrammering på lavt niveau-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Assembly-sprog og x86-systemprogrammering på lavt niveau, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset indeholder 4 lektioner i alt.

Hvad er reverse engineering?

Reverse engineering (RE) er processen, hvor software analyseres for at forstå dens indre funktioner uden adgang til den oprindelige kildekode. Tænk på det som at være detektiv for programmer!

Det indebærer, at du tager et kompileret program (en binærfil) og arbejder baglæns for at finde ud af, hvad det gør, hvordan det gør det og nogle gange hvorfor.

Dit værktøjssæt til RE

Til reverse engineering bruger du primært to slags værktøjer:

  • Dekodere: Disse værktøjer omdanner maskinkode (et programs rå bytes) tilbage til assemblysprog, som mennesker kan læse. Populære eksempler er objdump, IDA Pro og Ghidra. De er dine "øjne" ind i programmets instruktioner.
  • Fejlfindere: Værktøjer som GDB (GNU Debugger) lader dig køre et program trin for trin, sætte udførelsen på pause og undersøge indholdet af registre og hukommelse på ethvert tidspunkt. De er dine "hænder", når du interagerer med det kørende program.

Mød målprogrammet

I denne lektion analyserer du et enkelt x86-assemblyprogram. Forestil dig, at du kun har den kompilerede version og skal finde frem til logikken!

Programmet simulerer et grundlæggende "adgangskodetjek" ved at sammenligne to hardkodede værdier og udskrive en meddelelse baseret 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 0x80

Kompilering og dekodning

Først kompilerer vi vores assemblyprogram til en eksekverbar fil. På Linux indebærer det typisk en assembler (som NASM) og en linker (som LD).

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

Derefter bruger vi en dekoder som objdump for at se maskinkoden omdannet tilbage til assembly:

objdump -d program

Her er et udsnit af det, du muligvis ser:

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>

Identifikation af startpunkter

Når du udfører reverse engineering, er programmets startpunkt noget af det første, du leder efter. Det er her, udførelsen begynder.

For Linux-eksekverbare filer, der er kompileret fra assembly, hedder startpunktet ofte _start. I vores dekodede output kan du se etiketten <_start> på adressen 08048060.

Det fortæller dig præcis, hvor CPU'en begynder at udføre instruktioner, når programmet indlæses.

Sporing af programflow og spring

For at forstå et programs logik skal du følge dets udførelsesforløb. Instruktioner med betingede spring er afgørende for at forstå beslutninger, f.eks. if/else-sætninger.

I vores eksempel ser vi efter sammenligningen af eax og ebx med cmp %ebx,%eax je 804808a <.access_granted>.

  • cmp: Sammenligner to værdier og indstiller CPU-flag.
  • je (Jump if Equal): Hvis sammenligningen gav et lighedstegn, springer udførelsen til adressen 0804808a (vores blok .access_granted).
  • Hvis værdierne ikke er ens, fortsætter udførelsen med den næste instruktion i rækkefølgen (blokken .access_denied).

Forståelse af systemkald

Programmer interagerer med operativsystemet gennem systemkald. På Linux x86 (32-bit) startes de typisk med instruktionen int 0x80.

Før int 0x80 indlæses bestemte registre med værdier:

  • eax: Indeholder systemkaldets nummer, f.eks. 4 for sys_write og 1 for sys_exit.
  • ebx, ecx, edx: Indeholder argumenter til systemkaldet, f.eks. fildeskriptor, bufferadresse og længde for sys_write.

Ved at observere disse mønstre kan du identificere handlinger som at skrive til konsollen eller afslutte programmet.

Udtrækning af strenge og data

Meddelelser og andre statiske data gemmes i datasektioner i binærfilen. Du kan ofte se dem med objdump -s -j .data program eller objdump -s -j .rodata program.

I assemblykoden ser du instruktioner, der indlæser adressen på disse strenge i et register, f.eks. mov ecx, 0x8049080, hvor 0x8049080 peger på en streng.

I vores eksempel findes meddelelserne "Access granted!" og "Access denied." i sektionen .data, og deres adresser sendes til sys_write.

Genskabelse af den oprindelige logik

Ved at samle alle disse observationer kan vi genskabe programmets oprindelige logik:

  • Det starter ved _start.
  • Det indlæser to bestemte heltalsværdier i eax og ebx.
  • Det sammenligner disse to værdier.
  • Hvis de er ens, springer det til en sektion, der udskriver "Access granted!" i konsollen.
  • Hvis de ikke er ens, fortsætter det til en sektion, der udskriver "Access denied." i konsollen.
  • Efter udskrivningen afsluttes programmet korrekt.

Dette er essensen af reverse engineering: at forstå programmets hensigt og adfærd ud fra dets kompilerede form.

Hurtigt tjek

Se på følgende deassemblerede x86-udsnit. Antag, at 0x402000 indeholder strengen "Yes\n", og at 0x402008 indeholder "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>

Opsummering af lektionen

I denne lektion har du lært de grundlæggende teknikker inden for reverse engineering:

  • At forstå, hvad RE er, og hvorfor det er vigtigt.
  • At identificere vigtige værktøjer som deassembleringsværktøjer (objdump) og fejlfindere (GDB).
  • At finde programmets startpunkt (_start).
  • At følge programmets forløb ved hjælp af betingede spring (cmp, je).
  • At genkende systemkald (int 0x80) og deres parametre.
  • At udtrække meningsfulde strenge og data fra den binære fil.

Ved at anvende disse teknikker kan du begynde at genskabe programmers logik og funktionsmåde, selv uden deres oprindelige kildekode!

Gratis at komme i gang

Lær Assembly med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
12
Lektioner
48

Ofte stillede spørgsmål

Er lektionen “Grundlæggende reverse engineering-teknikker” gratis?

Ja — hele teksten til “Grundlæggende reverse engineering-teknikker” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset, skal du opgradere til CoddyKit PRO. Assembly-sprog og x86-systemprogrammering på lavt niveau-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Grundlæggende reverse engineering-teknikker”?

Anvend Deres debugging- og disassembly-færdigheder til at analysere simple binære filer, identificere funktioner og forstå programlogik uden kildekode. Du øver dig i Assembly-sprog og x86-systemprogrammering på lavt niveau med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Assembly-sprog og x86-systemprogrammering på lavt niveau?

Der kræves ingen tidligere erfaring. Assembly-sprog og x86-systemprogrammering på lavt niveau på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Grundlæggende reverse engineering-teknikker”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Assembly-sprog og x86-systemprogrammering på lavt niveau-lektion?

Ja. Alle Assembly-sprog og x86-systemprogrammering på lavt niveau-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Brug af GDB til Assembly-debugging
  2. Introduktion til disassembly-værktøjer
  3. Grundlæggende reverse engineering-teknikker
  4. Dynamisk analyse med tracing og hooking
← Tilbage til Assembly-sprog og x86-systemprogrammering på lavt niveau