Stack Overflow

Leer & oefen AWS Hacking:HackTricks Opleiding AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Opleiding GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Wat is 'n Stapel Oorloop

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

Die hoofprobleem van hierdie oorskrywing is dat die gestoor instruksie-aanwyser (EIP/RIP) en die gestoor basisaanwyser (EBP/RBP) om na die vorige funksie terug te keer, op die stapel 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 stapel kopieer as die hoeveelheid wat daarvoor toegeken is, en kan dus ander dele van die stapel 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 toegeken.

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 Stap Oorloop verskuiwings

Die mees algemene manier om stap oorloop te vind, is om 'n baie groot invoer van As 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.

Boonop, sodra jy gevind het dat daar 'n Stap Oorloop kwesbaarheid is, sal jy die verskuiwing moet vind totdat dit moontlik is om die terugadres te oorskry, hiervoor word gewoonlik 'n De Bruijn-sekwensie gebruik. Wat vir 'n gegewe alfabet van grootte k en subreekse van lengte n 'n sikliese sekwensie is waarin elke moontlike subreeks van lengte _n_** presies een keer** as 'n aaneengeskakelde subreeks verskyn.

Op hierdie manier, in plaas daarvan om handmatig uit te vind watter verskuiwing nodig is om die EIP te beheer, is dit moontlik om een van hierdie sekwensies as opvulling te gebruik en dan die verskuiwing van die bytes wat dit oorgeskryf het, te vind.

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

Exploiting Stack Overflows

Tydens 'n oorgang (as die oorgang grootte groot genoeg is) sal jy in staat wees om oor te skryf waardes van plaaslike veranderlikes binne die stapel totdat jy die EBP/RBP en EIP/RIP (of selfs meer) bereik. Die mees algemene manier om hierdie tipe kwesbaarheid te misbruik, is deur die terug adres te verander sodat wanneer die funksie eindig, die beheer vloei na waar die gebruiker gespesifiseer het in hierdie pointer.

egter, in ander scenario's mag dit net om te skryf van sommige veranderlikes waardes in die stapel genoeg wees vir die uitbuiting (soos in maklike CTF uitdagings).

Ret2win

In hierdie tipe CTF uitdagings, is daar 'n funksie binne die binêre wat nooit aangeroep word en wat jy moet aanroep om te wen. Vir hierdie uitdagings moet jy net die offset vind om die terug adres te oorskryf en die adres van die funksie vind om aan te roep (gewoonlik ASLR sal gedeaktiveer wees) sodat wanneer die kwesbare funksie terugkeer, die verborge funksie aangeroep sal word:

Ret2win

Stack Shellcode

In hierdie scenario kan die aanvaller 'n shellcode in die stapel plaas en die beheerde EIP/RIP misbruik om na die shellcode te spring en arbitrêre kode uit te voer:

Stack Shellcode

ROP & Ret2... tegnieke

Hierdie tegniek is die fundamentele raamwerk om die hoof beskerming van die vorige tegniek te omseil: Geen uitvoerbare stapel (NX). En dit stel in staat om verskeie ander tegnieke (ret2lib, ret2syscall...) uit te voer wat arbitrêre opdragte sal uitvoer deur bestaande instruksies in die binêre te misbruik:

ROP - Return Oriented Programing

Heap Overflows

'n Oorgang gaan nie altyd in die stapel wees nie, dit kan ook in die heap wees byvoorbeeld:

Heap Overflow

Types of protections

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

Common Binary Exploitation Protections & Bypasses

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated