WWW2Exec - GOT/PLT
Last updated
Last updated
Вивчайте та практикуйте хакінг AWS: Школа хакінгу HackTricks для експертів червоної команди AWS (ARTE) Вивчайте та практикуйте хакінг GCP: Школа хакінгу HackTricks для експертів червоної команди GCP (GRTE)
Глобальна таблиця зміщень (GOT) - це механізм, який використовується в динамічно зв'язаних бінарних файлах для управління адресами зовнішніх функцій. Оскільки ці адреси не відомі до часу виконання (через динамічне зв'язування), GOT надає можливість динамічно оновлювати адреси цих зовнішніх символів після їх вирішення.
Кожен запис в GOT відповідає символу в зовнішніх бібліотеках, які може викликати бінарний файл. Коли функцію вперше викликають, її фактична адреса вирішується динамічним зв'язувальником і зберігається в GOT. Подальші виклики цієї функції використовують адресу, збережену в GOT, уникнувши таким чином накладних витрат на вирішення адреси знову.
Таблиця зв'язку процедур (PLT) тісно взаємодіє з GOT і служить трампліном для обробки викликів зовнішніх функцій. Коли бінарний файл викликає зовнішню функцію вперше, управління передається до запису в PLT, пов'язаному з цією функцією. Цей запис PLT відповідає за виклик динамічного зв'язувальника для вирішення адреси функції, якщо вона ще не була вирішена. Після вирішення адреса зберігається в GOT.
Отже, записи GOT використовуються безпосередньо після вирішення адреси зовнішньої функції або змінної. Записи PLT використовуються для полегшення початкового вирішення цих адрес за допомогою динамічного зв'язувальника.
Отримайте адресу таблиці GOT за допомогою: objdump -s -j .got ./exec
Після завантаження виконуваного файлу в GEF ви можете побачити функції, які знаходяться в GOT: gef➤ x/20x 0xADDR_GOT
За допомогою GEF ви можете розпочати сесію налагодження та виконати got
, щоб побачити таблицю got:
У бінарному файлі GOT містить адреси функцій або секції PLT, які завантажать адресу функції. Мета цього довільного запису полягає в тому, щоб переписати запис GOT функції, яка буде виконана пізніше, з адресою PLT функції system
, наприклад.
Ідеально, ви перепишете GOT функції, яка буде викликана з параметрами, які контролюються вами (таким чином, ви зможете контролювати параметри, які надсилаються функції системи).
Якщо system
не використовується бінарним файлом, функція системи не матиме запису в PLT. У цьому сценарії вам доведеться спочатку витікти адресу функції system
, а потім переписати GOT, щоб вказати на цю адресу.
Ви можете побачити адреси PLT за допомогою objdump -j .plt -d ./vuln_binary
GOT бібліотеки libc зазвичай компілюється з частковим RELRO, що робить його гарною метою для цього, якщо можливо визначити його адресу (ASLR).
Звичайні функції libc будуть викликати інші внутрішні функції, адреси GOT яких можна переписати для отримання виконання коду.
Знайдіть більше інформації про цю техніку тут.
У CTF з експлуатації купиць часто можна контролювати вміст частин і, в певний момент, навіть переписати таблицю GOT. Простий трюк для отримання RCE, якщо немає доступних гаджетів, - переписати адресу free
GOT, щоб вказувати на system
та записати у частину "/bin/sh"
. Таким чином, коли ця частина буде вивільнена, вона виконає system("/bin/sh")
.
Ще одна поширена техніка - переписати адресу GOT strlen
, щоб вказувати на system
, тому якщо цю функцію викликають з введеними користувачем даними, можна передати рядок "/bin/sh"
та отримати оболонку.
Більше того, якщо puts
використовується з введеними користувачем даними, можна переписати адресу GOT strlen
, щоб вказувати на system
та передати рядок "/bin/sh"
для отримання оболонки, оскільки puts
викличе strlen
з введеними користувачем даними.
Звичайний спосіб отримання RCE з вразливості купиці - зловживання швидкої купиці, щоб можна було додати частину таблиці GOT до швидкої купиці, тому коли цей шматок виділяється, буде можливо переписати вказівник функції, зазвичай free
.
Потім, вказавши free
на system
та вивільнивши шматок, де було записано /bin/sh\x00
, буде виконано оболонку.
Можливо знайти приклад тут.
Захист Full RELRO призначений для захисту від цього виду техніки шляхом вирішення всіх адрес функцій при запуску бінарного файлу та зроблення таблиці GOT доступною тільки для читання після цього:
Relro