50 lines
3.2 KiB
Markdown

# House of Einherjar
{{#include ../../banners/hacktricks-training.md}}
## Osnovne informacije
### Kod
- Proverite primer sa [https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c)
- Ili onaj sa [https://guyinatuxedo.github.io/42-house_of_einherjar/house_einherjar_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house_of_einherjar/house_einherjar_exp/index.html#house-of-einherjar-explanation) (možda ćete morati da popunite tcache)
### Cilj
- Cilj je alocirati memoriju na gotovo bilo kojoj specifičnoj adresi.
### Zahtevi
- Kreirati lažni chunk kada želimo da alociramo chunk:
- Postaviti pokazivače da upućuju na sebe kako bi se zaobišli provere
- Overflow od jednog bajta sa null bajtom iz jednog chunca u sledeći kako bi se modifikovao `PREV_INUSE` flag.
- Naznačiti u `prev_size` lažnog chunca razliku između njega i lažnog chunca
- Veličina lažnog chunca takođe mora biti postavljena na istu veličinu kako bi se zaobišle provere
- Za konstrukciju ovih chunkova, biće vam potreban heap leak.
### Napad
- `A` lažni chunk se kreira unutar chunca koji kontroliše napadač, upućujući sa `fd` i `bk` na originalni chunk kako bi se zaobišle zaštite
- 2 druga chunca (`B` i `C`) se alociraju
- Zloupotrebljavajući off by one u `B`, `prev in use` bit se čisti i `prev_size` podaci se prepisuju sa razlikom između mesta gde je alociran `C` chunk, do lažnog `A` chunca generisanog pre
- Ovaj `prev_size` i veličina u lažnom chunku `A` moraju biti iste kako bi se zaobišle provere.
- Zatim, tcache se puni
- Zatim, `C` se oslobađa kako bi se konsolidovao sa lažnim chunkom `A`
- Zatim, novi chunk `D` se kreira koji će početi u lažnom `A` chunku i pokriti `B` chunk
- Kuća Einherjar se ovde završava
- Ovo se može nastaviti brzim bin napadom ili Tcache trovanjem:
- Oslobodite `B` da ga dodate u brzi bin / Tcache
- `B`'s `fd` se prepisuje tako da pokazuje na ciljnu adresu zloupotrebljavajući `D` chunk (pošto sadrži `B` unutar)
- Zatim, vrše se 2 malloc-a i drugi će biti **alociranje ciljne adrese**
## Reference i drugi primeri
- [https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c)
- **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_einherjar/#2016-seccon-tinypad)
- Nakon oslobađanja pokazivača, oni nisu nullifikovani, tako da je još uvek moguće pristupiti njihovim podacima. Stoga se chunk postavlja u nesortirani bin i curi pokazivače koje sadrži (libc leak) i zatim se nova heap postavlja na nesortirani bin i curi adresu heap-a iz pokazivača koji dobija.
- [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
- Null-byte overflow greška u `strtok`.
- Koristite House of Einherjar da dobijete situaciju preklapanja chunkova i završite sa Tcache trovanjem kako biste dobili proizvoljnu write primitivu.
{{#include ../../banners/hacktricks-training.md}}