/var/log/life.log
Блог программиста из солнечной Бурятии

Прохождение 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";