hacktricks/binary-exploitation/array-indexing.md

5.4 KiB
Raw Blame History

Індексація масиву

{% hint style="success" %} Вивчайте та практикуйте хакінг AWS: Навчання AWS Red Team Expert (ARTE) від HackTricks
Вивчайте та практикуйте хакінг GCP: Навчання GCP Red Team Expert (GRTE) від HackTricks

Підтримайте HackTricks
{% endhint %}

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

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

Однак тут ви можете знайти деякі цікаві приклади:

  • https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html
  • Є 2 зіткнення масивів, один для адрес, де зберігаються дані, і один з розмірами цих даних. Можливо перезаписати одне з іншого, дозволяючи записати довільну адресу, вказавши її як розмір. Це дозволяє записати адресу функції free в таблиці GOT, а потім перезаписати її адресою system, і викликати free з пам'яті з /bin/sh.
  • https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html
  • 64 біти, без nx. Перезаписати розмір, щоб отримати вид буферного переповнення, де кожна річ буде використана як подвійне число і впорядкована від найменшого до найбільшого, тому потрібно створити шеллкод, який відповідає цим вимогам, з урахуванням того, що канарейка не повинна бути переміщена зі свого місця, і, нарешті, перезаписати RIP адресою до ret, яка відповідає попереднім вимогам, і вказати найбільшу адресу новою адресою, що вказує на початок стеку (витікла програмою), тому можливо використовувати ret для переходу туди.
  • https://faraz.faith/2019-10-20-secconctf-2019-sum/
  • 64 біти, без relro, канарейка, nx, без pie. Є відхилення на один елемент в масиві на стеці, що дозволяє контролювати вказівник, надаючи WWW (він записує суму всіх чисел масиву в перезаписану адресу відхиленням на одиницю в масиві). Стек контролюється, тому адреса exit GOT перезаписується на pop rdi; ret, і в стек додається адреса до main (повернення до main). Використовується ланцюжок ROP для витоку адреси put в GOT за допомогою puts (exit буде викликано, тому він викличе pop rdi; ret, виконуючи цей ланцюжок в стеці). Нарешті використовується новий ланцюжок ROP для виконання ret2lib.
  • https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
  • 32 біти, без relro, без канарейки, nx, pie. Зловживання поганим індексуванням для витоку адрес бібліотеки libc та купи зі стеку. Зловживання переповненням буфера для виклику ret2lib, який викликає system('/bin/sh') (адреса купи потрібна для обходу перевірки).