Kaspersky{CTF} - flag-what-where, 50 points от @tonysdx
💡 Идея:
Бинарник считывает флаг на
stack через функцию fgets, а затем затирает его с помощью memset. После этого у нас есть 3 попытки прочитать произвольные байты памяти по заданному адресу, после чего программа завершается.
👹 Уязвимость:
Функция
fgets, как и многие другие функции из glibc, при чтении строки из stdin использует буферы на heap. Поэтому часть флага можно найти в heap-памяти.
Почему только часть, а не весь флаг?
Потому что
fgets освобождает буфер после завершения работы, и первые N байт затираются служебными данными. Кроме того, бинарник собран без PIE, так что вычислить необходимые смещения не представляет труда.
💉Эксплуатация:
1. Помещаем
cyclic(128) в файл flag.txt, патчим бинарник на использование тех же библиотек, что и в docker-контейнере, и запускаем в gdb. 2. Используем команду
search -t bytes "aaaa". 3. Находим участок heap, где лежит часть флага, и вычисляем смещение от начала сегмента heap.
4. Получаем leak libc через
GOT-table, leak heap из main_arena, и читаем данные по рассчитанному на шаге 3 смещению. 📝 Заметки:
Сначала я думал, что придётся искать первую часть флага, которая затирается, где-то еще. Но организаторы предусмотрели это: весь флаг оказался доступен в heap.
Я просто вычел 16 из изначально вычисленного смещения и получил полный флаг.
💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube