Введение в крэкинг с нуля, используя OllyDbg - Глава 38

  • На форуме работает ручное одобрение пользователей. Это значит, что, если Ваша причина регистрации не соответствует тематике форума, а также Вы используете временную почту, Ваша учётная запись будет отклонена без возможности повторной регистрации. В дальнейшем - пожизненная блокировка обоих аккаунтов за создание мультиаккаунта.
  • Мы обновили Tor зеркало до v3!
    Для входа используйте следующий url: darkv3nw2...bzad.onion/
  • Мы вновь вернули telegram чат форуму, вступайте, общайтесь, задавайте любые вопросы как администрации, так и пользователям!
    Ссылка: https://t.me/chat_dark_time

AnGel

Администратор
Команда форума

AnGel

Администратор
Команда форума
27 Авг 2015
3,411
2,025
В предыдущей главе мы рассмотрели одну из программ с переадресовочными элементами и как её починить, а теперь продолжаем, плавно повышая уровень сложность упаковщиков, сопровождая это практическими упражнениями.

У нас есть распакуй-меня, упакованная Yoda Crypter 1.3, на котором мы будем практиковаться, разумеется, OllyDbg должен быть с установленными плагинами, необходимыми для борьбы с обнаружением и антиотладкой.

Находимся в точке входа.

45b410f69e0c94179c515310fb5ea79d.png

Сработает ли PUSHAD? Попробуем этот метод. С помощью трассировки идём досюда и проходим PUSHAD с помощью F7.

Делаем ESP-FOLLOW IN DUMP, а затем отмечаем первые 4 байта как в прошлые разы и устанавливаем HARDWARE BPX ON ACCESS.

8197119beb1571e43249fea06d4513ac.png

aa58140578878bb38a90207de68d776e.png

Видим процедуру, создающая обработчик исключений, а затем как совершается переход с помощью JMP в область, заполненную нулями, чтобы вызвать ошибку, так что если оттрассируем и дойдём до JMP:

df84c2ac0a6889767675c045cb962a53.png

Здесь мы перейдём на ошибку, посмотрим, куда перейдём в обработчике исключений.

b94f7d572b7beecaa5c1d203db5942e6.png

fcee4c52b9dada8c46adf2a9b0b09d00.png

Тот, что в 46590B не сильно усложняет жизнь и приведёт в OEP, здесь мы можем установить BPM ON ACCESS на первую секцию и при проходе через исключение окажемся в OEP.

bda7f27418d26833481cdc1385529c5d.png

5fbdab2f07ba0ee1eb1501264863ebc9.png

OEP равна 4271B0, так как запакован тот же самый крэкми, хе-хе.

9b443ff2908419925e78775ed558c27c.png

Те, кто хочет лучше исследовать этот вопрос, могут посмотреть, как обработчик исключений манипулирует контекстом для изменения EIP. Адрес исключения (т.е. где происходит исключение), обычно равный 465982, перезаписывается адрес OEP (т.е. 4271B0) для того, чтобы вернуться из исключения напрямую в OEP, хотя сейчас это не так важно. Выходим, отметив на будущее, что происходит со структурой CONTEXT.

Ок, вопрос заключается в том, находимся ли мы уже в OEP, делаем дамп.

763df4540fbf65f3cc60abe5f6af82bc.png

989f3e12ee90cce59166d6579bdcecdc.png

Снимаем галочку, так как не собираемся чинить IAT и делаем дамп.

e89a685fce054cc2145a97f5b77fb705.png

Конечно, если запустить yodadump.exe, то нам отобразится ошибка. Нам очень повезёт, если она запустится хотя бы на нашей машине, но мы уже видели, что в IAT’е есть переадресовочные элементы, которые точно не сработают при попытке получить доступ к этим несуществующим адресам через дамп.

Ладно, начнём анализировать IAT, ищем вызов API-функции, это будет GetVersion, как обычно, хе-хе.

0814446833a13e9a407e9a46d3b31a81.png

Итак, видим, что указанный вызов имеет значение 460ADC, и для того, что увидеть, куда он переходит, то есть какой элемент IAT ему соответствует, идём в DUMP.

9bce1f18b058dfaab4e6eb7465dc674c.png

Так, эта часть IAT выглядит как правильная, так как если посмотрим на карту памяти, куда ведут элементы, они все относятся к 7C8XXXXX или нулям, и эти адреса располагаются в секции кода kernel32.dll, то есть данные элементы являются правильными.

f2160a145d61a1381acec7071dbba3ac.png

Однако если поищем ссылки на какой-нибудь из них наугад – щелчок правой кнопкой мыши – FIND REFERENCES – и вот ссылки:

de499333baef7416a225d760d3e82f04.png

Если продолжим спускаться до разделения:

3b0aba674ce32b90d445f60a75e6ed32.png

Видим, что следующая группа ведёт в область памяти 15XXXX, посмотрим, что там:

da7855e8f376f3dbe71fc5b35f4fc609.png

Видим секцию, которая не в DLL, так что она точно создана упаковщиком. Перезапустим распакуй-меня, чтобы проверить это.

2845836dfaa6a541fa96c53e9cdf6ecf.png

Видим, что есть секция, созданная системой, размером в 3000 байтов, но та, которую использует упаковщик гораздо больше и равна 29000 байта, так что упаковщик увеличил эту секцию для собственного использования.

Поэтому это элементы, переадресующие упаковщиком в данную секцию, посмотрим один из них, что он из себя представляет и как с ним работать.

6167b9adecb305ec4a8546e9b99cd8b7.png

Возьмём один из них, например этот, и поищем ссылки на него. Щелчок правой кнопкой мыши и FIND REFERENCES.

eb70668308a8f3ca2df58854a5633342.png

Есть два вызова, которые принимают значение данного элемента, посмотрим первый, делаем двойной щелчок на нём и попадаем в то место в листинге, где находится этот вызов.

20dd253724550306916728739be27179.png

Видим вызов, делаем щелчок правой кнопкой мыши, а затем выбираем FOLLOW, чтобы увидеть, что происходит в переадресовочной секции.

8a546e84d381c7431fd0fec01c340804.png

Видим, что без особых заморочек напрямую прыгаем на API-функцию SysStringLen, поэтому если будем трассировать вручную, то уже знаем, что это правильная функция для данного элемента.

Видим, что переадресация очень простая, сможет ли IMP REC починить её с помощью своих трассировщиков, чтобы не надо было искать волшебный переход?

Открываем IMP REC.

d6314907fb1f1b9146d229e299f291be.png

Вот процесс, остановленный на OEP; выбираем его в выпадающем меню.

Не забываем, что нужно задать IMP REC’у три значения: OEP, НАЧАЛО IAT и РАЗМЕР.

OEP=4271B0, из чего вычитаем базу образа, остаётся 271B0.

Начало IAT, если спустимся ниже:

7999ac17d6a29228194640e1ac8dbb08.png

Видим, что элементы IAT ведут или в секции кода DLL или в секцию 15XXXX.

3476e84b6b6f9e886fad063a705bb2fc.png

Смотрим до тех пор, пока схема повторяется. Если выше поискать ссылки на предмет, есть ли в IAT ещё элементы, ничего не находим.

4d91d1580e020687329ec59a2e175533.png

83e1b3914697efdff01bc63d4af24bc2.png

Поэтому первый элемент IAT – это 460818, для IMP REC’а RVA=60818, если отнять базу образа.

Конец IAT находим таким же образом, спускаемся ниже, чтобы найти, где кончается закономерность, проявляющаяся в том, что элементы ведут или в секции кода DLL или в секцию 15XXXX.

53265a56ca49feb553486710bad92fdb.png

Здесь видим последний элементы IAT, находящийся по адресу 460f24, и если ниже поищем ссылки, то не найдём ни для какого элемента, так что в качестве конца IAT задаём 460F28. Теперь нужно найти её размер.

РАЗМЕР = КОНЕЦ - НАЧАЛО = 460f28 - 460818 = 710

63c59257a28622eaf82b6dc3ebfbbd36.png

Так что задаём:



OEP=271B0
RVA или НАЧАЛО=60818
SIZE или РАЗМЕР=710
Забиваем эти значения в IMP REC.

889026e44b997781ed643886fc86156d.png

По нажатию на GET IMPORTS:

2379ee4f873fb72eaed7fde95ca63c6e.png

Видим, что есть 296 необработанных элементов, получится ли исправить их с помощью одного из встроенных трассировщиков?

Если нажмём на кнопку AUTO TRACE, программа повиснет. Пробуем с другими трассировщиками. Нажимаем SHOW INVALIDS и на отмеченных элементах делаем щелчок правой кнопкой мыши и выбираем “TRACE LEVEL 1”.

8febf9894f5ff8297a52cbdd3cd249f3.png

7e14d28503f6fad7a77bae7149815b00.png



Говорит, что всё исправлено и неправильных элементов больше нет, поверим ему? Хе-хе. Если снова нажмём “SHOW INVALID”, то увидим, что всё помечено как YES.

b7716fe3aa95e602da1d6722a50c14ed.png

Пробуем починить yodadump.exe, нажимаем “FIX DUMP”.

99956b5cd8e367bb2a8c242a97d64ece.png

Думаю, что yodadump_.exe починен, попробуем запустить его.

705319191c44df7dd56bdaf561cf37c8.png

Хе-хе, в этот раз IMP REC показал себя и сэкономил мне много времени и сил.

А теперь слегка напряжёмся и посмотрим, есть ли волшебный переход у этого упаковщика?

Ищем плохой элемент IAT остановленной на OEP программы.

d37e159a486a082e812c40bd75633030.png

Устанавливаем на него HARDWARE BPX ON WRITE до рестарта программы, так как HBP остаются даже после этого, и как мы уже видели при использовании метода PUSHAD, упаковщик не реагирует на этот вид остановов.

dff2853b59699738721f8a537b76978e.png

Очевидно, что метод заключается в том, чтобы остановиться, когда в элемент сохраняется плохое значение 15XXXX. Делаем рестарт и нажимаем RUN.

8291bcb51848e38bb61e84dbeefc65f8.png

Останавливаемся здесь и сохраняем хорошее значение в элемент IAT. Видим, что EAX содержит значение API-функции.

0b5f758c097abada627aceaf4698aef8.png

И значение сохраняется в элемент, на который указывает EDX, и это значит, что в данном случае сначала сохраняется хорошее значение, а потом меняется на плохое. Продолжает трассировать, чтобы увидеть, где это происходит.

e656e7782193b2bef9457cba7714624b.png

Видим, что всего лишь несколькими строками ниже ESI принимает плохое значение, и готовится к загрузке его в элемент.

11c759b818002b2c1b7522e413cb217e.png

Это означает, что хорошие элементы получают значение только в первый раз, но не во второй, когда элемент перезаписывается плохим значением.

Повторяем процесс с хорошим элементом, связанным с GetVersion и находящимся несколько строки ниже OEP. Используем его и установим HBP ON WRITE.

32806c221e5dee286e4aa185f56fcf8b.png

Останавливаемся здесь при сохранении правильного адреса, находящегося в EAX.

191854abadcb41a7c17e1665a9df030e.png

Немного потрассируем.

d839fbfe96b9c3fd0eab9e371610150e.png

Видим, что оказались на JMP, который перепрыгивает через отмеченную красной стрелкой область, где содержимое элемента меняется на плохое значение, так что суть заключается в том, срабатывает или нет этот JMP или нет, предыдущие переходы, избегавшие этого JMP и есть волшебные переходы, посмотрим, были ли до JMP какие-то условные переходы.

Мы также можем попытаться забить NOP’ами строку, где сохраняется плохое значение, так чтобы этого не происходило, и это будет нормальным решением, попробуем, сработает ли это.

c944f14981e7e54a361728f59f3eb8d7.png

Отмечаем строку, где сохраняется плохое значение, и устанавливаем HBP ON EXECUTION, рестартуем и останавливаемся здесь в первый раз. Установили HBP на предыдущую строку, так как нам не нужно, чтобы плохое значение сохранилось.

4ab975435a203fef99908995b98439d9.png

Остановились тут, попробуем забить NOP’ами строку, где сохраняется плохое значение.

6a852c771e37c1dff1220b1292c67439.png

Продолжаем, чтобы узнать, определиться ли сделанная нами забивка, и оказываемся в OEP.

92478b6b3ce0142cc12c06176558b157.png

Снимаем HBP и делаем RUN.

ccf7c5005309101287795393047e6bf9.png

Да, чёртов упаковщик определил, что произошли изменения и выдал ошибку, так что забивка NOP’ами не годится, продолжаем работать с волшебным переходом.

06b57295d406ae706f9892a5cacefc1e.png

Оттрасировав какой-нибудь плохой элемент, смотрим, является ли он волшебным, т.е. избегает ли вышеуказанного JMP, чтобы оказаться в области, где происходит сохранение плохого значения, и попробуем забить его NOP’ами, хотя сомневаюсь, что упаковщик не обнаружит забивки. Пробуем.

68384fad3945d67c20128c73a59f21e2.png

Программа и в этом случае выдаёт нам ошибку, но уже после починки таблицы.

bc038c59cb0e1b80f6980087049b06bd.png

Видим, что IAT – правильная, так что с ней проблем нет. У нас есть две возможности. Одна – открыть другую копию крэкми в другом экземпляре OllyDbg и, ничего не меняя, остановится на OEP и скопировать правильную таблицу поверх плохой с помощью BYNARY COPY и BINARY PASTE, что проще всего. Также можно использовать напрямую этот процесс для IMP REC’а, так как хотя мы не прибыли в OEP, у нас есть правильная IAT, и это то, с чем работает IMP REC, остальное неважно, так что можем открыть процесс в IMP REC’е, установить правильные значения OEP, RVA и SIZE и нажать GET IMPORTS.

aae83d8268ffce90ab577dc552c0cbe0.png

Видим, что IMP REC признал все значения правильными, и хотя остановленный процесс не служил в качестве источника для дампа, так как мы не дошли до OEP, это неважно, так как крэкми был сдамплен раньше, используя процесс, остановленный на OEP, и единственное, что в этом дампе неправильно – это IAT, которую мы можем починить, и всё будет будет работать. Нам нужно стереть предыдущий yodadump_.exe, который уже починен, и поискать дамп yodadump.exe и нажать “Fix Dump”, и он починится.

beb4e9a9bb00af924f25f37a82688bc4.png

Создан новый yodadump_.exe, смотрим, работает ли он.

82eafa8aaf38302b821d24504662c0b3.png

Если работает нормально, то это значит, что мы теперь знаем: дамп необходимо делать из OEP, так как именно тогда вся программа уже распакована в памяти, но таблицу можно брать, когда она уже заполнена правильными значениями, хотя бы мы ещё и не были в OEP, потому что IMP REC ничего не меняет в дампе, кроме IAT, которая берётся правильная, так что дамп прекрасно работает.

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

Пожалуйста, Вход или Регистрация для просмотра содержимого URL-адресов!
 

О нас

  • Наше сообщество существует уже много лет и гордится тем, что предлагает непредвзятое, критическое обсуждение различных тем среди людей разных слоев общества. Мы работаем каждый день, чтобы убедиться, что наше сообщество является одним из лучших.

    Dark-Time 2015 - 2022

    При поддержке: XenForo.Info

Быстрая навигация

Меню пользователя