Ret2csu
Вивчайте та практикуйте взлом AWS: Навчання HackTricks AWS Red Team Expert (ARTE)
Вивчайте та практикуйте взлом GCP:
Навчання HackTricks GCP Red Team Expert (GRTE)
https://www.scs.stanford.edu/brop/bittau-brop.pdfОсновна інформація
ret2csu - це техніка взлому, яку використовують, коли ви намагаєтеся отримати контроль над програмою, але не можете знайти гаджети, які зазвичай використовуєте для маніпулювання поведінкою програми.
Коли програма використовує певні бібліотеки (наприклад, libc), вона має деякі вбудовані функції для управління тим, як різні частини програми спілкуються між собою. Серед цих функцій є деякі приховані скарби, які можуть діяти як наші відсутні гаджети, особливо один під назвою __libc_csu_init
.
Магічні гаджети в __libc_csu_init
У __libc_csu_init
є дві послідовності інструкцій (гаджети), які варто виділити:
Перша послідовність дозволяє нам встановлювати значення в кількох регістрах (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
повинні мати однакове значення, щоб уникнути стрибкаЄ деякі пропущені pops, які потрібно врахувати
RDI та RSI
Інший спосіб керування 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
.
Обхід виклику та досягнення ret
Наступний експлойт був витягнутий з цієї сторінки, де використовується ret2csu, але замість використання виклику, він обходить порівняння та досягає ret
після виклику:
Чому б просто не використовувати libc безпосередньо?
Зазвичай ці випадки також вразливі до ret2plt + ret2lib, але іноді потрібно керувати більшою кількістю параметрів, ніж можна легко контролювати за допомогою гаджетів, які ви знаходите безпосередньо в libc. Наприклад, функція write()
потребує три параметри, і знаходження гаджетів для встановлення всіх цих параметрів безпосередньо може бути неможливим.
Last updated