Kaspersky{CTF} - Translator, 50 points от @tonysdx
💡 Идея задачи:
Бинарник читает 16 байт из
/dev/random, вычисляет их хэш с помощью SHA512, затем XOR'ит байты флага с этим хэшем, выводит результат и предлагает угадать флаг. При этом у нас есть всего 10 попыток для ввода правильного ответа.
👹 Уязвимость:
1. В функции
main есть off-by-one уязвимость в scanf, что позволяет перезаписать счётчик попыток нулевым байтом и тем самым получить неограниченное количество попыток. 2. Бинарник никогда не закрывает файловые дескрипторы, поэтому их можно открывать сколько угодно.
3. В функции
read_file индекс файлового дескриптора приводится к типу int8. 💉 Эксплуатация:
1. Сначала открываем 255 файловых дескрипторов, используя первые две уязвимости.
2. Когда бинарник откроет 256-й дескриптор, downcast превратит его индекс в
0, и чтение произойдёт не из /dev/random, а из stdin. 3. Теперь бинарник будет вычислять
SHA512 не от случайных байтов, а от нашего ввода. 4. Достаточно передать константную строку (например,
b"A" * 16), вычислить её SHA512-хэш (или просто вынуть его из отладчика), а затем сделать XOR байтов вывода программы и байтов известного хэша — и мы получаем флаг.💬 Канал & Чат | 📺 RUTUBE | 📺 YouTube