BF Addresses in the Stack
Last updated
Last updated
Вивчайте та практикуйте Хакінг AWS: Навчання AWS Червоної Команди HackTricks (ARTE) Вивчайте та практикуйте Хакінг GCP: Навчання GCP Червоної Команди HackTricks (GRTE)
Якщо ви маєте справу з бінарним файлом, захищеним канарейкою та PIE (Position Independent Executable), вам, ймовірно, потрібно знайти спосіб їх обійти.
Зверніть увагу, що checksec
може не виявити, що бінарний файл захищений канарейкою, якщо він був статично скомпільований і не може ідентифікувати функцію.
Однак ви можете вручну помітити це, якщо ви помітите, що значення зберігається в стеці на початку виклику функції і це значення перевіряється перед виходом.
Для обходу PIE вам потрібно витікати деяку адресу. І якщо бінарний файл не витікає жодних адрес, то найкраще зробити це - перебрати RBP та RIP, збережені в стеці вразливої функції. Наприклад, якщо бінарний файл захищений як канарейкою, так і PIE, ви можете почати перебирати канарейку, потім наступні 8 байтів (x64) будуть збережені RBP, а наступні 8 байтів будуть збережені RIP.
Припускається, що адреса повернення всередині стеку належить до основного коду бінарного файлу, який, якщо вразливість знаходиться в коді бінарного файлу, зазвичай буде таким.
Для перебору RBP та RIP з бінарного файлу ви можете зрозуміти, що правильний вгаданий байт є правильним, якщо програма виводить щось або просто не виходить з ладу. Ту саму функцію, що надана для перебору канарейки, можна використовувати для перебору RBP та RIP:
Останнє, що вам потрібно для перемоги над PIE, це обчислити корисні адреси з витікших адрес: RBP та RIP.
З RBP ви можете обчислити де ви пишете свій shell в стеку. Це може бути дуже корисно, щоб знати, де ви збираєтеся записати рядок "/bin/sh\x00" всередині стеку. Щоб обчислити відстань між витікшим RBP та вашим shellcode, ви можете просто встановити точку зупинки після витоку RBP та перевірити де знаходиться ваш shellcode, після цього ви можете обчислити відстань між shellcode та RBP:
З RIP ви можете обчислити базову адресу PIE-бінарного файлу, що вам знадобиться для створення дійсного ланцюжка ROP.
Щоб обчислити базову адресу, просто виконайте objdump -d vunbinary
та перевірте розібрані останні адреси:
У цьому прикладі ви можете побачити, що для визначення всього коду потрібно лише 1 байт та півтора, тоді базова адреса в цій ситуації буде витікати з RIP, але закінчуватися на "000". Наприклад, якщо витікло 0x562002970ecf
, базова адреса буде 0x562002970000
Згідно з деякими спостереженнями з цього посту, можливо, коли витікають значення RBP та RIP, сервер не впаде з деякими значеннями, які не є правильними, і скрипт BF подумає, що він отримав правильні. Це тому, що можливо, деякі адреси просто не зламають його, навіть якщо вони не є точно правильними.
Згідно з цим блог-постом рекомендується додати коротку затримку між запитами до сервера.
Вивчайте та практикуйте Хакінг AWS:Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте Хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)