Ret2csu
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)
ret2csu — це техніка хакерства, яка використовується, коли ви намагаєтеся взяти контроль над програмою, але не можете знайти gadgets, які зазвичай використовуєте для маніпуляції поведінкою програми.
Коли програма використовує певні бібліотеки (наприклад, libc), вона має вбудовані функції для управління тим, як різні частини програми спілкуються одна з одною. Серед цих функцій є кілька прихованих скарбів, які можуть діяти як наші відсутні gadgets, особливо одна з них під назвою __libc_csu_init
.
У __libc_csu_init
є дві послідовності інструкцій (gadgets), які варто виділити:
Перша послідовність дозволяє нам налаштувати значення в кількох регістрах (rbx, rbp, r12, r13, r14, r15). Це як слоти, де ми можемо зберігати числа або адреси, які хочемо використовувати пізніше.
Цей гаджет дозволяє нам контролювати ці регістри, витягуючи значення зі стеку в них.
Друга послідовність використовує значення, які ми налаштували, щоб виконати кілька дій:
Перемістити конкретні значення в інші регістри, готуючи їх для використання як параметри в функціях.
Виконати виклик до місця, визначеного шляхом додавання значень у r15 та rbx, а потім множення rbx на 8.
Можливо, ви не знаєте жодної адреси, куди можна записати, і вам потрібна інструкція ret
. Зверніть увагу, що другий гаджет також закінчиться на ret
, але вам потрібно буде виконати деякі умови, щоб досягти його:
Умови будуть такими:
[r12 + rbx*8]
повинен вказувати на адресу, що зберігає викликаючу функцію (якщо немає ідеї і немає pie, ви можете просто використовувати функцію _init
):
Якщо _init знаходиться за адресою 0x400560
, використовуйте GEF для пошуку в пам'яті вказівника на неї і зробіть так, щоб [r12 + rbx*8]
був адресою з вказівником на _init:
rbp
та rbx
повинні мати однакове значення, щоб уникнути стрибка
Є деякі пропущені попи, які потрібно врахувати
Ще один спосіб контролювати rdi
та rsi
з гаджета ret2csu - це доступ до специфічних зсувів:
Перевірте цю сторінку для отримання додаткової інформації:
BROP - Blind Return Oriented ProgrammingУявіть, що ви хочете зробити системний виклик або викликати функцію, таку як write()
, але вам потрібні специфічні значення в регістрах rdx
та rsi
як параметри. Зазвичай ви шукали б гаджети, які безпосередньо встановлюють ці регістри, але не можете знайти жодного.
Ось тут і вступає в гру ret2csu:
Налаштуйте регістри: Використовуйте перший магічний гаджет, щоб витягти значення зі стеку та помістити їх у rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) та r15.
Використовуйте другий гаджет: З цими налаштованими регистрами ви використовуєте другий гаджет. Це дозволяє вам перемістити вибрані значення в rdx
та rsi
(з r14 та r13 відповідно), готуючи параметри для виклику функції. Більше того, контролюючи r15
та rbx
, ви можете змусити програму викликати функцію, розташовану за адресою, яку ви обчислюєте та поміщаєте в [r15 + rbx*8]
.
У вас є приклад використання цієї техніки та пояснення тут, і це фінальний експлойт, який він використовував:
Зверніть увагу, що попередній експлойт не призначений для виконання RCE
, він призначений лише для виклику функції під назвою win
(взявши адресу win
з stdin, викликаючи gets в ROP-ланцюгу та зберігаючи її в r15) з третім аргументом зі значенням 0xdeadbeefcafed00d
.
Наступний експлойт був витягнутий з цієї сторінки, де використовується ret2csu, але замість використання виклику, він обходить порівняння та досягає ret
після виклику:
Зазвичай ці випадки також вразливі до ret2plt + ret2lib, але іноді вам потрібно контролювати більше параметрів, ніж можна легко контролювати за допомогою гаджетів, які ви знаходите безпосередньо в libc. Наприклад, функція write()
вимагає трьох параметрів, і знайти гаджети для встановлення всіх цих безпосередньо може бути неможливо.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)