Ret2esp / Ret2reg
Last updated
Last updated
Вивчайте та практикуйте хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks Вивчайте та практикуйте хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks
Оскільки ESP (вказівник стеку) завжди вказує на верх стеку, ця техніка полягає в заміні EIP (вказівника інструкції) адресою інструкції jmp esp
або call esp
. Зробивши це, shellcode розміщується безпосередньо після переписаного EIP. Коли виконується інструкція ret
, ESP вказує на наступну адресу, точно там, де зберігається shellcode.
Якщо в Windows або Linux не ввімкнено випадкове розташування адрес (ASLR), можна використовувати інструкції jmp esp
або call esp
, знайдені в спільних бібліотеках. Однак з ASLR активованим, можливо доведеться шукати ці інструкції всередині вразливої програми саме (і можливо, вам доведеться перемогти PIE).
Більше того, можливість розмістити shellcode після корупції EIP, а не посередині стеку, забезпечує, що будь-які виконані інструкції push
або pop
під час роботи функції не втручаються у shellcode. Це втручання може статися, якщо shellcode було розміщено посередині стеку функції.
Якщо вам не вистачає місця для запису після переписування RIP (можливо, лише кілька байтів), напишіть початковий jmp
shellcode, наприклад:
І запишіть shellcode рано в стек.
Ви можете знайти приклад цієї техніки за посиланням https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp з кінцевим експлойтом наступного вигляду:
Можна побачити ще один приклад цієї техніки за посиланням https://guyinatuxedo.github.io/17-stack_pivot/xctf16_b0verflow/index.html. Тут відбувається переповнення буфера без увімкненого NX, використовується гаджет для зменшення адреси $esp
і потім jmp esp;
для переходу до shellcode:
Так само, якщо ми знаємо, що функція повертає адресу, де зберігається код оболонки, ми можемо скористатися інструкціями call eax
або jmp eax
(відомими як техніка ret2eax), що пропонує ще один метод виконання нашого коду оболонки. Так само, як eax, можна використовувати будь-який інший регістр, що містить цікаву адресу (ret2reg).
Ви можете знайти деякі приклади тут:
strcpy
буде зберігати в eax
адресу буфера, де зберігався код оболонки, і eax
не перезаписується, тому можливе використання ret2eax
.
У ARM64 немає інструкцій, що дозволяють перейти до реєстру SP. Можливо, знайти гаджет, який переміщує sp до реєстру, а потім переходить до цього реєстру, але в бібліотеці libc мого kali я не зміг знайти жодного гаджета подібного до цього:
Єдині, які я виявив, змінили б значення реєстру, куди було скопійовано sp перед стрибком до нього (тому воно стало б некорисним):
Якщо реєстр має цікаву адресу, можна стрибнути до неї, просто знаходячи відповідну інструкцію. Ви можете використовувати щось на зразок:
У ARM64 це x0
, хто зберігає значення повернення функції, тому можливо, що x0 зберігає адресу буфера, котрий контролюється користувачем з шелл-кодом для виконання.
Приклад коду:
Перевіривши розібрання функції, можна побачити, що адреса буфера (вразлива на переповнення буфера та керована користувачем) зберігається в x0
перед поверненням з переповнення буфера:
Також можна знайти гаджет br x0
у функції do_stuff
:
Ми використаємо цей гаджет для переходу до нього, оскільки бінарний файл компілюється БЕЗ PIE. Використовуючи шаблон, можна побачити, що зсув переповнення буфера становить 80, тому експлойт буде:
Якщо замість fgets
було використано щось на зразок read
, було б можливо обійти PIE також, просто перезаписавши останні 2 байти адреси повернення, щоб повернутися до інструкції br x0;
без необхідності знати повну адресу.
З fgets
це не працює, оскільки воно додає нульовий (0x00) байт в кінці.
NX: Якщо стек не є виконавчим, це не допоможе, оскільки нам потрібно розмістити шеллкод на стеці та зробити стрибок для його виконання.
Вивчайте та практикуйте взлом AWS:Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте взлом GCP: Навчання HackTricks GCP Red Team Expert (GRTE)