Содержание статьи
Упражняться мы будем на crackme, которую я написал специально для демонстрации. Скачать файл ты можешь с моего GitHub. Все действия мы будем проводить в Debian Linux.
В статье «Radare2 с самого начала. Учимся использовать опенсорсный фреймворк для анализа приложений в Linux» мы уже начали исследовать этот исполняемый файл. При запуске он открывает сокет и начинает слушать порт 14884. Если подключиться к этому сокету при помощи netcat, то можно увидеть приглашение для ввода имени пользователя или пароля. Если ввести неверный пароль, сеанс завершится.
Используя основные возможности Radare2, мы выявили в программе функции main, authenticate, check_username, check_password, start_server и несколько других. В authenticate есть пять локальных переменных, а также вызов функции с говорящим названием check_username, которой в качестве единственного аргумента передается значение переменной fd.
Это краеугольная функция в защитном механизме, поскольку из нее вызываются некоторые другие весьма важные и не всегда относящиеся к процедуре логина функции. На очереди — извлечение пароля. Но даже когда мы раскусим защитный механизм, у нас будет возможность копать этот крякмис в глубину. Мы изменим его код, чтобы выполнение программы шло по той ветви, результаты выполнения которой нам нужны.
Распознание имени пользователя

В функции check_username дескриптор сокета, переданный в аргументе, помещается в переменную fildes. Далее с помощью библиотечной функции memset готовится буфер памяти: src заполняется нулями, затем в него с помощью функции read читается пользовательский ввод из сокета, на который указывает fildes. То есть читается как бы с удаленного устройства.
Дальше в консоль на стороне сервера функция printf выводит строку [, потом в нее же с помощью fputs выливается содержимое буфера src, содержащего введенное имя пользователя. Далее возвращенный функцией fputs результат сравнивается с -1. Если равенство верно, выводится сообщение об ошибке, если же возвращенное значение не равно -1 (ноль или положительное значение), то выполняется переход на строку 0x1605. Здесь происходит вывод символа конца строки — \.
После этого готовятся параметры для вызова библиотечной функции strcpy. Она копирует имя пользователя src в новую область памяти — dest. Далее в строке со смещением 0x1628 в переменную var_420h копируется значение 0x6262616a. В комментарии рядом Radare2 оставил метку, заключенную в одинарные кавычки, — jabb:
mov dword [var_420h], 0x6262616a ; 'jabb'
По мнению Radare2, это шестнадцатеричное число — набор букв в кодировке UTF-8, используемой в большинстве дистрибутивов Linux. Доверяй, но проверяй! В командную строку под дизассемблированным листингом функции введи
? 0x6262616a
Ниже появится список, в котором указанное значение будет конвертировано в разные типы данных.

Нас интересует тип string. Напротив него мы видим строку jabb, что и требовалось доказать.

Вернемся в функцию check_username. Строкой ниже (0x1632) мы видим, что в переменную var_21ch помещается символ a, пока непонятно для чего. Снова промотаем листинг к началу функции, где расположены комментарии о переменных:
...
; var int64_t var_41ch @ rbp-0x41c
; var int64_t var_420h @ rbp-0x420
...
Нас интересуют эти две переменные. Теперь посмотрим на код присвоения им значений:
mov dword [var_420h], 0x6262616a ; 'jabb'mov word [var_41ch], 0x61 ; 'a'Истина где‑то рядом. В UTF-8 символ может занимать от одного до четырех байтов, однако латинские символы, которые мы видим в листинге, никогда не превышают одного байта. Таким образом, значение 0x6262616a — это четыре байта, что подтверждает размер приемника — двойное слово, dword.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»

