Grunnleggende om reverse engineering og binæranalyse · leksjon

Oversikt over exploit-primitiver

Forstå grunnleggende exploit-primitiver og hvordan de brukes til å få kontroll over kjøringen av et sårbart program.

Leksjon 3 av 411 trinn

Oversikt over exploit-primitiver er en gratis leksjon i Grunnleggende om reverse engineering og binæranalyse på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Grunnleggende om reverse engineering og binæranalyse, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Grunnleggende om reverse engineering og binæranalyse inneholder totalt 4 leksjoner.

Exploit-primitiver: verktøykassen

Innen sårbarhetsforskning er en exploit-primitive en grunnleggende egenskap en angriper oppnår over et sårbart program. Tenk på dem som spesielle «superkrefter» som gjør det mulig å utføre handlinger programmet ikke er laget for.

Disse primitivene er byggesteinene. De kombinerer ofte flere enklere primitiver for å oppnå et kraftigere resultat, for eksempel å kjøre egen ondsinnet kode.

Det endelige målet: kjøring av kode

Selv om det finnes mange typer sårbarheter, er det endelige målet for mange angripere vilkårlig kodekjøring. Det innebærer å tvinge målprogrammet til å kjøre instruksjoner angriperen selv velger.

Dette oppnås ofte ikke i ett enkelt trinn. I stedet skaffer angriperen seg én eller flere exploit-primitiver og lenker dem deretter sammen på en strategisk måte for å ta full kontroll.

Primitive for vilkårlig lesing

En primitive for vilkårlig lesing gjør det mulig for en angriper å lese data fra en hvilken som helst minneadresse innenfor programmets adresserom. Dette er utrolig kraftig!

Den kan brukes til å:

  • Lekke sensitiv informasjon (for eksempel passord og krypteringsnøkler).
  • Omgå Address Space Layout Randomization (ASLR) ved å avsløre adresser til biblioteker eller stacken.
  • Forstå programmets tilstand for å utforme videre trinn i et exploit.

Prøv å kjøre denne enkle C-koden for å se et konseptuelt eksempel på lesing utenfor en buffer:

#include <stdio.h>
#include <string.h>

// A simple function to demonstrate reading past a buffer
void print_data(char* user_input) {
  char buffer[16]; // A small buffer
  strcpy(buffer, user_input); // Vulnerability: strcpy doesn't check bounds

  // In a real exploit, 'buffer[20]' might contain a secret or a useful address.
  // This illustrates reading an unintended memory location.
  printf("Value at buffer[20] (conceptually): %c\n", buffer[20]);
}

int main() {
  char input_too_long[] = "AAAAAAAAAAAAAAAAAAAAA"; // Longer than 16 bytes
  printf("--- Arbitrary Read Concept ---\n");
  print_data(input_too_long);
  printf("A real primitive would allow reading *any* address, not just nearby.\n");
  return 0;
}

Primitive for vilkårlig skriving

En primitive for vilkårlig skriving gjør det mulig for en angriper å skrive data til en hvilken som helst minneadresse innenfor programmets adresserom, med innhold som angriperen kontrollerer.

Dette regnes ofte som en av de farligste primitivene fordi den gir direkte mulighet til å manipulere programmets tilstand. Den kan brukes til å:

  • Ødelegge kritiske datastrukturer.
  • Overskrive funksjonspekere for å omdirigere kjøringen.
  • Endre returadresser på stacken for å kapre kontrollflyten.

Her er et konseptuelt eksempel på hvordan en bufferoverflyt kan overskrive data utenfor de tiltenkte grensene:

#include <stdio.h>
#include <string.h>

int target_value = 0xDEADBEEF; // A value we might want to overwrite

void modify_buffer(char* user_input) {
  char buffer[16]; // A small buffer
  // Vulnerability: strcpy doesn't check bounds, allowing overflow
  strcpy(buffer, user_input);

  printf("Buffer content: %s\n", buffer);
  // If user_input is long enough, it could overwrite target_value
  printf("Target value after potential overflow: 0x%X\n", target_value);
}

int main() {
  char malicious_data[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCDDDD";
  printf("--- Arbitrary Write Concept ---\n");
  printf("Initial target_value: 0x%X\n", target_value);
  modify_buffer(malicious_data);
  printf("In a true arbitrary write, 'BBBBCCCCDDDD' would be carefully crafted to overwrite a specific address with desired data.\n");
  return 0;
}

Primitive for informasjonslekkasje

En primitive for informasjonslekkasje er en spesifikk anvendelse av vilkårlig lesing. Hovedformålet er å avsløre sensitiv informasjon som programmet vanligvis holder privat.

Vanlige mål for informasjonslekkasjer omfatter:

  • Stackadresser: For å beregne forskyvninger for overskriving av returadresser.
  • Heap-adresser: For å finne bestemte datastrukturer eller objekter.
  • Basisadresser for biblioteker: Nødvendig for å omgå ASLR og finne ROP-gadgets.
  • Sensitive data: For eksempel krypteringsnøkler, brukerlegitimasjon eller intern konfigurasjon.

Denne primitiven er avgjørende for å omgå moderne exploit-beskyttelser.

Kapring av kontrollflyt

Kapring av kontrollflyt innebærer å omdirigere programmets kjøringsbane til en adresse angriperen velger. Dette oppnås vanligvis ved hjelp av primitiver for vilkårlig skriving.

Viktige mål for kapring av kontrollflyten er:

  • Returadresser: Overskrive adressen på stacken som en funksjon skal returnere til.
  • Funksjonspekere: Endre en peker som bestemmer hvilken funksjon som kalles.
  • Unntakshåndterere: Omdirigere det som skjer når en feil oppstår.

Når kontrollflyten er kapret, kan angriperen kjøre egen kode eller lenke sammen eksisterende kode.

Return-Oriented Programming (ROP)

Når direkte vilkårlig kodekjøring forhindres (for eksempel av Data Execution Prevention – DEP), tyr angripere til Return-Oriented Programming (ROP). ROP muliggjør kodekjøring ved å lenke sammen små kodebiter som allerede finnes i programmet eller i innlastede biblioteker.

Disse kodebitene kalles ROP-gadgets. Hver gadget avsluttes vanligvis med instruksjonen ret, som henter en adresse fra stacken og hopper til den. Ved å kontrollere stacken kan en angriper styre rekkefølgen gadgetene kjøres i.

Anatomien til en ROP-gadget

En ROP-gadget er en sekvens med én eller flere maskininstruksjoner som avsluttes med instruksjonen ret. De finnes ved å skanne binærfilen etter bestemte instruksjonsmønstre.

En vanlig gadget kan for eksempel være pop rdi; ret. Denne gadgeten henter en verdi fra stacken og legger den i rdi-registeret (som ofte brukes til det første argumentet i x64-funksjonskall), og returnerer deretter.

Ved å plassere gadget-adresser og argumentene deres på stacken kan en angriper bygge et egendefinert «program» som bare bruker eksisterende kode.

Lenking av primitiver for utnyttelse

Et exploit fra den virkelige verden involverer ofte flere primitiver som virker sammen:

  1. En informasjonslekkasje for å omgå ASLR og finne basisadressene til biblioteker.
  2. En vilkårlig skriving (for eksempel via en bufferoverflyt) for å overskrive en returadresse på stacken.
  3. Den overskrevne returadressen peker til starten av en ROP-kjede.
  4. ROP-kjeden bruker gadgets til å kalle funksjoner (som system()) med argumenter angriperen kontrollerer (som "/bin/sh") for å oppnå vilkårlig kodekjøring.

Denne modulære tilnærmingen gjør exploits kraftige og fleksible.

Hurtigsjekk: Exploit-primitiver

Hvilken exploit-primitive brukes mest direkte til å omgå Address Space Layout Randomization (ASLR)?

Oppsummering: Exploit-primitiver

I dag har vi utforsket de grunnleggende byggesteinene i exploits: exploit-primitiver. Vi har lært om:

  • Vilkårlig lesing: Lese fra hvilken som helst minneplassering.
  • Vilkårlig skriving: Skrive til hvilken som helst minneplassering.
  • Informasjonslekkasje: En spesialisert leseoperasjon for sensitive data, som er avgjørende for å omgå ASLR.
  • Kapring av kontrollflyt: Omdirigere programmets kjøring.
  • Return-Oriented Programming (ROP): Lenke sammen eksisterende kodegadgets for å oppnå kjøring når direkte injisering forhindres.

Å forstå disse primitivene er viktig både for å finne og forhindre sårbarheter.

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 «Oversikt over exploit-primitiver» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Grunnleggende om reverse engineering og binæranalyse, inkludert «Oversikt over exploit-primitiver», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Grunnleggende om reverse engineering og binæranalyse inneholder totalt 4 leksjoner.

Hva lærer jeg i «Oversikt over exploit-primitiver»?

Forstå grunnleggende exploit-primitiver og hvordan de brukes til å få kontroll over kjøringen av et sårbart program. Du øver på Grunnleggende om reverse engineering og binæranalyse 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 Grunnleggende om reverse engineering og binæranalyse?

Ingen tidligere erfaring er nødvendig. Grunnleggende om reverse engineering og binæranalyse 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 «Oversikt over exploit-primitiver»?

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 Grunnleggende om reverse engineering og binæranalyse-leksjonen?

Ja. Alle Grunnleggende om reverse engineering og binæranalyse-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. Identifisere sårbarheter i binærfiler
  2. Introduksjon til fuzzing
  3. Oversikt over exploit-primitiver
  4. Moderne utnyttelsesbegrensninger og omgåelser
← Tilbake til Grunnleggende om reverse engineering og binæranalyse