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



         

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


LOAD:002000CD        test   ebx, ebx             ; проверка ebx

на равенство нулю

LOAD:002000CF        jnz    short loc_2000B9     ; -> прыжок если ebx не нуль

LOAD:002000D1        mov    ecx,offset aSuccssCngrt; ветка "правильного пароля"

Листинг 9 окрестности кода, в который нас привела цепочка перекрестных ссылок

Держите мой мыщъх'иный хвост ("я же сказал держите, а не дергайте, и вообще это не хвост" — сказал мыщъх и покраснел)!!! По этому адресу действительно находится условный переход, сравнивающий содержимое регистра EBX с нулем и если он неравен нулю, происходит переход на подпрограмму, выводящую сообщение "wrong password" на экран. В противном случае управление получает ветка, выводящая "Success !! Congratulations" (поздравляем вас с успехом).

А что если попробовать заменить JNZ на JZ? Тогда программа поедет крышей и раскурит косяк. Правильный пароль (которого мы все равно не знаем) она будет воспринимать как неправильный, посылая их в зад, а неправильные пароли встретит с дорогой душой и вот таким косяком. Нет, вооот таким! Вся проблема в том, что программа зашифрована и прежде чем патчить байты ее необходимо расшифровать. В принципе, это можно сделать и с помощью IDA Pro, но проще будет воспользоваться коммерческим HIEW'ом (Сусликова — на костер!) или бесплатным редактором HTE, который можно скачать с www.sourceforge.net/projects/hte.

Остановим свой выбор на последнем, хотя он, в отличии от HIEW'а не может редактировать ELF'ы с искаженным заголовком в режиме image (то есть все виртуальные адреса мы должны вычислять самостоятельно), но зато нам не придется платить.

Загружаем файл в редактор ("$./hte tiny-crackme"), нажимаем <F6> (mode) или давим пробел, в появившемся диалоговом окне выбираем "elf/program header" (просмотр программного заголовка, описывающего сегменты) и видим один-единственный сегмент "entry 0 (load)". Нажимаем <Enter>, чтобы просмотреть его атрибуты и видим, что он начинается с виртуального адреса 200000h, расположенного в файле по смещению 0h. Следовательно, виртуальный адрес 2000СFh (по которому расположен наш злополучный условный переход) соответствует смещению 0СFh




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