Grunnleggende teknikker for reversering
Bruk ferdighetene Deres innen feilsøking og disassemblering til å analysere enkle binærfiler, identifisere funksjoner og forstå programlogikk uten kildekode.
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å bytene 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 0x80Kompilere 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.old -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 adressen0804808a(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 eksempel4forsys_writeog1forsys_exit).ebx, ecx, edx: Inneholder argumenter til systemkallet (for eksempel fildeskriptor, bufferadresse og lengde forsys_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
eaxogebx. - 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!
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
- Bruk av GDB til feilsøking av Assembly
- Introduksjon til disassembleringsverktøy
- Grunnleggende teknikker for reversering
- Dynamisk analyse med tracing og hooking