Stack Overflow

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Wat is 'n Stok Oorvloei

'n Stok oorvloei is 'n kwesbaarheid wat voorkom wanneer 'n program meer data na die stok skryf as wat dit toegewys is om te hou. Hierdie oortollige data sal aangrensende geheue-ruimte oorskryf, wat lei tot die korrupsie van geldige data, beheerstroom-onderbreking, en moontlik die uitvoering van skadelike kode. Hierdie probleem ontstaan dikwels as gevolg van die gebruik van onveilige funksies wat nie grensekontrole op insette uitvoer nie.

Die hoofprobleem van hierdie oorskrywing is dat die gestoorde instruksie-aanwyser (EIP/RIP) en die gestoorde basisaanwyser (EBP/RBP) om terug te keer na die vorige funksie op die stok gestoor word. Daarom sal 'n aanvaller in staat wees om dit te oorskryf en die uitvoeringsvloei van die program te beheer.

Die kwesbaarheid ontstaan gewoonlik omdat 'n funksie meer bytes binne die stok kopieer as die bedrag wat daarvoor toegewys is, en kan dus ander dele van die stok oorskryf.

Sommige algemene funksies wat kwesbaar is hiervoor is: strcpy, strcat, sprintf, gets... Ook, funksies soos fgets, read & memcpy wat 'n lengte-argument neem, kan op 'n kwesbare manier gebruik word as die gespesifiseerde lengte groter is as die toegewysde een.

Byvoorbeeld, die volgende funksies kan kwesbaar wees:

void vulnerable() {
char buffer[128];
printf("Enter some text: ");
gets(buffer); // This is where the vulnerability lies
printf("You entered: %s\n", buffer);
}

Vind van Stack Overflow-offsets

Die mees algemene manier om stap-oorvloeie te vind, is om 'n baie groot inset van A's te gee (bv. python3 -c 'print("A"*1000)') en 'n Segmentation Fault te verwag wat aandui dat die adres 0x41414141 probeer is om toegang te verkry.

Verder, sodra jy gevind het dat daar 'n Stack Overflow-kwesbaarheid is, sal jy die offset moet vind totdat dit moontlik is om die terugkeeradres te oorskryf, hiervoor word gewoonlik 'n De Bruijn-reeks gebruik. Wat vir 'n gegewe alfabet van grootte k en subreeks van lengte n 'n sikliese reeks is waarin elke moontlike subreeks van lengte n presies een keer **verskyn as 'n aaneenlopende subreeks.

Op hierdie manier, in plaas daarvan om met die hand te moet uitfigure watter offset nodig is om die EIP te beheer, is dit moontlik om een van hierdie reekse as vulsel te gebruik en dan die offset van die byte te vind wat dit uiteindelik oorskryf het.

Dit is moontlik om pwntools hiervoor te gebruik:

from pwn import *

# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values)
pattern = cyclic(1000)

# This is an example value that you'd have found in the EIP/IP register upon crash
eip_value = p32(0x6161616c)
offset = cyclic_find(eip_value)  # Finds the offset of the sequence in the De Bruijn pattern
print(f"The offset is: {offset}")

of GEF:

#Patterns
pattern create 200 #Generate length 200 pattern
pattern search "avaaawaa" #Search for the offset of that substring
pattern search $rsp #Search the offset given the content of $rsp

Uitbuiting van Stok Oorvloei

Tydens 'n oorvloei (onder die aanname dat die oorvloei groot genoeg is) sal jy in staat wees om waardes van plaaslike veranderlikes binne die stok te oorskryf totdat die gestoorde EBP/RBP en EIP/RIP (of selfs meer) bereik word. Die mees algemene manier om hierdie tipe kwesbaarheid te misbruik, is deur die terugkeeradres te wysig sodat wanneer die funksie eindig, die beheerstroom omgelei sal word na waar die gebruiker dit gespesifiseer het in hierdie aanwysers.

In ander scenario's mag dit dalk net genoeg wees vir die uitbuiting om sommige veranderlikes se waardes in die stok te oorskryf (soos in maklike CTF-uitdagings).

Ret2win

In hierdie tipe CTF-uitdagings is daar 'n funksie binne die binêre lêer wat nooit geroep word nie en wat jy moet roep om te wen. Vir hierdie uitdagings hoef jy net die verskuiwing te vind om die terugkeeradres te oorskryf en die adres van die funksie te vind om te roep (gewoonlik sal ASLR gedeaktiveer wees) sodat wanneer die kwesbare funksie terugkeer, die verborge funksie geroep sal word:

pageRet2win

Stok Skelkode

In hierdie scenario kan die aanvaller 'n skelkode in die stok plaas en die beheerde EIP/RIP misbruik om na die skelkode te spring en willekeurige kode uit te voer:

pageStack Shellcode

ROP & Ret2... tegnieke

Hierdie tegniek is die fundamentele raamwerk om die hoofbeskerming teen die vorige tegniek te omseil: Geen uitvoerbare stok (NX). Dit maak dit moontlik om verskeie ander tegnieke uit te voer (ret2lib, ret2syscall...) wat sal eindig met die uitvoer van willekeurige bevele deur bestaande instruksies in die binêre lêer te misbruik:

pageROP - Return Oriented Programing

Stok Oorvloeie

'n Oorvloei is nie altyd in die stok nie, dit kan ook in die stapel wees byvoorbeeld:

pageHeap Overflow

Tipes van beskerming

Daar is verskeie beskermings wat probeer om die uitbuiting van kwesbaarhede te voorkom, kyk na hulle in:

pageCommon Binary Exploitation Protections & Bypasses
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated