BF Forked & Threaded Stack Canaries
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
може не виявити, що бінарний файл захищений канаркою, якщо він був статично скомпільований і не здатний ідентифікувати функцію.
Однак ви можете помітити це вручну, якщо виявите, що значення зберігається в стеку на початку виклику функції, і це значення перевіряється перед виходом.
Найкращий спосіб обійти просту канарку - це якщо бінарний файл є програмою, яка створює дочірні процеси щоразу, коли ви встановлюєте нове з'єднання з нею (мережевий сервіс), оскільки щоразу, коли ви підключаєтеся до неї, використовується одна й та ж канарка.
Отже, найкращий спосіб обійти канарку - це просто обійти її методом грубої сили, символ за символом, і ви можете з'ясувати, чи правильний байт канарки, перевіряючи, чи програма зламалася, чи продовжує свій звичайний потік. У цьому прикладі функція обходить 8-байтову канарку (x64) і розрізняє між правильно вгаданим байтом і неправильним байтом, просто перевіряючи, чи відповідь надіслана сервером (інший спосіб у іншій ситуації може бути використанням try/except):
Цей приклад реалізовано для 64 біт, але його можна легко реалізувати для 32 біт.
Це реалізовано для 32 біт, але це можна легко змінити на 64 біти. Також зверніть увагу, що для цього прикладу програма спочатку очікує байт, щоб вказати розмір введення та корисного навантаження.
Потоки одного процесу також ділять один і той же токен канарки, тому буде можливим брутфорсити канарку, якщо бінарний файл створює новий потік щоразу, коли відбувається атака.
Більше того, переповнення буфера в багатопоточній функції, захищеній канаркою, може бути використане для модифікації майстер-канарки, збереженої в TLS. Це пов'язано з тим, що може бути можливим досягти позиції пам'яті, де зберігається TLS (а отже, і канарка) через переповнення буфера в стеку потоку. В результаті, пом'якшення є марним, оскільки перевірка використовується з двома канарками, які є однаковими (хоча модифікованими). Ця атака описана в звіті: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Перегляньте також презентацію https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015, яка згадує, що зазвичай TLS зберігається за допомогою mmap
, і коли створюється стек потоку, він також генерується за допомогою mmap
, що може дозволити переповнення, як показано в попередньому звіті.
64 bits, no PIE, nx, BF canary, write in some memory a ROP to call execve
and jump there.