RU | 'ELF x86 - CrackPass' from root-me.org
Давайте начнем издалека, для начала узнаем больше информации о файле, запустим его, посмотрим что он хочет от нас и заодно проверим строки:
Возьмем на заметку что пароль передается через аргумент командной строки, и что файл динамически слинкован, но отладочные символы потёрты, это заруднит наш анализ. Теперь перейдем к строкам и внимательно их изучим:
Красным цветом выделены особо важные строки для нашего анализа. “ptrace” и “Dont use a Debuguer!” говорят сами за себя, а “THEPASSW0RDISEASYTOCRACK” выглядит как ключ к алгоритму шифрования, его мы тоже возьмем на заметку.
Теперь можно перейти к статическому анализу кода. Открываем дизассемблер и поскольку из файла удалены отладочные символы, нам нужно найти функцию main. С этим проблем не возникнет, ибо адрес функции передается первым параметром в функцию libc_start_main. Можно пойти и другим путём, через вкладку Defined Strings найти любую константу и посмотреть в какой функции она используется. Сделаем немного понятнее функцию, изменим имена переменных и взглянем на нее:
Ничего нового мы отсюда не узнаем, программа проверяет используется ли отладчик и передается ли пользователем пароль через командную строку. В самом конце видим функцию с единственным аргументом, и этот аргумент - введенный пользователем пароль. Давайте опять сделаем ее более читабельной и перейдем к ней:
После того как мы посмотрели на эту функцию, и еще на две других внутри неё (FUN_0804851c, FUN_080484f4), разобрали алгоритмы, поковырялись в носу, желание чето дальше делать после увиденного отпало, поэтому будем патчить и дебажить. Нужно поставить бряк на функции strcmp (я отметил её красным цветом) либо использовать ltrace, предварительно пропатчив проверку отладки. Я буду это делать через гидру.
Находим условный прыжок в функции main - JNS, жмем ПКМ->Patch Instruction/Ctrl+Shift+G и меняем на JMP.
Далее, File->Export, выбираем директорию и формат ELF/Original File. Я сохраню файл под названием Crack1.
После сохранения, воспользуемся ltrace, поскольку strcmp - библиотечная функция. Вводим ltrace ./Crack1 123 и листаем в самый низ:
Смотрим на аргументы strcmp и первый - искомый пароль. Проверяем: