BF Addresses in the Stack
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (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 подумає, що він отримав правильні. Це пов'язано з тим, що деякі адреси просто не зламають його, навіть якщо там немає точно правильних.
Згідно з цим блогом, рекомендується додати коротку затримку між запитами до сервера.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)