hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/stack-canaries.md

5.3 KiB

Stack Canaries

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

StackGuard i StackShield

StackGuard ubacuje posebnu vrednost poznatu kao canary pre EIP (Extended Instruction Pointer), specifično 0x000aff0d (predstavlja null, novi red, EOF, povratak karijete) kako bi se zaštitili od preplavljivanja bafera. Međutim, funkcije poput recv(), memcpy(), read() i bcopy() ostaju ranjive, i ne štiti EBP (Base Pointer).

StackShield koristi sofisticiraniji pristup od StackGuard-a održavanjem Globalnog Stoga Povratka, koji čuva sve adrese povratka (EIP-ove). Ova postavka osigurava da bilo koje preplavljivanje ne uzrokuje štetu, jer omogućava poređenje između sačuvanih i stvarnih adresa povratka radi otkrivanja preplavljivanja. Dodatno, StackShield može proveriti adresu povratka naspram granice vrednosti kako bi otkrio da li EIP pokazuje van očekivanog prostora podataka. Međutim, ova zaštita može biti zaobiđena tehnikama poput Return-to-libc, ROP (Return-Oriented Programming) ili ret2ret, što ukazuje da StackShield takođe ne štiti lokalne promenljive.

Stack Smash Protector (ProPolice) -fstack-protector:

Ovaj mehanizam postavlja canary pre EBP, i reorganizuje lokalne promenljive kako bi postavio baufere na višim memorijskim adresama, sprečavajući ih da prepišu druge promenljive. Takođe sigurno kopira argumente prosleđene na stek iznad lokalnih promenljivih i koristi ove kopije kao argumente. Međutim, ne štiti nizove sa manje od 8 elemenata ili baufere unutar strukture korisnika.

Canary je slučajan broj dobijen iz /dev/urandom ili podrazumevana vrednost 0xff0a0000. Čuva se u TLS (Thread Local Storage), omogućavajući deljenje memorijskih prostora između niti da imaju niti-specifične globalne ili statičke promenljive. Ove promenljive se prvobitno kopiraju iz roditeljskog procesa, a deca procesa mogu menjati svoje podatke bez uticaja na roditelja ili braću/sestre. Ipak, ako se koristi fork() bez kreiranja novog canary-ja, svi procesi (roditelj i deca) dele isti canary, čineći ga ranjivim. Na arhitekturi i386, canary se čuva na gs:0x14, a na x86_64, na fs:0x28.

Ova lokalna zaštita identifikuje funkcije sa baferima ranjivim na napade i ubacuje kod na početak ovih funkcija kako bi postavio canary, i na kraju kako bi proverio njegovu celovitost.

Kada veb server koristi fork(), omogućava napad brute-force metodom da pogodi canary bajt po bajt. Međutim, korišćenje execve() nakon fork() prebrisava memorijski prostor, poništavajući napad. vfork() omogućava detetu procesa da izvršava bez duplikacije dok ne pokuša da piše, u tom trenutku se kreira duplikat, nudeći drugačiji pristup kreiranju procesa i upravljanju memorijom.

Bypass-ovi

  • Procurenje canary-ja a zatim prepisivanje njega (npr. preplavljivanje bafera) sa sopstvenom vrednošću.
  • Ako je canary forkovan u dečijim procesima, moguće je pokušati ga brute-force metodom po bajtovima.
  • Ako postoji neka zanimljiva ranjivost procurivanja u binarnom fajlu, moguće je procuriti ga.
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u: