Ret2win
Базова інформація
Виклики Ret2win є популярною категорією на змаганнях Capture The Flag (CTF), особливо в завданнях, які включають експлуатацію бінарних файлів. Мета полягає в експлуатації вразливості в заданому бінарному файлі для виконання певної, не викликаної функції всередині файлу, яка часто має назву, наприклад, win
, ret2win
, тощо. Ця функція, коли виконується, зазвичай виводить прапорець або повідомлення про успіх. Зазвичай виклик включає перезапис адреси повернення на стеку для перенаправлення потоку виконання до бажаної функції. Ось більш детальне пояснення з прикладами:
Приклад на мові C
Розглянемо просту програму на мові C з вразливістю та функцією win
, яку ми маємо намір викликати:
Для компіляції цієї програми без захисту стеку та з вимкненим ASLR, ви можете використати наступну команду:
-m32
: Компілювати програму як 32-бітний бінарний файл (це необов'язково, але загально використовується в завданнях CTF).-fno-stack-protector
: Вимкнути захист від переповнення стеку.-z execstack
: Дозволити виконання коду на стеці.-no-pie
: Вимкнути позиційно-незалежний виконуваний файл, щоб забезпечити, що адреса функціїwin
не зміниться.-o vulnerable
: Назвати вихідний файлvulnerable
.
Python Exploit використовуючи Pwntools
Для експлойту ми використаємо pwntools, потужний фреймворк CTF для написання експлойтів. Скрипт експлойту створить полезне навантаження для переповнення буфера та перезапису адреси повернення адресою функції win
.
Для знаходження адреси функції win
ви можете використовувати gdb, objdump або будь-який інший інструмент, який дозволяє вам переглядати бінарні файли. Наприклад, з objdump
ви можете використати:
Ця команда покаже вам асемблерну частину функції win
, включаючи початкову адресу.
Сценарій Python надсилає уважно створене повідомлення, яке, оброблене функцією vulnerable_function
, переповнює буфер і перезаписує адресу повернення на стеку адресою win
. Коли vulnerable_function
повертається, замість повернення до main
або виходу, він переходить до win
, і повідомлення виводиться.
Захисти
ASLR повинен бути вимкнений для того, щоб адреса була надійною під час виконання або адреса, де буде збережена функція, не завжди буде однаковою, і вам знадобиться якийсь витік, щоб з'ясувати, де завантажена функція win.
Stack Canaries також повинні бути вимкнені, або компрометована адреса повернення EIP ніколи не буде виконана.
Інші приклади
Last updated