hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md

7.3 KiB

Stok Oorvloei

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 daaraan 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 EIP en EBP aanwysers om terug te keer na die vorige funksie in 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 daarom in staat is om ander dele van die stok te oorskryf.
Sommige algemene funksies wat kwesbaar is hiervoor is: strcpy, strcat, sprintf, gets, fgets...

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 Staprofloeie

Die mees algemene manier om staprofloeie 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 toegang kry.

Verder, sodra jy gevind het dat daar 'n Staprofloeie kwesbaarheid is, sal jy die offset moet vind totdat dit moontlik is om die EIP-aanwyservinger 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 as 'n aaneenlopende subreeks verskyn.

Op hierdie manier, in plaas daarvan om met die hand te moet uitsorteer watter offset die EIP oorskryf, 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 Staprofloop

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

In ander scenario's mag dit dalk net genoeg wees om waardes van sekere veranderlikes in die stapel te oorskryf vir die uitbuiting (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 offset te vind om die EIP 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:

{% content-ref url="ret2win.md" %} ret2win.md {% endcontent-ref %}

Stapel-skakelkode

In hierdie scenario kan die aanvaller 'n skakelkode in die stapel plaas en die beheerde EIP misbruik om na die skakelkode te gaan en die aanvaller se kode uit te voer:

{% content-ref url="stack-shellcode.md" %} stack-shellcode.md {% endcontent-ref %}

ROP

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

{% content-ref url="rop-return-oriented-programing.md" %} rop-return-oriented-programing.md {% endcontent-ref %}

Tipes van beskerming

Daar is verskeie beskermingspogings om die uitbuiting van kwesbaarhede te voorkom, kyk daarna in:

{% content-ref url="../common-binary-protections-and-bypasses/" %} common-binary-protections-and-bypasses {% endcontent-ref %}

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

Ander maniere om HackTricks te ondersteun: