Во-первых, я должен поблагодарить woitheuk за этот обратный вызов, потому что мне удалось решить его, только сославшись на его статью. В этой статье я продемонстрирую, как написать простой ассемблерный код для перебора флага из двоичного файла, поскольку в предыдущей статье не упоминались шаги для подробной реализации кода. Это было очень интересное решение, так как менее вероятно, что люди решат обратную задачу, написав ассемблерный код и выполнив его непосредственно внутри двоичного файла.
Рассматриваемые темы
- Напишите код простого перебора на ассемблере на x32 dbg
- Права доступа к памяти на x32 dbg
Описания
- Найдите место для хранения печатных символов в сегменте
.data
. - Найдите место для хранения количества индексов в сегменте
.data
.
Для того, чтобы найти правильный сегмент для вставки значения, перейдите в раздел карты памяти и найдите сегмент данных с Защитой «RW».
Права на запись в память позволяют перезаписывать код, к которому может получить доступ инструкция кода. В противном случае в процессе отладки будет EXCEPTION_ACCESS_VIOLATION.
В этой статье я просто буду хранить все эти объявленные пользователем значения по адресу дампа памяти с защитой Writeable
, который в данном случае является сегментом .data
. Есть способ изменить права памяти в карте памяти по Right-click the highlighted address > Set Page Memory Rights > Select All > FULL ACCESS > Set Rights
.
Проверьте дамп сегмента .data
и определите место для хранения количества индексов и печатных символов. Затем перейдите к memory dump section
и Right click > Binary > Edit
.
После этого запомните адреса, которые использовались в качестве индекса, и строки.
я. Адрес для подсчета индексов = 0x00103020
ii. Адрес для строкового массива = 0x00103030
Давайте посмотрим на код, чтобы понять, как он работает.
По адресу 0x00101060 пользовательский ввод будет передаваться в регистр bl для дальнейшей обработки и проверки правильности ввода. Jp (четность перехода) выполнит проверку правильности пароля. Инструкция cmp по адресу 0x001010AE повлияет на вывод двоичного файла, поскольку cmovne (условное перемещение не равно) работает только в том случае, если выполнение инструкции по адресу 0x001010AE делает zf=0.
Теперь пришло время написать скрипт грубой силы в ассемблерном коде.
Необходимо будет выполнить две части кода:
1. Модификация инструкции перехода на конкретный адрес.
2. Новый раздел кода для итерации строк.
Проверьте раздел комментариев с правой стороны изображения для описания кода.
Он начинается с присвоения 0 адресу счетчика индексов (0x00103020). Все назначения инструкции jp меняются на начальный адрес раздела итерации строки (0x001010D6), так как, когда значение становится неправильным, он переходит к следующему символу в массиве строк и снова проверяется.
Что касается кодирования итераций строк, я прокомментировал написанный код, который кратко объясняет, как это работает на языке более высокого уровня.
Поместите точку останова по адресу 0x001010A7 и нажмите F9, чтобы она продолжала работать, пока не достигнет точки останова. Проверьте дамп памяти регистра ESI, чтобы получить флаг.