Ret2esp / Ret2reg
Вивчайте та практикуйте хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks
Вивчайте та практикуйте хакінг GCP:
Навчання GCP Red Team Expert (GRTE) від HackTricks
Ret2esp
Оскільки 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:
Ret2reg
Так само, якщо ми знаємо, що функція повертає адресу, де зберігається код оболонки, ми можемо скористатися інструкціями call eax
або jmp eax
(відомими як техніка ret2eax), що пропонує ще один метод виконання нашого коду оболонки. Так само, як eax, можна використовувати будь-який інший регістр, що містить цікаву адресу (ret2reg).
Приклад
Ви можете знайти деякі приклади тут:
strcpy
буде зберігати вeax
адресу буфера, де зберігався код оболонки, іeax
не перезаписується, тому можливе використанняret2eax
.
ARM64
Ret2sp
У ARM64 немає інструкцій, що дозволяють перейти до реєстру SP. Можливо, знайти гаджет, який переміщує sp до реєстру, а потім переходить до цього реєстру, але в бібліотеці libc мого kali я не зміг знайти жодного гаджета подібного до цього:
Єдині, які я виявив, змінили б значення реєстру, куди було скопійовано sp перед стрибком до нього (тому воно стало б некорисним):
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2585115637-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FhAv2kYoPrT3n8552GaQU%252Fuploads%252Fgit-blob-e65ef8fd7c7e795467d9fb572c1a41c41e7d4795%252Fimage%2520%281224%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=a610b031&sv=1)
Ret2reg
Якщо реєстр має цікаву адресу, можна стрибнути до неї, просто знаходячи відповідну інструкцію. Ви можете використовувати щось на зразок:
У ARM64 це x0
, хто зберігає значення повернення функції, тому можливо, що x0 зберігає адресу буфера, котрий контролюється користувачем з шелл-кодом для виконання.
Приклад коду:
Перевіривши розібрання функції, можна побачити, що адреса буфера (вразлива на переповнення буфера та керована користувачем) зберігається в x0
перед поверненням з переповнення буфера:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2585115637-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FhAv2kYoPrT3n8552GaQU%252Fuploads%252Fgit-blob-241b71d2985061e52842ec43c40cfd8cce3e5527%252Fimage%2520%281225%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=f6f79382&sv=1)
Також можна знайти гаджет br x0
у функції do_stuff
:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2585115637-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FhAv2kYoPrT3n8552GaQU%252Fuploads%252Fgit-blob-843007838794f1a148c5639f308a4f3ca62e027b%252Fimage%2520%281226%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=5523152b&sv=1)
Ми використаємо цей гаджет для переходу до нього, оскільки бінарний файл компілюється БЕЗ 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)
Last updated