Ret2lib + Printf leak - arm64
Ret2lib - обходження NX з ROP (без ASLR)
Скомпілювати без канарки:
Знайти зсув
Зсув x30
Створюючи шаблон з pattern create 200
, використовуючи його та перевіряючи зсув за допомогою pattern search $x30
, ми можемо побачити, що зсув становить 108
(0x6c).
Дивлячись на дизасембльовану основну функцію, ми можемо побачити, що ми хочемо перейти до інструкції, щоб перейти до printf
безпосередньо, зсув якої від місця, де завантажується бінарник, становить 0x860
:
Знайти системну функцію та рядок /bin/sh
/bin/sh
Оскільки ASLR вимкнено, адреси завжди будуть однаковими:
Знайти гаджети
Нам потрібно мати в x0
адресу до рядка /bin/sh
та викликати system
.
Використовуючи rooper, був знайдений цікавий гаджет:
Цей гаджет завантажить x0
з $sp + 0x18
і потім завантажить адреси x29 та x30 з sp і стрибне до x30. Отже, з цим гаджетом ми можемо контролювати перший аргумент і потім стрибнути до system.
Exploit
Ret2lib - обхід NX, ASL та PIE з витоками printf зі стеку
Скомпілювати без канарки:
PIE та ASLR, але без канарки
Раунд 1:
Витік PIE зі стеку
Зловживання bof, щоб повернутися до main
Раунд 2:
Витік libc зі стеку
ROP: ret2system
Витоки Printf
Встановлюючи точку зупинки перед викликом printf, можна побачити, що в стеку є адреси для повернення до бінарного файлу, а також адреси libc:
Спробувавши різні зсуви, %21$p
може витікати адресу бінарного файлу (обхід PIE), а %25$p
може витікати адресу libc:
Віднімаючи витікну адресу libc від базової адреси libc, можна побачити, що зсув витікненої адреси від бази становить 0x49c40
.
Зсув x30
Дивіться попередній приклад, оскільки bof той же.
Знайти гаджети
Як у попередньому прикладі, нам потрібно мати в x0
адресу рядка /bin/sh
і викликати system
.
Використовуючи rooper, було знайдено ще один цікавий гаджет:
Цей гаджет завантажить x0
з $sp + 0x78
і потім завантажить адреси x29 та x30 з sp і стрибне до x30. Отже, з цим гаджетом ми можемо контролювати перший аргумент і потім стрибнути до system.
Exploit
Last updated