Bufferoverløb og shellcode
Udforsk mekanismerne bag sårbarheder med bufferoverløb, og hvordan de kan udnyttes til at indsætte og køre skadelig shellcode.
Bufferoverløb og shellcode 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.
Introduktion: Bufferoverløb
Velkommen til et kritisk emne inden for sikkerhed på lavt niveau: bufferoverløb. Det er en type softwaresårbarhed, der kan give angribere kontrol over et program.
Et bufferoverløb opstår grundlæggende, når et program forsøger at skrive flere data ind i en hukommelsesbuffer med fast størrelse, end den er designet til at indeholde. De overskydende data 'flyder over' i tilstødende hukommelsesområder.
Hvad er en buffer
I programmering, især i sprog som C eller assembly, er en buffer ganske enkelt en hukommelsesblok, der er reserveret til lagring af data. Tænk på den som en beholder med en bestemt kapacitet.
- Buffere bruges ofte til midlertidig lagring, f.eks. til brugerinput eller netværksdata.
- De kan erklæres som arrays af tegn (strenge) eller andre datatyper.
- For eksempel erklærer
char username[32];en buffer, der kan indeholde op til 31 tegn plus en nulterminator.
Kode: En sårbar buffer
Lad os se på et simpelt C-program med en bevidst sårbarhed for bufferoverløb. Vær især opmærksom på funktionen strcpy.
strcpy kopierer en streng fra kilde til destination, men kontrollerer ikke størrelsen på destinationsbufferen. Det er en almindelig årsag til bufferoverløb.
/* 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;
}Stackrammen
For at forstå, hvordan bufferoverløb kan udnyttes, skal vi se på kaldestakken igen. Når en funktion kaldes, oprettes der en ny stackramme.
Stackrammen indeholder typisk:
- Lokale variable for funktionen.
- Den gemte Base Pointer (EBP/RBP).
- Vigtigst af alt: returadressen, som fortæller CPU'en, hvor udførelsen skal genoptages, når funktionen er færdig.
Overskrivning af returadressen
Når der opstår et bufferoverløb på stacken, beskadiger de overskydende data ikke kun tilstødende lokale variable. Hvis der leveres tilstrækkeligt med data, kan de overskrive den gemte EBP og derefter selve returadressen.
Ved at ændre returadressen kan en angriber narre programmet til at springe til en vilkårlig hukommelsesplacering i stedet for at vende tilbage til den legitime kaldende kode. Det er den centrale mekanisme i mange bufferoverløbsudnyttelser.
Introduktion til shellcode
Hvor vil angriberen have programmet til at springe hen? Som regel til et stykke kode, som angriberen kontrollerer, og som kaldes shellcode.
- Shellcode er et lille, selvstændigt stykke maskinkode.
- Det primære formål er ofte at starte en 'shell' (en kommandoprompt) på målsystemet.
- Det kan også udføre andre ondsindede handlinger, f.eks. oprette nye brugere, downloade filer eller oprette forbindelse til en fjernserver.
Anatomi af simpel shellcode
Shellcode skrives typisk i assemblysprog for at være så kompakt og effektiv som muligt. Den undgår nulbyte (\x00), fordi mange strengfunktioner stopper kopieringen ved den første nulbyte.
Et almindeligt mål er at kalde systemkaldet execve (på Linux) for at 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)Indsættelse af shellcode
Hvordan kommer shellcoden ind i programmet? Angriberen inkluderer den som en del af det ondsindede input, der forårsager bufferoverløbet.
Når bufferen løber over, skrives shellcoden ind i programmets hukommelse, som regel på stacken sammen med den overskrevne returadresse.
Udnyttelsesstruktur: NOP-glidebane
Angribere bruger ofte en NOP-glidebane (No Operation-glidebane) for at øge pålideligheden af deres udnyttelse.
- En NOP-glidebane er en sekvens af 'No Operation'-instruktioner (NOP'er) (f.eks.
\x90i x86). - Hvis angriberen overskriver returadressen, så den peger et vilkårligt sted i NOP-glidebanen, udfører CPU'en blot NOP'er, indtil den 'glider' ind i den faktiske shellcode.
- Det kompenserer for små unøjagtigheder i gættet på shellcodens præcise hukommelsesadresse.
Forsvar og modforanstaltninger
Operativsystemer og compilere har udviklet flere forsvar mod bufferoverløb:
- ASLR (Address Space Layout Randomization): Gør hukommelsesadresser tilfældige, så det bliver sværere at gætte returadressen eller shellcodens placering.
- DEP/NX-bit (Data Execution Prevention/No-Execute): Markerer hukommelsesområder (f.eks. stacken) som ikke-eksekverbare, så shellcode ikke kan køre der.
- Stack-canaries: Tilfældigt genererede værdier fra compileren, der placeres på stacken. Hvis de overskrives, registrerer programmet manipulationen og afbryder.
- Sikre funktioner: Brug af funktioner som
strncpy,snprintf,fgetseller C++-strenge, der kontrollerer grænser.
Test din forståelse
Et bufferoverløb på stacken giver en angriber mulighed for at skrive efter bufferens slutning. Hvad er det primære mål, en angriber forsøger at opnå ved omhyggeligt at udforme input, så returadressen overskrives?
Opsummering: Bufferoverløb og shellcode
I denne lektion udforskede du den farlige verden af bufferoverløb. Du lærte, at de opstår, når der skrives for mange data ind i en buffer med fast størrelse, så den tilstødende hukommelse bliver ødelagt.
Hvis dette overløb når frem til returadressen på stakken, kan en angriber overtage styringen af programmet. Det gør angriberen ved at indsætte shellcode—lille, skadelig maskinkode—og omdirigere udførelsen til den, ofte hjulpet af en NOP-slæde. Du stiftede også bekendtskab med vigtige modforanstaltninger som ASLR, DEP og stak-canaries.
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 “Bufferoverløb og shellcode” gratis?
Ja — hele teksten til “Bufferoverløb og shellcode” 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 “Bufferoverløb og shellcode”?
Udforsk mekanismerne bag sårbarheder med bufferoverløb, og hvordan de kan udnyttes til at indsætte og køre skadelig shellcode. 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 “Bufferoverløb og shellcode”?
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
- Cachekoherens og ydeevne
- Manuel optimering af kritiske sektioner
- Bufferoverløb og shellcode
- Branch prediction og spekulativ eksekvering