Crackme Открыть

Jan 07 2023
Руководство для начинающих по взлому файлов, защищенных паролем
Приготовьтесь к хакерскому веселью! В этом сообщении блога мы покажем вам, как взломать простой исполняемый файл C, защищенный паролем, с помощью Ubuntu 20.04 LTS.
ПК: IEEE Spectrum

Приготовьтесь к хакерскому веселью! В этом сообщении блога мы покажем вам, как взломать простой исполняемый файл C, защищенный паролем, с помощью Ubuntu 20.04 LTS. Являетесь ли вы новичком или опытным профессионалом, в этом руководстве каждый найдет что-то для себя. Время согнуть эти кибер-навыки!

Все файлы, используемые в этом туториале, можно найти на GitHub здесь . Вы можете клонировать репозиторий в свою локальную среду, чтобы получить доступ к зашифрованным файлам.

Для начала мы можем запустить crackmeфайл, чтобы наблюдать за его поведением, перейдя в каталог Crackme и введя следующую команду:

$ ./crackme

Access Denied

Команда fileиспользуется для определения типа файла. Он делает это, выполняя серию тестов в определенном порядке: тесты файловой системы , тесты магических чисел и языковые тесты .

ПК: Здесь

Эти тесты предназначены для определения типа файла на основе его содержимого и любых связанных с ним метаданных. Если вы хотите использовать fileкоманду для определения типа определенного файла, вы можете сделать это, запустив ее file [filename]в своем терминале. Например:

$ file crackme

crackme: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=e06e0b0229279a69506925702a7f79e36bdc3eb2, not stripped

  1. Исполняемый файл, предназначенный для запуска в 64-разрядной операционной системе Linux.
  2. Скомпилировано для архитектуры x86–64 и динамически связано, что означает, что для работы используются общие библиотеки.
  3. Интерпретируется интерпретатором /lib64/ld-linux-x86–64.so.2.
  4. Создан для GNU/Linux 2.6.24 и имеет уникальный идентификатор, называемый «BuildID».
  5. Не был удален, поэтому он все еще содержит отладочную информацию и символы, которые можно использовать для анализа.

Также стоит отметить, что ltraceего можно использовать в сочетании с другими инструментами, такими как gdb( GNU Debugger ), для дальнейшего анализа поведения программы и, возможно, обратного проектирования, которое мы не будем использовать в этом руководстве.

Мы можем запустить ltraceфайл crack me, введя следующую команду:

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7ffeef764458, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "Passw0rd=", 9)                                                                                     = -12
strncmp("SSH_TTY=/dev/pts/0", "Passw0rd=", 9)                                                                                                      = 3
strncmp("OLDPWD=/home/vagrant/crackme_tut"..., "Passw0rd=", 9)                                                                                     = -1
strncmp("_=/usr/bin/ltrace", "Passw0rd=", 9)                                                                                                       = 15
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: ALX

  1. __libc_start_mainэто функция, которая настраивает среду программы и вызывает ее основную функцию. Он принимает различные аргументы и предоставляется стандартной библиотекой C ( libc ). Она вызывается основной функцией точки входа программы.
  2. Строки, начинающиеся с strncmp, показывают, что программа вызывает strncmpфункцию, которая сравнивает заданное количество символов (в данном случае 9 символов) двух строк. Сравниваемые строки представляют собой различные переменные среды (например, «SHELL», «PWD», «LOGNAME» и т. д.) и строку "Passw0rd=". Похоже, программа проверяет, не начинаются ли какие-либо переменные окружения со строки "Passw0rd=".
  3. Функция putsвызывается в конце со строкой « Отказано в доступе », что может указывать на то, что программа печатает это сообщение, если ни одна из переменных окружения не начинается с "Passw0rd=".

Чтобы установить переменную среды в Linux, мы можем использовать exportкоманду в терминале. Например, чтобы установить переменную среды с именем Passw0rdв значение test, мы можем запустить:

export Passw0rd=test

$ ltrace ./crackme

__libc_start_main(0x40087d, 1, 0x7fff085f1d38, 0x400a70 <unfinished ...>
strncmp("SHELL=/bin/bash", "Passw0rd=", 9)                                                                                                         = 3
strncmp("PWD=/home/vagrant/crackme_tutori"..., "Passw0rd=", 9)                                                                                     = -10
strncmp("LOGNAME=vagrant", "Passw0rd=", 9)                                                                                                         = -4
strncmp("XDG_SESSION_TYPE=tty", "Passw0rd=", 9)                                                                                                    = 8
strncmp("MOTD_SHOWN=pam", "Passw0rd=", 9)                                                                                                          = -3
strncmp("HOME=/home/vagrant", "Passw0rd=", 9)                                                                                                      = -8
strncmp("LANG=C.UTF-8", "Passw0rd=", 9)                                                                                                            = -4
strncmp("LS_COLORS=rs=0:di=01;34:ln=01;36"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("SSH_CONNECTION=10.0.2.2 61015 10"..., "Passw0rd=", 9)                                                                                     = 3
strncmp("LESSCLOSE=/usr/bin/lesspipe %s %"..., "Passw0rd=", 9)                                                                                     = -4
strncmp("XDG_SESSION_CLASS=user", "Passw0rd=", 9)                                                                                                  = 8
strncmp("TERM=xterm-256color", "Passw0rd=", 9)                                                                                                     = 4
strncmp("LESSOPEN=| /usr/bin/lesspipe %s", "Passw0rd=", 9)                                                                                         = -4
strncmp("USER=vagrant", "Passw0rd=", 9)                                                                                                            = 5
strncmp("SHLVL=1", "Passw0rd=", 9)                                                                                                                 = 3
strncmp("XDG_SESSION_ID=22", "Passw0rd=", 9)                                                                                                       = 8
strncmp("XDG_RUNTIME_DIR=/run/user/1000", "Passw0rd=", 9)                                                                                          = 8
strncmp("SSH_CLIENT=10.0.2.2 61015 22", "Passw0rd=", 9)                                                                                            = 3
strncmp("XDG_DATA_DIRS=/usr/local/share:/"..., "Passw0rd=", 9)                                                                                     = 8
strncmp("PATH=/usr/local/sbin:/usr/local/"..., "Passw0rd=", 9)                                                                                     = -32
strncmp("Passw0rd=test", "Passw0rd=", 9)                                                                                                           = 0
MD5_Init(0x7fff085f1b90, 0x400b06, 9, 6)                                                                                                           = 1
strlen("test")                                                                                                                                     = 4
MD5_Update(0x7fff085f1b90, 0x7fff085f2f68, 4, 0x7fff085f2f68)                                                                                      = 1
MD5_Final(0x7fff085f1bf0, 0x7fff085f1b90, 0x7fff085f1b90, 0)                                                                                       = 1
sprintf("09", "%02x", 0x9)                                                                                                                         = 2
sprintf("8f", "%02x", 0x8f)                                                                                                                        = 2
sprintf("6b", "%02x", 0x6b)                                                                                                                        = 2
sprintf("cd", "%02x", 0xcd)                                                                                                                        = 2
sprintf("46", "%02x", 0x46)                                                                                                                        = 2
sprintf("21", "%02x", 0x21)                                                                                                                        = 2
sprintf("d3", "%02x", 0xd3)                                                                                                                        = 2
sprintf("73", "%02x", 0x73)                                                                                                                        = 2
sprintf("ca", "%02x", 0xca)                                                                                                                        = 2
sprintf("de", "%02x", 0xde)                                                                                                                        = 2
sprintf("4e", "%02x", 0x4e)                                                                                                                        = 2
sprintf("83", "%02x", 0x83)                                                                                                                        = 2
sprintf("26", "%02x", 0x26)                                                                                                                        = 2
sprintf("27", "%02x", 0x27)                                                                                                                        = 2
sprintf("b4", "%02x", 0xb4)                                                                                                                        = 2
sprintf("f6", "%02x", 0xf6)                                                                                                                        = 2
strcmp("c4032d9e95a93d91b9b595dcfcca640b"..., "098f6bcd4621d373cade4e832627b4f6"...)                                                               = 51
puts("Access Denied"Access Denied
)                                                                                                                              = 14
+++ exited (status 1) +++

      
                
PC: Here

  1. Мы уже знаем, что первая строка показывает, что __libc_start_mainфункция была вызвана с четырьмя аргументами: адрес основной функции, количество аргументов программы, указатель на массив аргументов программы и указатель на функцию, которая должна быть вызвана, когда основная функция возвращается.
  2. Следующие строки показывают серию вызовов strncmpфункции, которая сравнивает две строки и возвращает целое число, указывающее их лексикографический порядок. Похоже, что программа пытается сравнить каждую переменную окружения в системе со строкой "Passw0rd=".
  3. После этого следуют вызовы функций MD5_Init, MD5_Updateи MD5_Final, которые являются частью криптографической хеш-функции MD5. Похоже, программа вычисляет хэш MD5 значения переменной окружения Passw0rd.
  4. Далее идут вызовы sprintfфункции, которая форматирует строку и сохраняет ее в буфере. Похоже, что программа форматирует байты хеша MD5 как шестнадцатеричные значения и сохраняет их в виде строк.
  5. Вывод включает в себя вызов strcmpфункции с двумя строками в качестве аргументов: "c4032d9e95a93d91b9b595dcfcca640b" и "098f6bcd4621d373cade4e832627b4f6". Это указывает на то, что программа сравнивает хэш MD5 пароля с хэшем переменной среды Passw0rd, которая была экспортирована.
  6. Функция putsвызывается в конце со строкой «Отказано в доступе», что указывает на неверный пароль. Однако это, вероятно, будет решено в ближайшее время.

Мы можем использовать этот веб-сайт, чтобы преобразовать хешированные строки в их значения.

Источник: Центр MD5

Теперь, когда мы определили, что хешированный пароль — LionelMessi , мы можем установить Passw0rdпеременную среды в это значение и повторно запустить ltraceкоманду, чтобы увидеть, дает ли она другой результат. Давайте попробуем!

$ export Passw0rd=LionelMessi
$ ./crackme
Access Granted

ПК: здесь

Всегда важно помнить об использовании надежных уникальных паролей и никогда не использовать их повторно для разных учетных записей.

Следите за нашим предстоящим выпуском на GitHub программы C, которая сравнивает хэши MD5 со словарем и преобразует их в исходную строковую форму. Следите за обновлениями!

Мы надеемся, что вам понравился этот урок по взлому простого файла. Если у вас есть какие-либо комментарии или вопросы, пожалуйста, не стесняйтесь оставлять их в разделе комментариев ниже. Удачного взлома!