Всем привет,
Застрял на одной CTF-задаче (речь о легальных соревнованиях Capture The Flag) и нужна помощь сообщества, чтобы двигаться дальше. Речь идет о реверс-инжиниринге небольшой самописной программы на C++, которая использует кастомный алгоритм шифрования.
Что я уже сделал: Декомпилировал бинарник с помощью Ghidra. Выделил ключевые функции, отвечающие за кодирование и проверку флага. Попытался проанализировать логику алгоритма — похоже, он использует XOR с динамически генерируемой ключевой последовательностью, основанной на текущем индексе символа. Логика генерации ключа запутанная. Кажется, там используется псевдослучайный генератор с состоянием, которое обновляется после каждого символа. Мой брутфорс по пространству ключей ни к чему не привел.
Есть ли у кого-нибудь опыт анализа подобных "кастомных" криптосистем?
Какие инструменты или методы, кроме статического анализа в Ghidra, могут быть полезны? Может, стоит попробовать динамический анализ с gdb с скриптами для дампа состояния памяти?
Может, я упускаю что-то очевидное в арифметических операциях?
Буду рад если кто поможет.
Попробуйте динамический анализ: запустите программу в gdb с breakpoint'ами на функции генерации ключа и шифрования, дампьте регистры и память для нескольких первых символов это часто позволяет быстро восстановить простой алгоритм (типа LCG), который выглядит запутанно только в статике. Воспроизведите логику в Python для проверки. 😎
Попробуйте динамический анализ: запустите программу в gdb с breakpoint'ами на функции генерации ключа и шифрования, дампьте регистры и память для нескольких первых символов это часто позволяет быстро восстановить простой алгоритм (типа LCG), который выглядит запутанно только в статике. Воспроизведите логику в Python для проверки. 😎
просто "запустите в gdb с брейкпоинтами" звучит так, будто ты никогда не пытался отлаживать бинарник, который собран с -O2 и -s, где все символы вырезаны, а оптимизатор размазал твою логику по регистрам в стиле «а давайте я этот цикл разверну и всё, что можно, заинлайню так, что даже сам автор не поймёт, где начинается функция, а где просто удачное стечение обстоятельств...

