Ret2win
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)
Ret2win завдання є популярною категорією в Capture The Flag (CTF) змаганнях, особливо в завданнях, що стосуються binary exploitation. Мета полягає в тому, щоб експлуатувати вразливість у даному бінарному файлі для виконання конкретної, не викликаної функції в бінарному файлі, яка часто називається чимось на кшталт win
, flag
тощо. Ця функція, коли її виконують, зазвичай виводить прапор або повідомлення про успіх. Завдання зазвичай передбачає перезаписування адреси повернення в стеку, щоб відвести потік виконання до бажаної функції. Ось більш детальне пояснення з прикладами:
Розглянемо просту C програму з вразливістю та функцією win
, яку ми маємо намір викликати:
Щоб скомпілювати цю програму без захисту стеку та з вимкненим ASLR, ви можете використати наступну команду:
-m32
: Скомпілювати програму як 32-бітний бінарний файл (це необов'язково, але поширено в CTF завданнях).
-fno-stack-protector
: Вимкнути захист від переповнень стеку.
-z execstack
: Дозволити виконання коду в стеку.
-no-pie
: Вимкнути позиційно незалежний виконуваний файл, щоб адреса функції win
не змінювалася.
-o vulnerable
: Назвати вихідний файл vulnerable
.
Для експлойту ми використаємо pwntools, потужний фреймворк CTF для написання експлойтів. Скрипт експлойту створить корисне навантаження для переповнення буфера та перезапису адреси повернення адресою функції win
.
Щоб знайти адресу функції win
, ви можете використовувати gdb, objdump або будь-який інший інструмент, який дозволяє вам перевіряти бінарні файли. Наприклад, з objdump
ви можете використовувати:
Ця команда покаже вам асемблер функції win
, включаючи її початкову адресу.
Скрипт на Python надсилає ретельно підготовлене повідомлення, яке, оброблене функцією vulnerable_function
, переповнює буфер і перезаписує адресу повернення в стеку адресою win
. Коли vulnerable_function
повертається, замість повернення до main
або виходу, він переходить до win
, і повідомлення виводиться на екран.
PIE повинен бути вимкнений, щоб адреса була надійною між виконаннями, інакше адреса, де буде зберігатися функція, не завжди буде однаковою, і вам знадобиться якийсь leak, щоб з'ясувати, де завантажена функція win. У деяких випадках, коли функція, що викликає переповнення, є read
або подібною, ви можете зробити Часткове Перезаписування 1 або 2 байтів, щоб змінити адресу повернення на функцію win. Через те, як працює ASLR, останні три шістнадцяткові нібли не рандомізовані, тому є 1/16 шанс (1 нібль) отримати правильну адресу повернення.
Stack Canaries також повинні бути вимкнені, інакше скомпрометована адреса повернення EIP ніколи не буде виконана.
32 біт, без ASLR
64 біти з ASLR, з leak адреси бінарника
64 біти, без ASLR
32 біти, без ASLR, подвійне мале переповнення, спочатку переповнити стек і збільшити розмір другого переповнення
32 біти, relro, без канарки, nx, без pie, форматний рядок для перезапису адреси fflush
функцією win (ret2win)
32 біти, nx, нічого іншого, часткове перезаписування EIP (1 байт) для виклику функції win
32 біти, nx, нічого іншого, часткове перезаписування EIP (1 байт) для виклику функції win
Програма лише перевіряє останній байт числа, щоб перевірити розмір введення, тому можливо додати будь-який розмір, якщо останній байт знаходиться в дозволеному діапазоні. Потім введення створює переповнення буфера, яке експлуатується за допомогою ret2win.
64 біти, relro, без канарки, nx, pie. Часткове перезаписування для виклику функції win (ret2win)
arm64, PIE, він дає leak PIE, функція win насправді є 2 функціями, тому ROP гаджет, який викликає 2 функції
ARM64, off-by-one для виклику функції win
Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)