Программа принимает на вход строку. Нужно заставить её вывести флаг.
Solution
Анализ main
int32_t main(int32_t argc, char** argv, char** envp)
{
signal(sig: 2, handler);
char buf[0x108];
int32_t result = fgets(&buf, n: 0xa, fp: __TMC_END__);
if (rax == *(fsbase + 0x28))
return result;
__stack_chk_fail();
}
signal(2, handler) — устанавливает свой обработчик на сигнал SIGINT (номер 2).
Сигнал — программное прерывание. Поступление сигнала информирует процесс о возникновении события или исключительных условий.
SIGINT отправляется через Ctrl+C или kill -2 <PID>.
Получение флага
Запускаем бинарь в фоне и отправляем сигнал:
root@db1e62f604a9:/rev# ./signalization2.elf &
[1] 22
root@db1e62f604a9:/rev# kill -2 22
[1]+ Stopped ./signalization2.elf
root@db1e62f604a9:/rev# fg
./signalization2.elf
Flag{T*is 14 Simple}
^CFlag{T*is 14 Simple}
^CFlag{T*is 14 Simple}
Анализ handler
int64_t handler()
{
char str[0x15];
__builtin_strncpy(dest: &str, src: "Flag{This Is Simple}", count: 0x15);
str[0xa] = '1';
str[0xb] = '4';
str[6] = '*';
puts(&str);
}
Обработчик берёт исходную строку "Flag{This Is Simple}", заменяет несколько символов и выводит результат. Комментарии излишни.