BF Forked & Threaded Stack Canaries
Last updated
Last updated
Вивчайте та практикуйте Хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE) Вивчайте та практикуйте Хакінг GCP: Навчання HackTricks GCP Red Team Expert (GRTE)
Якщо ви маєте справу з бінарним файлом, захищеним канарейкою та PIE (Position Independent Executable), вам, ймовірно, потрібно знайти спосіб їх обійти.
Зверніть увагу, що checksec
може не виявити, що бінарний файл захищений канарейкою, якщо він був статично скомпільований і не може ідентифікувати функцію.
Однак ви можете вручну помітити це, якщо ви помітите, що значення зберігається в стеку на початку виклику функції і це значення перевіряється перед виходом.
Найкращий спосіб обійти просту канарейку - це якщо бінарний файл є програмою, яка розгалужує дочірні процеси кожного разу, коли ви встановлюєте нове з'єднання з ним (мережевий сервіс), оскільки кожного разу, коли ви підключаєтеся до нього, використовуватиметься та сама канарейка.
Тоді найкращий спосіб обійти канарейку - це просто брутфорсити її посимвольно, і ви можете визначити, чи був вірний вгаданий байт канарейки, перевіривши, чи програма впала, чи продовжує свій звичайний хід. У цьому прикладі функція брутфорсить 8 байтів канарейки (x64) та розрізняє між правильно вгаданим байтом та неправильним байтом просто перевіряючи, чи відправлена відповідь сервером (інший спосіб у іншій ситуації може бути використання try/except):
Цей приклад реалізований для 64-бітної системи, але може бути легко реалізований для 32-бітної системи.
Це реалізовано для 32-бітної системи, але це можна легко змінити на 64 біти. Також зверніть увагу, що для цього прикладу програма спочатку очікує байт, щоб вказати розмір введення та корисне навантаження.
Потоки того ж процесу також спільно використовують один і той же маркер-канарейку, тому буде можливо перебрати канарейку, якщо бінарний файл створює новий потік кожен раз, коли відбувається атака.
Більше того, переповнення буфера в потоковій функції, захищеній канарейкою, може бути використане для зміни головної канарейки, збереженої в TLS. Це тому, що можливо досягти позиції пам'яті, де зберігається TLS (і, отже, канарейка) через bof в стеку потоку. В результаті, захист є некорисним, оскільки перевірка використовується з двома канарейками, які є однаковими (хоча і зміненими). Цю атаку виконано в описі: 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 біти, без PIE, nx, BF канарейка, запис у деяку пам'ять ROP для виклику execve
та перехід туди.