Bufferoverflyt og shellcode
Utforsk mekanismene bak sårbarheter for bufferoverflyt og hvordan de kan utnyttes til å injisere og kjøre skadelig shellcode.
Bufferoverflyt og shellcode 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.
Introduksjon: Bufferoverløp
Velkommen til et viktig tema innen sikkerhet på lavt nivå: bufferoverløp. Dette er en type programvaresårbarhet som kan gjøre det mulig for angripere å få kontroll over et program.
Et bufferoverløp oppstår når et program forsøker å skrive mer data inn i en buffer med fast størrelse enn den er laget for å inneholde. De ekstra dataene «flyter over» i tilstøtende minneområder.
Hva er en buffer
I programmering, særlig i språk som C eller assembly, er en buffer ganske enkelt en minneblokk som er reservert for lagring av data. Tenk på den som en beholder med en bestemt kapasitet.
- Buffere brukes ofte til midlertidig lagring, for eksempel av brukerdata eller nettverksdata.
- De kan deklareres som arrayer med tegn (strenger) eller andre datatyper.
- For eksempel deklarerer
char username[32];en buffer som kan inneholde opptil 31 tegn pluss et nulltegn.
Kode: En sårbar buffer
La oss se på et enkelt C-program med et tilsiktet bufferoverløp. Følg nøye med på funksjonen strcpy.
strcpy kopierer en streng fra kilde til mål, men kontrollerer ikke størrelsen på målbufferen. Dette er en vanlig årsak til bufferoverløp.
/* buffer_example.c */
#include <stdio.h>
#include <string.h>
// This function is intentionally vulnerable
void vulnerable_greet(char *name_input) {
char buffer[16]; // A small buffer, 16 bytes
// This is the vulnerability! strcpy doesn't check size.
// If name_input is longer than 15 chars (+ null terminator),
// it will overflow 'buffer'.
strcpy(buffer, name_input);
printf("Hello, %s!\n", buffer);
}
int main() {
// Let's call the vulnerable function with a safe input
vulnerable_greet("CoddyKit User");
printf("Program finished normally.\n");
return 0;
}Stack-rammen
For å forstå hvordan bufferoverløp kan utnyttes, må vi se nærmere på call stack. Når en funksjon kalles, opprettes en ny stack-ramme.
Denne stack-rammen inneholder vanligvis:
- Lokale variabler for funksjonen.
- Den lagrede basepekeren (EBP/RBP).
- Viktigst av alt: returadressen, som forteller CPU-en hvor den skal fortsette kjøringen når funksjonen er ferdig.
Overskrive returadressen
Når det oppstår et bufferoverløp på stacken, ødelegger de ekstra dataene ikke bare tilstøtende lokale variabler. Hvis det sendes inn nok data, kan de overskrive den lagrede EBP-en og deretter selve returadressen.
Ved å endre returadressen kan en angriper lure programmet til å hoppe til en vilkårlig minneadresse i stedet for å returnere til den legitime kalleren. Dette er kjernemekanismen i mange bufferoverløpsangrep.
Introduksjon til shellcode
Hvor vil angriperen at programmet skal hoppe? Vanligvis til en kodestump angriperen kontrollerer, kjent som shellcode.
- Shellcode er en liten, selvstendig del av maskinkode.
- Hovedformålet er ofte å starte et «shell» (en kommandolinje) på målsystemet.
- Den kan også utføre andre skadelige handlinger, som å opprette nye brukere, laste ned filer eller koble til en ekstern server.
Anatomien til enkel shellcode
Shellcode skrives vanligvis i assembly for å bli så kompakt og effektiv som mulig. Den unngår nullbyte (\x00) fordi mange strengfunksjoner slutter å kopiere ved den første nullbyten.
Et vanlig mål er å kalle systemkallet execve (på Linux) for å starte /bin/sh.
; Example (conceptual) Linux x86 shellcode snippet:
; mov eax, 0x0b ; Syscall number for execve
; mov ebx, addr_of_sh ; Pointer to '/bin/sh' string
; mov ecx, 0 ; Arg 2 (argv) = NULL
; mov edx, 0 ; Arg 3 (envp) = NULL
; int 0x80 ; Invoke kernel (syscall)Injisering av shellcode
Hvordan kommer shellcode inn i programmet? Angriperen inkluderer den som en del av de skadelige inndataene som forårsaker bufferoverløpet.
Når bufferen flyter over, skrives shellcode inn i programmets minne, vanligvis på stacken, sammen med den overskrevne returadressen.
Utnyttelsesstruktur: NOP-slede
Angripere bruker ofte en NOP-slede (No Operation-slede) for å gjøre utnyttelsen mer pålitelig.
- En NOP-slede er en sekvens med «No Operation»-instruksjoner (NOP), for eksempel
\x90i x86. - Hvis angriperen overskriver returadressen slik at den peker et sted i NOP-sleden, vil CPU-en ganske enkelt utføre NOP-instruksjonene til den «glir» inn i selve shellcode-en.
- Dette kompenserer for små unøyaktigheter i gjettingen av den nøyaktige minneadressen til shellcode-en.
Forsvar og mottiltak
Operativsystemer og kompilatorer har utviklet flere forsvar mot bufferoverløp:
- ASLR (Address Space Layout Randomization): Gjør minneadressene tilfeldige, slik at det blir vanskeligere å gjette returadressen eller plasseringen av shellcode.
- DEP/NX-bit (Data Execution Prevention/No-Execute): Merker minneområder (som stacken) som ikke-kjørbare, slik at shellcode ikke kan kjøres der.
- Stack-canaries: Tilfeldige verdier generert av kompilatoren og plassert på stacken. Hvis de overskrives, oppdager programmet manipuleringen og avslutter.
- Sikre funksjoner: Bruke funksjoner som
strncpy,snprintf,fgetseller C++-strenger som kontrollerer grensene.
Test forståelsen
Et bufferoverløp på stacken gjør det mulig for en angriper å skrive forbi slutten av en buffer. Hva er det primære målet en angriper forsøker å oppnå ved å utforme inndata nøye slik at returadressen overskrives?
Oppsummering: Bufferoverløp og shellcode
I denne leksjonen utforsket vi den farlige verdenen med buffer-overflyter. Vi lærte at de oppstår når for mye data skrives til en buffer med fast størrelse, slik at tilstøtende minne blir ødelagt.
Hvis denne overflyten når returadressen på stakken, kan en angriper ta kontroll over programflyten. Dette oppnår de ved å injisere shellcode – liten, ondsinnet maskinkode – og omdirigere kjøringen til den, ofte ved hjelp av en NOP-slede. Vi var også innom viktige mottiltak som ASLR, DEP og stack canaries.
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 «Bufferoverflyt og shellcode» gratis?
Ja – hele teksten i «Bufferoverflyt og shellcode» 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 «Bufferoverflyt og shellcode»?
Utforsk mekanismene bak sårbarheter for bufferoverflyt og hvordan de kan utnyttes til å injisere og kjøre skadelig shellcode. 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 «Bufferoverflyt og shellcode»?
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
- Cache-koherens og ytelse
- Manuell optimalisering av kritiske seksjoner
- Bufferoverflyt og shellcode
- Grenprediksjon og spekulativ kjøring