House of Force
Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Dowiedz się i ćwicz Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Podstawowe Informacje
Kod
Ta technika została załatana (tutaj) i powoduje ten błąd:
malloc(): corrupted top size
Możesz wypróbować kod stąd, jeśli chcesz go przetestować.
Cel
Celem tego ataku jest możliwość alokacji fragmentu pamięci w określonym adresie.
Wymagania
Przepełnienie, które pozwala nadpisać rozmiar nagłówka top chunk (np. -1).
Możliwość kontrolowania rozmiaru alokacji sterty
Atak
Jeśli atakujący chce zaalokować fragment pamięci pod adresem P, aby nadpisać wartość tutaj. Zaczyna od nadpisania rozmiaru top chunk -1
(może to być z przepełnieniem). Zapewnia to, że malloc nie będzie używał mmap do żadnej alokacji, ponieważ Top chunk zawsze będzie miał wystarczająco dużo miejsca.
Następnie oblicz odległość między adresem top chunk a docelową przestrzenią do alokacji. Jest to konieczne, ponieważ malloc o takim rozmiarze zostanie wykonany, aby przenieść top chunk na tę pozycję. Tak można łatwo obliczyć różnicę/rozmiar:
Dlatego przydzielenie rozmiaru target - old_top - 4*sizeof(long)
(4 longi, ponieważ metadane top chunk i nowego chunka są przydzielane) spowoduje przeniesienie top chunka pod adres, który chcemy nadpisać. Następnie wykonujemy kolejne malloc, aby uzyskać chunka pod docelowym adresem.
Referencje i Inne Przykłady
Celem tego scenariusza jest ret2win, gdzie musimy zmodyfikować adres funkcji, która zostanie wywołana przez funkcję ret2win.
Binarny plik ma przepełnienie, które można wykorzystać do zmodyfikowania rozmiaru top chunka, który jest zmieniony na -1 lub p64(0xffffffffffffffff).
Następnie obliczany jest adres miejsca, gdzie istnieje wskaźnik do nadpisania, a różnica między bieżącą pozycją top chunka a tam jest alokowana za pomocą
malloc
.W końcu alokowany jest nowy chunk, który będzie zawierał ten pożądany cel, wewnątrz którego zostanie nadpisany funkcją ret2win.
W
Wprowadź swoje imię:
istnieje początkowa podatność, która pozwala na wyciek adresu z heapa.Następnie w funkcjonalności
Org:
iHost:
można wypełnić 64B wskaźnikas
, gdy zostanie zapytane o nazwę org, która na stosie jest następnie śledzona przez adres v2, a następnie przez wskazaną nazwę hosta. Ponieważ strcpy będzie kopiować zawartość s do chunka o rozmiarze 64B, możliwe jest nadpisanie rozmiaru top chunka danymi wprowadzonymi w nazwie hosta.Teraz, gdy możliwe jest dowolne pisanie, GOT
atoi
został nadpisany adresem printf. Następnie możliwe było wyciekanie adresuIO_2_1_stderr
z%24$p
. Dzięki temu wyciekowi libc możliwe było ponowne nadpisanie GOTatoi
adresemsystem
i wywołanie go, przekazując jako parametr/bin/sh
.Alternatywna metoda zapropnowana w tym innym rozwiązaniu, polega na nadpisaniu
free
zputs
, a następnie dodaniu adresuatoi@got
do wskaźnika, który zostanie później zwolniony, aby został wycieknięty, a z tym wyciekiem ponowne nadpisanieatoi@got
zsystem
i wywołanie go z/bin/sh
.Istnieje UAF, który pozwala na ponowne użycie zwolnionego chunka bez wyczyszczenia wskaźnika. Ponieważ istnieją pewne metody odczytu, możliwe jest wyciekanie adresu libc, zapisując wskaźnik do funkcji free w GOT i następnie wywołując funkcję odczytu.
Następnie, użyto House of force (wykorzystując UAF) do nadpisania rozmiaru pozostałej przestrzeni na -1, zaalokowania wystarczająco dużego chunka, aby dotrzeć do free hook, a następnie zaalokowania innego chunka, który będzie zawierał free hook. Następnie, w hooku zapisano adres
system
, w chunku"/bin/sh"
i ostatecznie zwolniono chunk z tym zawartością ciągu znaków.
Last updated