hacktricks/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md

7.8 KiB
Raw Permalink Blame History

AW2Exec - GOT/PLT

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Основна інформація

GOT: Глобальна таблиця зсувів

Глобальна таблиця зсувів (GOT) - це механізм, що використовується в динамічно зв'язаних бінарних файлах для управління адресами зовнішніх функцій. Оскільки ці адреси не відомі до часу виконання (через динамічне зв'язування), GOT забезпечує спосіб динамічно оновлювати адреси цих зовнішніх символів після їх розв'язання.

Кожен запис у GOT відповідає символу у зовнішніх бібліотеках, які може викликати бінарний файл. Коли функція викликається вперше, її фактична адреса розв'язується динамічним зв'язувачем і зберігається в GOT. Наступні виклики тієї ж функції використовують адресу, збережену в GOT, таким чином уникаючи накладних витрат на повторне розв'язання адреси.

PLT: Таблиця зв'язування процедур

Таблиця зв'язування процедур (PLT) тісно співпрацює з GOT і служить як трамплін для обробки викликів зовнішніх функцій. Коли бінарний файл викликає зовнішню функцію вперше, управління передається до запису в PLT, пов'язаного з цією функцією. Цей запис PLT відповідає за виклик динамічного зв'язувача для розв'язання адреси функції, якщо вона ще не була розв'язана. Після розв'язання адреси вона зберігається в GOT.

Отже, записи GOT використовуються безпосередньо після розв'язання адреси зовнішньої функції або змінної. Записи PLT використовуються для полегшення початкового розв'язання цих адрес через динамічний зв'язувач.

Отримати виконання

Перевірте GOT

Отримайте адресу таблиці GOT за допомогою: objdump -s -j .got ./exec

Спостерігайте, як після завантаження виконуваного файлу в GEF ви можете бачити функції, які є в GOT: gef➤ x/20x 0xADDR_GOT

Використовуючи GEF, ви можете почати сесію відлагодження і виконати got, щоб побачити таблицю got:

GOT2Exec

У бінарному файлі GOT має адреси до функцій або до сектора PLT, який завантажить адресу функції. Мета цього довільного запису - перезаписати запис GOT функції, яка буде виконана пізніше адресою PLT функції system, наприклад.

Ідеально, ви будете перезаписувати GOT функції, яка буде викликана з параметрами, контрольованими вами (так що ви зможете контролювати параметри, надіслані до функції system).

Якщо system не використовується скриптом, функція system не матиме запису в PLT. У цьому сценарії вам потрібно спочатку витягнути адресу функції system, а потім перезаписати GOT, щоб вказати на цю адресу.

Ви можете побачити адреси PLT за допомогою objdump -j .plt -d ./vuln_binary

Один гаджет

{% content-ref url="../one-gadget.md" %} one-gadget.md {% endcontent-ref %}

Захисти

Захист Full RELRO призначена для захисту від такого роду технік, розв'язуючи всі адреси функцій, коли бінарний файл запускається, і роблячи таблицю GOT тільки для читання після цього:

{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %} relro.md {% endcontent-ref %}

Посилання

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}