Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet · Oppitunti

Hyödyntämisprimitiivien yleiskatsaus

Ymmärrä hyödyntämisprimitiivien perusteet ja se, miten niitä käytetään haavoittuvan ohjelman suorituksen hallintaan.

Oppitunti 3/411 vaihetta

Hyödyntämisprimitiivien yleiskatsaus on ilmainen Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-kurssilla on yhteensä 4 oppituntia.

Exploit-primitiiivit: työkalupakki

Haavoittuvuustutkimuksessa exploit-primitiivi on perustason kyky, jonka hyökkääjä saa haavoittuvaan ohjelmaan nähden. Niitä voi ajatella erityisinä ”supervoimina”, joiden avulla ohjelmalla voi tehdä asioita, joita sitä ei ole suunniteltu tekemään.

Nämä primitiivit ovat rakennuspalikoita. Usein yhdistätte useita yksinkertaisempia primitiivejä saadaksenne aikaan tehokkaamman lopputuloksen, kuten oman haitallisen koodin suorittamisen.

Perimmäinen tavoite: koodin suorittaminen

Vaikka haavoittuvuuksia on monenlaisia, monien hyökkääjien perimmäinen tavoite on mielivaltaisen koodin suorittaminen. Tämä tarkoittaa kohdeohjelman pakottamista suorittamaan hyökkääjän valitsemia käskyjä.

Tähän ei yleensä päästä yhdellä askeleella. Sen sijaan hyökkääjä hankkii yhden tai useita exploit-primitiivejä ja ketjuttaa ne strategisesti saadakseen täyden hallinnan.

Mielivaltaisen luvun primitiivi

Mielivaltaisen luvun primitiivin avulla hyökkääjä voi lukea tietoja mistä tahansa muistiosoitteesta ohjelman osoiteavaruudessa. Tämä on erittäin tehokasta!

Sitä voidaan käyttää seuraaviin tarkoituksiin:

  • Luottamuksellisten tietojen, kuten salasanojen ja salausavainten, vuotamiseen.
  • Address Space Layout Randomizationin (ASLR) ohittamiseen paljastamalla kirjastojen tai pinon osoitteita.
  • Ohjelman tilan selvittämiseen seuraavien exploit-vaiheiden suunnittelua varten.

Suorittakaa tämä yksinkertainen C-koodi nähdäksenne käsitteellisen esimerkin puskurin ulkopuolelta lukemisesta:

#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;
}

Mielivaltaisen kirjoituksen primitiivi

Mielivaltaisen kirjoituksen primitiivin avulla hyökkääjä voi kirjoittaa hyökkääjän hallitsemaa sisältöä mihin tahansa muistiosoitteeseen ohjelman osoiteavaruudessa.

Sitä pidetään usein yhtenä vaarallisimmista primitiiveistä, koska se mahdollistaa ohjelman tilan suoran manipuloinnin. Sitä voidaan käyttää seuraaviin tarkoituksiin:

  • Kriittisten tietorakenteiden turmeleminen.
  • Funktio-osoittimien ylikirjoittaminen suorituksen ohjaamiseksi uudelleen.
  • Pinossa olevien paluuosoitteiden muuttaminen ohjausvuon kaappaamiseksi.

Tässä on käsitteellinen esimerkki siitä, miten puskurin ylivuoto voi ylikirjoittaa tietoja niiden tarkoitetun rajauksen ulkopuolelta:

#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;
}

Tietovuodon primitiivi

Tietovuodon primitiivi on mielivaltaisen luvun primitiivin erityinen käyttötapaus. Sen ensisijainen tarkoitus on paljastaa luottamuksellisia tietoja, jotka ohjelma tavallisesti pitää yksityisinä.

Tietovuotojen yleisiä kohteita ovat:

  • Pino-osoitteet: Paluuosoitteiden ylikirjoitusten siirtymien laskemiseen.
  • Keko-osoitteet: Tiettyjen tietorakenteiden tai olioiden paikantamiseen.
  • Kirjastojen perusosoitteet: Välttämättömiä ASLR:n ohittamiseen ja ROP-gadgettien löytämiseen.
  • Luottamukselliset tiedot: Esimerkiksi salausavaimet, käyttäjätunnukset tai sisäinen konfiguraatio.

Tämä primitiivi on ratkaisevan tärkeä nykyaikaisten exploit-suojauksien ohittamisessa.

Ohjausvuon kaappaus

Ohjausvuon kaappaus tarkoittaa ohjelman suorituspolun ohjaamista hyökkääjän valitsemaan osoitteeseen. Tämä toteutetaan yleensä mielivaltaisen kirjoituksen primitiivien avulla.

Ohjausvuon kaappauksen keskeisiä kohteita ovat:

  • Paluuosoitteet: Pinossa olevan osoitteen ylikirjoittaminen, johon funktio palaa.
  • Funktio-osoittimet: Sen osoittimen muuttaminen, joka määrittää kutsuttavan funktion.
  • Poikkeuskäsittelijät: Sen ohjaaminen uudelleen, mitä virheen tapahtuessa tapahtuu.

Kun ohjausvuo on kaapattu, hyökkääjä voi suorittaa omaa koodiaan tai ketjuttaa olemassa olevaa koodia.

Return-Oriented Programming (ROP)

Kun suora mielivaltaisen koodin suorittaminen estetään esimerkiksi Data Execution Prevention -suojauksella (DEP), hyökkääjät turvautuvat Return-Oriented Programmingiin (ROP). ROP mahdollistaa koodin suorittamisen ketjuttamalla pieniä, ohjelmassa tai sen ladatuissa kirjastoissa jo olevia koodinpätkiä.

Näitä pätkiä kutsutaan ROP-gadgeteiksi. Jokainen gadget päättyy yleensä ret-käskyyn, joka poistaa osoitteen pinosta ja hyppää siihen. Hallitsemalla pinoa hyökkääjä voi hallita suoritettavien gadgettien järjestystä.

ROP-gadgetin rakenne

ROP-gadget on yhden tai useamman konekäskyn muodostama sarja, joka päättyy ret-käskyyn. Niitä etsitään skannaamalla binääriä tiettyjen käskymallien löytämiseksi.

Yleinen gadget voi esimerkiksi olla pop rdi; ret. Tämä gadget poistaa arvon pinosta rdi-rekisteriin, jota käytetään usein x64-funktiokutsujen ensimmäiselle argumentille, ja palaa sitten.

Järjestämällä gadgetien osoitteet ja niiden argumentit pinoon hyökkääjä voi rakentaa mukautetun ”ohjelman” käyttämällä vain olemassa olevaa koodia.

Primitiivien ketjuttaminen exploitia varten

Todellisen maailman exploit sisältää usein useita yhdessä toimivia primitiivejä:

  1. Tietovuoto ASLR:n ohittamiseen ja kirjastojen perusosoitteiden löytämiseen.
  2. Mielivaltainen kirjoitus esimerkiksi puskurin ylivuodon avulla pinossa olevan paluuosoitteen ylikirjoittamiseen.
  3. Ylikirjoitettu paluuosoite osoittaa ROP-ketjun alkuun.
  4. ROP-ketju käyttää gadgetteja funktioiden, kuten system()-funktion, kutsumiseen hyökkääjän hallitsemilla argumenteilla, kuten "/bin/sh", ja mielivaltaisen koodin suorittamiseen.

Tämä modulaarinen lähestymistapa tekee exploiteista tehokkaita ja muunneltavia.

Pikatarkistus: exploit-primitiivit

Mitä exploit-primitiiviä käytetään suorimmin Address Space Layout Randomizationin (ASLR) ohittamiseen?

Kertaus: exploit-primitiivit

Tänään tutustuimme exploitien perustavanlaatuisiin rakennuspalikoihin eli exploit-primitiiveihin. Opimme seuraavat asiat:

  • Mielivaltainen luku: Minkä tahansa muistipaikan lukeminen.
  • Mielivaltainen kirjoitus: Mihin tahansa muistipaikkaan kirjoittaminen.
  • Tietovuoto: Luottamuksellisten tietojen lukemiseen tarkoitettu erikoistapaus, joka on ratkaisevan tärkeä ASLR:n ohittamisessa.
  • Ohjausvuon kaappaus: Ohjelman suorituksen ohjaaminen uudelleen.
  • Return-Oriented Programming (ROP): Olemassa olevien koodigadgettien ketjuttaminen suorituksen saavuttamiseksi, kun suora injektointi estetään.

Näiden primitiivien ymmärtäminen on olennaista sekä haavoittuvuuksien löytämisessä että niiden estämisessä.

Aloita maksutta

Opi Assembly tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Hyödyntämisprimitiivien yleiskatsaus” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppimispolun 3 oppituntia, myös oppitunnin “Hyödyntämisprimitiivien yleiskatsaus”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Hyödyntämisprimitiivien yleiskatsaus”?

Ymmärrä hyödyntämisprimitiivien perusteet ja se, miten niitä käytetään haavoittuvan ohjelman suorituksen hallintaan. Harjoittelet Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Hyödyntämisprimitiivien yleiskatsaus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppitunnilla?

Kyllä. Jokainen Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Binäärihaavoittuvuuksien tunnistaminen
  2. Johdatus fuzzaukseen
  3. Hyödyntämisprimitiivien yleiskatsaus
  4. Modernit hyväksikäytön torjuntakeinot ja niiden ohitukset
← Takaisin: Ohjelmistojen käänteinen suunnittelu ja binäärien analysoinnin perusteet