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, the unsorted_bin attack ve relative overwrites yoluyla leaks olmadan RCE sağlayan çok ilginç bir teknikti. Ancak bu düzeltilmiş.
2026’da Uygulanabilirlik
- glibc window: Güvenilir şekilde 2.23–2.28 sürümlerinde çalışır. 2.29’da ek
unsorted_chunksbütünlük kontrolleri unsorted‑bin yazması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ılmıştır ve orijinal hedef kullanılamaz hale gelir. Sadece eski libc’lerde (veya hook’ları tutan özel derlemelerde) ya da eski libc ile gelen CTF görevlerinde kullanın. - Tcache era (≥2.26): Tcache 0x70 boyutundaki allocation’larınızı tüketir ve fastbin/unsorted primitives’i durdurur. 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: Bu, ≥2.32’de tcache/fastbin’e uygulanır, ancak House of Roman yalnızca
fd/bkiçinde zaten bulunan bir libc adresinin kısmi pointer overwrite’ına ihtiyaç duyar, bu yüzden safe-linking burada savunmacıya yardımcı olmaz (saldırgan asla yeni bir pointer üretmez). Gerçek engel hook’ların 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
Hedef
- Relative pointer’ları kötüye kullanarak RCE
Gereksinimler
- fastbin ve unsorted bin pointer’larını düzenleyebilme
- Çalışması için 12 bitlik rastgelelik brute force ile kırılmalıdır (başarı şansı %0.02)
Saldırı Adımları
Bölüm 1: Fastbin Chunk __malloc_hook’a işaret eder
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): Doğru hizalama içinmain_arena_use(0x80, offset 0x100)relative_offset_heap(0x60, offset 0x190): ‘main_arena_use’ chunk’ındaki relative offset
Sonra free(main_arena_use) — bu chunk’ı unsorted listesine koyar ve hem fd hem bk pointer’larında main_arena + 0x68 adresine sahip olur.
Şimdi yeni bir chunk fake_libc_chunk(0x60) allocate edilir çünkü fd ve bk içinde main_arena + 0x68 pointer’larını içerecektir.
Ardından 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’in birfd’sirelative_offset_heap’e işaret ediyorrelative_offset_heap,fake_libc_chunk’den olan bir offset’tir;fake_libc_chunkisemain_arena + 0x68’e işaret eden bir pointer içerirfastbin_victim.fd’nin son baytını değiştirmekfastbin_victim’inmain_arena + 0x68’i göstermesini 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 pek ilginç değil, bu yüzden pointer’ı __malloc_hook’a işaret edecek şekilde değiştirelim.
Dikkat: __memalign_hook genellikle 0x7f ile başlar ve öncesinde sıfırlar bulunur, bu yüzden onu 0x70 fast bin içinde bir değer olarak taklit etmek mümkündür. Adresin son 4 biti random olduğu için 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 uygulanır ve 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). Eğer brute force başarısız olursa program çöker (başarılı olana kadar yeniden başlatın).
Ardından, ilk iki fast bin chunk’ını temizlemek için 2 malloc yapılır ve üçüncü bir malloc ile __malloc_hook’ta 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 bakabilirsiniz:
Ama temelde main_arena + 0x68 değerini chunk->bk ile belirtilen herhangi bir konuma yazmanıza olanak tanır. Saldırı için __malloc_hook’u seçiyoruz. Onu ezdikten sonra one_gadget’e işaret ettirmek için bir relative overwrite kullanacağız.
Bunun için önce bir chunk alıp 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)
Adım 3: Set __malloc_hook to system
İlk adımda __malloc_hook içeren bir chunk’ı kontrol ediyorduk (değişken malloc_hook_chunk) ve ikinci adımda oraya main_arena + 0x68 yazmayı başardık.
Şimdi, malloc_hook_chunk üzerindeki kısmi bir overwrite’u suistimal ederek oraya yazdığımız libc adresini (main_arena + 0x68) one_gadget adresine işaret ettirmek için kullanıyoruz.
Burada 12 bit rastgeleliği bruteforce etmemiz gerekiyor (daha fazla bilgi için how2heap example).
Sonuçta, doğru adres overwrite edildiğinde, malloc çağırıp one_gadget’ı tetikleyin.
Modern ipuçları & varyantlar
- Unsorted-bin check in 2.29+: Eğer 2.29–2.33 üzerinde çalışmanız gerekiyorsa, yazmayı tetiklemeden önce bütünlük kontrolünü (integrity check) karşılamak için hem
fdhem debk’yi bozun; aksi halde_int_mallocabort eder. Başarı oranı çok düşüktür ve genellikle sadece brute-force CTF ortamlarında uygulanabilir. - Hook removal (2.34+):
__malloc_hookkaybolduğunda, primitive’i daha sonra yeniden kullanabileceğiniz herhangi bir writable GOT/global üzerine gelecek şekilde uyarlayın (ör. non-PIE ikililerdeexit@GOT’u overwrite etmek) veya bir hook yerinetop’u kontrol etmek için House of Pie tarzı top‑chunk hijack’ine pivot yapın. - Any‑address fastbin alloc (2024 gist): Yakın tarihli bir writeup, önce fastbin içine bir libc pointer’ı yerleştirip sonra fixup’tan önce yeniden yönlendirerek aynı grooming’i kullanıp
__free_hookveya diğer global’lerin üzerine fastbin allocate yapmayı gösteriyor. Bu 2.24–2.28’de çalışır fakat 2.29’un integrity check’lerinde yine başarısız olur.
Referanslar
- 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
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.


