Прохождение Meow ufo ctf 2017
По легенде нужно ввести кличку кота, чтобы поиграть с ним.
Загружаем программу в IDA, там всего одна функция, переключаемся на псевдокод.
Из него я только смог понять только то, что введённая кличка и будет флагом к заданию. И собственно цикл проверки введёных данных, на основе массива в памяти. По идее должно быть уже всё понятно, но мне оказалось трудно понять, как что вычисляется. Поэтому полез в отладчик. Ставим breakpoint на definitely_not_check, включаем вывод инструкций layout asm и запускаем выполнение.
Доходим до адреса 0x4006dd и видим, что 2 байта из нашего ввода перемножается с двумя байтами из массива в памяти, после чего отсекается всё, что больше 0xffff и сравнивается с 1, если всё ok, проверяем следующую пару.
Теперь можно подобрать ключ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php $data = [ 0x8765, 0xddbb, 0x3d85, 0xE78F, 0x2877, 0x2E9F, 0xFAA1, 0xD89F, 0x3a09, 0xddbb, 0xd68b, 0xce65 ]; $str = ''; foreach($data as $x) for($i=0; $i <= 0xFFFF; $i++){ $res = ($x*$i) & 0xffff; if($res == 1){ $res = dechex($i); $str .= substr($res,2,2).substr($res,0,2); } } $flag = ''; for ($n = 0; $n < strlen($str); $n += 2) { $flag .= pack("C", hexdec(substr($str, $n, 2))); } echo $flag."\n"; |