Skip to content

Генератор флагов

Mikhail Gnedashev edited this page May 19, 2018 · 1 revision
  • Категория: Reverse
  • Стоимость: 200
  • Автор: Мария Девятых
  • Репозиторий

Описание

Псс, хочешь получить флаг? Ничего сложного, я могу это устроить. Вот программа. Всё, что тебе нужно, это... (помехи) flagogenerator

Что дается

  • Исполняемый файл flagogenerator

Решение

Запустим программу:

$ ./flagogenerator
Hello! This program will generate a flag for you by your token :)

Applying Caesar...
Applying hashing algorithms...
Applying concatenation...

Your flag is generated!
...But you're not allowed to see it. Ahahaha :D

Программа говорит нам что флаг сгенерирован. Из этого мы можем сделать предположение, что в какой-то момент ее работы верный флаг находился в памяти программы. Один из вариантов решения - воспользоваться дебаггером (например, ollydbg (Windows) или gdb (Linux)) и посмотреть на память программы во время ее исполнения, а конкретно - в тот момент когда печатается строка "Your flag is generated!". Но рассмотрим более детально, что происходит в программе. Откроем файл в IDA и найдем функцию с интересующей нас строкой:

Видим, что программа может вывести флаг на консоль, если функция _strcmp вернет 0. Это стандартная функция языка С, она сравнивает переданные ей строки. Видим что в начале функции break_everything значение какой-то переменной устанавливается в "debug-no", а потом эта переменная передается в _strcmp вместе со строкой "debug". Значит, если бы значение этой переменной было "debug", то мы бы увидели флаг. Так и сделаем. Посмотрим в hex-view на место, где в памяти лежит "debug-no":

Строка "debug-no" кодируется байтами 64 65 62 75 67 2D 6E 6F посимвольно. Значит, чтобы изменить ее значение на "debug", надо просто занулить в любом hex-редакторе последние три байта (2D 6E 6F) которые отвечают за "-no". Сохраним полученный файл и запустим - получим флаг.