Особенности дизассемблирования под LINUX на примере tiny-crackme



         

Исследование tiny-crackme извне и изнутри - часть 12


Возвращаемся к строке 002000CFh (той самой, в которой мы исправили условный переход), и прокручиваем экран дизассемблера вверх до тех пор, пока не встретим следующую перекрестную ссылку start+AFj, ведущую к строке 2000ACh. Посмотрим, что у нас там?

LOAD:002000AC        call   loc_2002C9           ; проверка пароля и своего CRC

LOAD:002000B1        xor    ebx, dword_200296    ; анализ результатов

LOAD:002000B7        jz     short loc_2000CC     ; -> все ок

LOAD:002000B9

LOAD:002000B9 loc_2000B9:                       ; CODE XREF: start+C7vj

LOAD:002000B9        mov    ecx,offset aWrongPasswordS;"\n Wrong password, sorry..."

Листинг 10 мина с детонатором

Оторвать мой хвост! Еще одна проверка и еще один условный переход, расположенный по адресу 2000B7h. Как видно, он анализирует значение, возвращенное функцией loc_2002C9, сравнивая его с двойным словом dword_200296, и, если loc_2002C9()^dword_200296!=0, условный переход *не* выполняется и управление получает подпрограмма выводящая ругательное сообщение на экран. Что делает функция loc_2002C9? Да какая нам разница! Судя по всему, занимается проверкой целостности кода (которую нам обещал создатель крякмиса). Чтобы обезвредить ее мы должны заменить JZ на JNZ инвертировав младший бит байта, расположенного по адресу 2000B7h. Вычитая базовый виртуальный адрес сегмента, мы получим физическое смещение по которому этот байт располагается в ELF-файле (в нашем случае оно равно B7h), где находится байт 85h. Инвертируем младший бит, превращая его в 84h, сохраняем изменения, выходим из HTE, запускаем timy-crackme… Как это так опять не запускается?! Вот что значит хачить вслепую!

Рисунок 7 "сквозная" правка зашифрованного кода в HTE без его расшифровки

Возвращаемся к нашему первому условному переходу 2000CFh  (см. листинг 9) и пытаемся проанализировать что именно он проверяет. Мы видим, что с вершины стека стягивается двойное слово и проверяется на равенство нулю. А кто его туда положил?! Переходим по перекрестной ссылке наверх и видим, что в строке 20009Ch на вершину стека забрасывается содержимое регистра EBX.




Содержание  Назад  Вперед