BF Forked & Threaded Stack Canaries
Вивчайте та практикуйте Хакінг AWS: Навчання HackTricks AWS Red Team Expert (ARTE)
Вивчайте та практикуйте Хакінг GCP:
Навчання HackTricks GCP Red Team Expert (GRTE)
Якщо ви маєте справу з бінарним файлом, захищеним канарейкою та PIE (Position Independent Executable), вам, ймовірно, потрібно знайти спосіб їх обійти.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2585115637-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FhAv2kYoPrT3n8552GaQU%252Fuploads%252Fgit-blob-95ac857d8ae19be9bc96c5b5e1a5ef50998db3d3%252Fimage%2520%28865%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=7777acf&sv=1)
Зверніть увагу, що checksec
може не виявити, що бінарний файл захищений канарейкою, якщо він був статично скомпільований і не може ідентифікувати функцію.
Однак ви можете вручну помітити це, якщо ви помітите, що значення зберігається в стеку на початку виклику функції і це значення перевіряється перед виходом.
Брутфорс Канарейки
Найкращий спосіб обійти просту канарейку - це якщо бінарний файл є програмою, яка розгалужує дочірні процеси кожного разу, коли ви встановлюєте нове з'єднання з ним (мережевий сервіс), оскільки кожного разу, коли ви підключаєтеся до нього, використовуватиметься та сама канарейка.
Тоді найкращий спосіб обійти канарейку - це просто брутфорсити її посимвольно, і ви можете визначити, чи був вірний вгаданий байт канарейки, перевіривши, чи програма впала, чи продовжує свій звичайний хід. У цьому прикладі функція брутфорсить 8 байтів канарейки (x64) та розрізняє між правильно вгаданим байтом та неправильним байтом просто перевіряючи, чи відправлена відповідь сервером (інший спосіб у іншій ситуації може бути використання try/except):
Приклад 1
Цей приклад реалізований для 64-бітної системи, але може бути легко реалізований для 32-бітної системи.
Приклад 2
Це реалізовано для 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
та перехід туди.
Last updated