House of Roman
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Temel Bilgiler
Bu, fake fastbins, unsorted_bin attack ve relative overwrites yoluyla leak olmadan RCE sağlayan çok ilginç bir teknikti. Ancak patched.
2026’de Uygulanabilirlik
- glibc window: 2.23–2.27 arasında güvenilir şekilde çalışır (how2heap PoC 2.23–2.25’i test etti). 2.28’den itibaren, “additional checks for unsorted bin integrity” yaması unsorted‑bin yazısını güvenilmez hale getirir, bu yüzden başarı oranı keskin şekilde düşer. 2.34 ve sonrasında
__malloc_hook/__free_hookkaldırıldı, bu da orijinal hedefi kullanılamaz hale getirir. Sadece eski libc’lerde (veya hook’ları tutan özel derlemelerde) veya eski bir libc ile gelen CTF challenge’ları için kullanın. - Tcache era (≥2.26): Tcache 0x70 tahsislerinizi tüketecek ve fastbin/unsorted primitive’lerini durduracaktır. Bunu herhangi bir tahsisten önce devre dışı bırakın (
setenv("GLIBC_TUNABLES","glibc.malloc.tcache_count=0",1);) veya her 0x70 tcache bin’ini boşaltmak için 7 free ile doldurun. - Safe-linking: ≥2.32’de tcache/fastbin’e uygulanır, ancak House of Roman yalnızca fd/bk içinde zaten bulunan bir libc adresinin partial pointer overwrite of a libc address already present in fd/bk’sine ihtiyaç duyar, bu yüzden safe-linking savunmacıya burada yardımcı olmaz (saldırgan asla yeni bir pointer sahtelemiyor). Gerçek engel hook kaldırılması ve unsorted-bin kontrolleridir.
Kod
- Bir örneğini şu adreste bulabilirsiniz: https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
Amaç
- relative pointers’ı kötüye kullanarak RCE
Gereksinimler
- fastbin ve unsorted bin pointer’larını düzenleyebilme
- 12 bitlik rastgelelik kaba kuvvetle çözülmeli (çalışma ihtimali %0.02)
Saldırı Adımları
Bölüm 1: Fastbin Chunk points to __malloc_hook
Birkaç chunk oluşturun:
fastbin_victim(0x60, offset 0): Daha sonra heap pointer’ını LibC değerine işaret edecek şekilde düzenlemek için UAF chunk.chunk2(0x80, offset 0x70): İyi hizalama içinmain_arena_use(0x80, offset 0x100)relative_offset_heap(0x60, offset 0x190): ‘main_arena_use’ chunk üzerinde relative offset
Sonra free(main_arena_use) — bu işlem bu chunk’ı unsorted listesine yerleştirir ve fd ile bk pointer’larının her ikisine de main_arena + 0x68 adresini koyar.
Şimdi fake_libc_chunk(0x60) adlı yeni bir chunk tahsis edilir çünkü bu chunk fd ve bk içinde main_arena + 0x68 pointer’larını içerecektir.
Sonra relative_offset_heap ve fastbin_victim free edilir.
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
fastbin_victim’infd’sirelative_offset_heap’i işaret ederrelative_offset_heap,fake_libc_chunk’ten olan bir offset’tir; bu chunk içindemain_arena + 0x68’e işaret eden bir pointer bulunurfastbin_victim.fd’nin son baytını değiştirmekfastbin_victim’inmain_arena + 0x68’e işaret etmesini sağlar.
Önceki işlemler için, saldırganın fastbin_victim’in fd pointer’ını değiştirebiliyor olması gerekir.
Sonra, main_arena + 0x68 çok ilginç olmadığı için, pointer’ı __malloc_hook’a işaret edecek şekilde değiştiriyoruz.
Not: __memalign_hook genellikle 0x7f ile başlar ve öncesinde sıfırlar bulunur; bu yüzden onu 0x70 fast bin içindeki bir değer olarak sahtelemek mümkündür. Adresin son 4 biti random olduğundan, değerin ilgilendiğimiz yere işaret etmesi için 2^4=16 olasılık vardır. Bu yüzden burada bir BF attack gerçekleştirilir; chunk şöyle biter: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).
(For more info about the rest of the bytes check the explanation in the how2heap example). Brute force başarısız olursa program çöküyor (çalışana kadar yeniden başlatın).
Sonra, ilk 2 fast bin chunk’ını temizlemek için 2 tane malloc yapılır ve üçüncü bir malloc ile __malloc_hook içinde bir chunk elde edilir.
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
Bölüm 2: Unsorted_bin attack
Daha fazla bilgi için şuna bakabilirsiniz:
Ama temelde bu, chunk->bk tarafından belirtilen herhangi bir konuma main_arena + 0x68 yazılmasına izin verir. Saldırı için __malloc_hook’u seçiyoruz. Onu overwrite ettikten sonra, bir one_gadget’e işaret edecek şekilde relative overwrite kullanacağız.
Bunun için önce bir chunk alıp bunu unsorted bin’e koyuyoruz:
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
Use an UAF in this chunk to point unsorted_bin_ptr->bk to the address of __malloc_hook (we brute forced this previously).
Caution
Note that this attack corrupts the unsorted bin (hence small and large too). So we can only use allocations from the fast bin now (a more complex program might do other allocations and crash), and to trigger this we must alloc the same size or the program will crash.
So, to trigger the write of main_arena + 0x68 in __malloc_hook we perform after setting __malloc_hook in unsorted_bin_ptr->bk we just need to do: malloc(0x80)
Step 3: Set __malloc_hook to system
Adım 1’de __malloc_hook içeren bir chunk’ı kontrol ediyorduk (değişken malloc_hook_chunk) ve ikinci adımda oraya main_arena + 0x68 yazdırmayı başardık.
Şimdi, malloc_hook_chunk üzerindeki bir partial overwrite’ı kötüye kullanarak oraya yazdığımız libc adresini (main_arena + 0x68) bir one_gadget adresine işaret ettirmek için kullanıyoruz.
Burada 12 bit rastgeleliği bruteforce etmemiz gerekiyor (daha fazla bilgi için how2heap örneğine bakın).
Son olarak, doğru adres overwrite edildikten sonra malloc çağırın ve one_gadget’i tetikleyin.
Modern tips & variants
- Unsorted-bin hardening (2.28+): Unsorted chunk’lar üzerindeki ekstra bütünlük kontrolleri (boyut denetimi + liste bağlantısı) klasik unsorted‑bin write’ını kırılgan hâle getirir.
_int_malloc’ı atlatabilmek içinfd/bkbağlantılarını tutarlı ve boyutları makul tutmanız gerekir; bu genellikle basit bir partial overwrite’dan daha güçlü primitive’ler gerektirir. - Hook removal (2.34+):
__malloc_hookkaldırıldığında, primitive’i daha sonra tekrar kullanabileceğiniz herhangi bir yazılabilir GOT/global üzerine konumlanacak şekilde uyarlayın (ör. non-PIE ikili dosyalardaexit@GOT’u overwrite etmek) veya bir House of Pie tarzı top‑chunk kaçırmasına pivot yaparak hook yerinetop’u kontrol edin. - Any‑address fastbin alloc (romanking98 writeup): İkinci kısım 0x71 freelist’ini onarmayı ve unsorted‑bin write’ını kullanarak bir fastbin allocation’ını
__free_hooküzerine getirmeyi, ardındansystem("/bin/sh")koyup bunu libc‑2.24 (hook kaldırılmadan önce) üzerindefree()ile tetiklemeyi gösterir.
References
- https://github.com/shellphish/how2heap
- https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
- https://halloween.synacktiv.com/publications/heap-tricks-never-get-old-insomnihack-teaser-2022.html
- https://gist.github.com/romanking98/9aab2804832c0fb46615f025e8ffb0bc
- https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=NEWS;hb=glibc-2.34
- https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


