Ret2esp / Ret2reg
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Оскільки ESP (вказівник стеку) завжди вказує на верхню частину стеку, ця техніка полягає в заміні EIP (вказівник інструкцій) адресою інструкції jmp esp
або call esp
. Завдяки цьому shellcode розміщується безпосередньо після переписаного EIP. Коли виконується інструкція ret
, ESP вказує на наступну адресу, точно там, де зберігається shellcode.
Якщо випадкове розташування адресного простору (ASLR) не активовано в Windows або Linux, можна використовувати інструкції jmp esp
або call esp
, знайдені в спільних бібліотеках. Однак, з активним ASLR, можливо, доведеться шукати ці інструкції безпосередньо в уразливій програмі (і вам, можливо, потрібно буде подолати PIE).
Більше того, можливість розмістити shellcode після корупції EIP, а не посередині стеку, забезпечує, що будь-які інструкції push
або pop
, виконувані під час роботи функції, не заважатимуть shellcode. Це завадження може статися, якщо shellcode буде розміщено посередині стеку функції.
Якщо вам не вистачає місця для запису після переписування RIP (можливо, лише кілька байтів), запишіть початковий shellcode jmp
, наприклад:
І запишіть 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:
Аналогічно, якщо ми знаємо, що функція повертає адресу, де зберігається shellcode, ми можемо використовувати інструкції call eax
або jmp eax
(відомі як ret2eax техніка), що пропонує ще один спосіб виконати наш shellcode. Так само, як eax, будь-який інший регістр, що містить цікаву адресу, може бути використаний (ret2reg).
You can find some examples here:
strcpy
буде зберігати в eax
адресу буфера, де зберігався shellcode, і eax
не перезаписується, тому можливо використовувати ret2eax
.
В ARM64 немає інструкцій, які дозволяють перейти до регістру SP. Можливо, можна знайти гаджет, який переміщує sp до регістру, а потім переходить до цього регістру, але в libc моєї kali я не зміг знайти жодного гаджета такого роду:
Єдині, які я виявив, змінювали значення реєстру, куди sp було скопійовано перед переходом до нього (тому він ставав марним):
Якщо реєстр має цікаву адресу, можна перейти до нього, просто знайшовши відповідну інструкцію. Ви можете використовувати щось на кшталт:
В ARM64, це x0
зберігає значення повернення функції, тому може бути, що x0 зберігає адресу буфера, контрольованого користувачем, з shellcode для виконання.
Example code:
Перевіряючи дизасемблювання функції, можна побачити, що адреса буфера (вразливого до bof і контрольованого користувачем) зберігається в x0
перед поверненням з переповнення буфера:
Також можна знайти гаджет br x0
у функції do_stuff
:
Ми використаємо цей гаджет, щоб стрибнути до нього, оскільки бінарний файл скомпільований БЕЗ PIE. Використовуючи патерн, можна побачити, що зсув переповнення буфера становить 80, тому експлойт буде:
Якщо замість fgets
використовувати щось на кшталт read
, можна було б обійти PIE, перезаписавши лише останні 2 байти адреси повернення, щоб повернутися до інструкції br x0;
без необхідності знати повну адресу.
З fgets
це не працює, оскільки він додає нульовий (0x00) байт в кінці.
NX: Якщо стек не є виконуваним, це не допоможе, оскільки нам потрібно помістити shellcode в стек і перейти до його виконання.
Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)