Assembly-språk og x86-programmering på lavt systemnivå · leksjon

Grunnleggende teknikker for reversering

Bruk ferdighetene Deres innen feilsøking og disassemblering til å analysere enkle binærfiler, identifisere funksjoner og forstå programlogikk uten kildekode.

Leksjon 3 av 411 trinn

Grunnleggende teknikker for reversering er en gratis leksjon i Assembly-språk og x86-programmering på lavt systemnivå på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Assembly-språk og x86-programmering på lavt systemnivå, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Assembly-språk og x86-programmering på lavt systemnivå inneholder totalt 4 leksjoner.

Hva er reverse engineering?

Reverse engineering (RE) er prosessen med å analysere programvare for å forstå hvordan den fungerer internt, uten tilgang til den opprinnelige kildekoden. Tenk på det som å være detektiv for programmer!

Det innebærer å ta et kompilert program (en binærfil) og arbeide bakover for å finne ut hva det gjør, hvordan det gjør det og noen ganger hvorfor.

Verktøykassen for RE

For å utføre reverse engineering bruker De hovedsakelig to typer verktøy:

  • Disassembleringsverktøy: Disse verktøyene konverterer maskinkode (de rå byt­ene i et program) tilbake til assembler-språk som mennesker kan lese. Populære eksempler er objdump, IDA Pro og Ghidra. De er Deres «øyne» inn i programmets instruksjoner.
  • Feilsøkere: Verktøy som GDB (GNU Debugger) lar Dem kjøre et program steg for steg, sette kjøringen på pause og undersøke innholdet i registre og minne når som helst. De er Deres «hender» for å samhandle med programmet mens det kjører.

Møt målprogrammet vårt

I denne leksjonen skal vi analysere et enkelt x86-assemblerprogram. Tenk Dem at De bare har den kompilerte versjonen og må finne ut hvordan logikken fungerer!

Programmet simulerer en enkel «passordsjekk» ved å sammenligne to hardkodede verdier og skrive ut en melding basert 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

Kompilere og disassemblere

Først kompilerer vi assemblerprogrammet til en kjørbar fil. På Linux innebærer dette vanligvis 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

Deretter bruker vi et disassembleringsverktøy som objdump for å se maskinkoden konvertert tilbake til assembler:

objdump -d program

Her er et utdrag av det De kan 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>

Identifisere startpunkter

Når De utfører reverse engineering, er noe av det første De ser etter programmets startpunkt. Det er her kjøringen begynner.

For Linux-kjørbare filer som er kompilert fra assembler, er startpunktet ofte merket _start. I resultatet fra disassembleringen kan De se etiketten <_start> på adressen 08048060.

Dette forteller Dem nøyaktig hvor CPU-en begynner å utføre instruksjoner når programmet lastes inn.

Følge programflyt og hopp

For å forstå logikken i et program må De følge kjøringsflyten. Instruksjoner for betingede hopp er sentrale for å forstå beslutninger (som if/else-setninger).

I eksempelet vårt ser vi je 804808a <.access_granted> etter at eax og ebx er sammenlignet med cmp %ebx,%eax.

  • cmp: Sammenligner to verdier og setter CPU-flagg.
  • je (Jump if Equal): Hvis sammenligningen viste at verdiene var like, hopper kjøringen til adressen 0804808a (blokken vår .access_granted).
  • Hvis verdiene ikke er like, fortsetter kjøringen med neste instruksjon i sekvensen (blokken .access_denied).

Forstå systemkall

Programmer samhandler med operativsystemet gjennom systemkall. På Linux x86 (32-bit) startes disse vanligvis med instruksjonen int 0x80.

Før int 0x80 lastes bestemte registre med verdier:

  • eax: Inneholder nummeret til systemkallet (for eksempel 4 for sys_write og 1 for sys_exit).
  • ebx, ecx, edx: Inneholder argumenter til systemkallet (for eksempel fildeskriptor, bufferadresse og lengde for sys_write).

Ved å observere disse mønstrene kan De identifisere handlinger som å skrive til konsollen eller avslutte programmet.

Hente ut strenger og data

Meldinger og andre statiske data lagres i dataseksjoner i binærfilen. De kan ofte vise disse med objdump -s -j .data program eller objdump -s -j .rodata program.

I assemblerkoden ser De instruksjoner som laster adressen til disse strengene inn i et register (for eksempel mov ecx, 0x8049080, der 0x8049080 peker på en streng).

I eksempelet vårt finnes meldingene «Access granted!» og «Access denied.» i .data-seksjonen, og adressene deres sendes til sys_write.

Gjenopprette den opprinnelige logikken

Ved å kombinere alle disse observasjonene kan vi rekonstruere programmets opprinnelige logikk:

  • Det starter ved _start.
  • Det laster to bestemte heltallsverdier inn i eax og ebx.
  • Det sammenligner disse to verdiene.
  • Hvis de er like, hopper det til en seksjon som skriver ut «Access granted!» på konsollen.
  • Hvis de ikke er like, fortsetter det til en seksjon som skriver ut «Access denied.» på konsollen.
  • Etter utskriften avsluttes programmet på normal måte.

Dette er kjernen i reverse engineering: å forstå programmets hensikt og oppførsel ut fra den kompilerte formen.

Kjapp kontroll

Se på følgende demonterte x86-kodesnutt. Anta at 0x402000 inneholder strengen "Yes\n", og at 0x402008 inneholder "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>

Oppsummering av leksjonen

I denne leksjonen har du lært de grunnleggende teknikkene innen enkel reverse engineering:

  • Forstå hva RE er, og hvorfor det er viktig.
  • Identifisere viktige verktøy som disassemblerere (objdump) og debuggere (GDB).
  • Finne programmets startpunkt (_start).
  • Følge programflyten ved hjelp av betingede hopp (cmp, je).
  • Gjenkjenne systemkall (int 0x80) og parameterne deres.
  • Hente ut meningsfulle strenger og data fra binærfilen.

Ved å bruke disse teknikkene kan du begynne å rekonstruere logikken og virkemåten til programmer, selv uten den opprinnelige kildekoden!

Gratis å komme i gang

Lær deg Assembly med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
12
Leksjoner
48

Ofte stilte spørsmål

Er leksjonen «Grunnleggende teknikker for reversering» gratis?

Ja – hele teksten i «Grunnleggende teknikker for reversering» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Assembly-språk og x86-programmering på lavt systemnivå-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Assembly-språk og x86-programmering på lavt systemnivå inneholder totalt 4 leksjoner.

Hva lærer jeg i «Grunnleggende teknikker for reversering»?

Bruk ferdighetene Deres innen feilsøking og disassemblering til å analysere enkle binærfiler, identifisere funksjoner og forstå programlogikk uten kildekode. Du øver på Assembly-språk og x86-programmering på lavt systemnivå med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Assembly-språk og x86-programmering på lavt systemnivå?

Ingen tidligere erfaring er nødvendig. Assembly-språk og x86-programmering på lavt systemnivå på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Grunnleggende teknikker for reversering»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Assembly-språk og x86-programmering på lavt systemnivå-leksjonen?

Ja. Alle Assembly-språk og x86-programmering på lavt systemnivå-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Bruk av GDB til feilsøking av Assembly
  2. Introduksjon til disassembleringsverktøy
  3. Grunnleggende teknikker for reversering
  4. Dynamisk analyse med tracing og hooking
← Tilbake til Assembly-språk og x86-programmering på lavt systemnivå