Print Stack Canary
Збільшення виведеного стеку
Уявіть ситуацію, де програма, вразлива на переповнення стеку, може виконати функцію puts, вказуючи на частину переповненого стеку. Атакуючий знає, що перший байт канарейки - нульовий байт (\x00
), а решта канарейки - випадкові байти. Потім атакуючий може створити переповнення, яке перезапише стек до першого байта канарейки.
Потім атакуючий викликає функціональність puts посередині поліпшення, яке виведе всю канарейку (крім першого нульового байта).
З цією інформацією атакуючий може створити та відправити нову атаку, знаючи канарейку (у тій самій сесії програми).
Очевидно, що ця тактика дуже обмежена, оскільки атакуючому потрібно мати можливість вивести вміст свого поліпшення, щоб ексфільтрувати канарейку, а потім мати можливість створити нове поліпшення (у тій самій сесії програми) та відправити справжнє переповнення буфера.
Приклади CTF:
64-бітна, з увімкненим ASLR, але без PIE, перший крок - заповнити переповнення до байта 0x00 канарейки, а потім викликати puts і витікати її. З канарейки створюється ROP-гаджет для виклику puts для витоку адреси puts з GOT та ROP-гаджет для виклику
system('/bin/sh')
32-бітна, ARM, без relro, канарейка, nx, без pie. Переповнення з викликом puts на ньому для витоку канарейки + ret2lib виклик
system
з ланцюжком ROP для pop r0 (арг/bin/sh
) та pc (адреса system)
Довільне читання
З довільним читанням, як у випадку, наданим форматом рядків, можливо витікання канарейки. Перевірте цей приклад: https://ir0nstone.gitbook.io/notes/types/stack/canaries і можете прочитати про зловживання форматом рядків для читання довільних адрес пам'яті в:
Це виклик використовує форматний рядок дуже простим способом для читання канарейки зі стеку
Last updated