Джойнинг посредством OllyDbg

Тема в разделе "Статьи", создана пользователем KaeraK, 22 дек 2011.

  1. KaeraK
    KaeraK Guest
    Джойнинг посредством OllyDbg​

    В сегодняшней моей статье, пойдет разговор о том, как можно бинарный текст одного приложения правильно «склеить» с бинарным текстом другого, и при этом не потерять работоспособности «склейки».
    Дабы не запутатся что и как, я использую следующие термины:
    • «гостевое приложение» (любой произвольный код, в моем случае программа, которая выводит на екран сообщение);
    • «родительское приложение» (пациент, которого мы будем оперировать);

    Ну что, приступим? ;)

    Порядок действий:
    • Подготовка и анализ гостевого приложения.
    • Импорт необходимых функций в родительское приложение.
    • "Склеивание" приложений.

    Что нам понадобится:
    • CFF Explorer
    • OllyDbg
    • PETools
    • Гостевое приложение (MessageBox)
    • Родительское приложение (выбрал программу PasswordProtecter от Vazonez :))

    Подготовка и анализ гостевого приложения.​

    В качестве подопытного, я выбрал пример из Examples компилятора FASM, со следующим кодом:

    Код:
    include 'win32ax.inc'
    .code
      start:
    	invoke	MessageBox,HWND_DESKTOP,"Hello world!)",invoke GetCommandLine,MB_OK
    	invoke	ExitProcess,0
    .end start
    Что делает? При запуске показывает сообщение "Hello world!)", и при нажатии на кнопочку "Ok" закрывается))
    Мы его скомпилировали, и получили бинарник размером ~2 килобайт. Загоняем его в OllyDbg:

    [​IMG]​

    Так-с, теперь нам необходимо узнать, какие функции использует приложение (собственно их и так видно, но мы "уточним"): жмем правой клавишей Search for => All intermodular calls, видим три функции..

    [​IMG]​

    ..из которых нам нужны только GetCommandLineA и MessageBoxA. ExitProcess нам не нужна (если ее использовать, то после нажатия на кнопку "Ок", будет завершатся и родительское приложение).
    Пока отладчик можем закрыть!

    Импорт необходимых функций в родительское приложение. ​

    Открываем наше родительское приложение (PasswordProtecter) в CFF Explorer, и в левой колонке выбираем Import Adder (для импорта необходимо знать, в каких dll находятся функции, Вы же в "Оле" их запомнили?) нет? ну тогда вот подсказка: GetCommandLineA в kernel32.dll, а MessageBoxA в user32.dll)
    Жмем Add и добавляем dll, выбираем нужные функции, и нажимаем Import By Name, по завершению - Rebuild Import Table

    [​IMG]​

    Переходим во вкладку Import Directory и запоминаем значения FTs(IAT)

    [​IMG]​

    kernel32 - 0008F187
    user32 - 0008F1A8

    Сохраняем файл..

    Грузим программу в PETools, и смотрим ее Image Base..

    [​IMG]​

    ..у которого значение 00400000
    Маленькая часть этапа пройдена)
    Теперь нам необходимо "инициализировать" импортированные нами функции, делается это командой:

    Код:
    JMP DWORD PTR DS:[******]
    ..где ****** = ImageBase + FTs(IAT), тоесть:

    GetCommandLineA = JMP DWORD PTR DS:[0048F187]
    MessageBoxA = JMP DWORD PTR DS:[0048F1A8]

    Загружаем родительское приложение в "Олю", вводим команды, жмем Ctrl+A, и если ничего не "побилось", у Вас должно все выглядеть следующим образом:

    [​IMG]​

    Copy to executable => All modofications => Copy all, открылось новое окно, в нем правой клавишей Save file, сохранились, глотнули пивка, и идем дальше :)

    "Склеивание" приложений. ​

    Для удобства, рекомендую открыть и гостевое и родительское приложения (в OllyDbg) одновременно.
    Для начала, в родительском приложении, нам нужно скопировать первые строки от Entry Point (правая клавиша Copy => To clipboard, и куда-нибудь в блокнот)
    Код:
    0046C218 > $  55            PUSH EBP
    0046C219   .  8BEC          MOV EBP,ESP
    0046C21B   .  83C4 F0       ADD ESP,-10
    0046C21E   .  B8 60C04600   MOV EAX,Password.0046C060
    Далее выбираем строку, например, 0046C2AE, и в Entry Point пишем jmp 0046C2AE. Переходим в гостевое приложение, и копируем первые три строки..
    Код:
    00401000 > $  6A 00         PUSH 0
    00401002   .  FF15 68204000 CALL DWORD PTR DS:[<&KERNEL32.GetCommand>; [GetCommandLineA
    00401008   .  50            PUSH EAX
    ..и заносим в родительское приложение, НО, вторую строку (GetCommandLineA), ставим вызов на строчку, где мы ИНИЦИАЛИЗИРОВАЛИ эту функцию, тоесть CALL 0046C298

    [​IMG]​

    Далее выбираем следующее, и по выделенному правой клавишей Binary => Binary Copy

    [​IMG]​

    Переходим в родительское приложение, выделяем участок начиная с адреса 0046C2B6 (продолжаем) и Binary => Binary Paste

    [​IMG]​

    Теперь у нас осталась функция MessageBoxA, делаем CALL аналогично примеру с GetCommandLineA - CALL 0046C29F

    Теперь мы вводим скопированные строки от Entry Point, и делаем скачок, откуда нас "оторвало".. сделали? проверьте - Ctrl+A, если все на месте, то должно выглядеть приблизительно так:

    [​IMG]​

    Сохраняемся, и запускаем то что у нас вышло!))

    Эта статья, скорее всего, является материалом для тренировок, и закрепления навыков при работе с OllyDbg (импорт функций, копировать/вставить, jmp и пр.) Не забывайте УК, и помните, что взлом - это плохо! :pivo:​

    Все примеры можно скачать отсюда.
    Пароль на архив: xaker.name

    © KaeraK и Xaker.Name​
     
    Последнее редактирование модератором: 22 дек 2011
    22 дек 2011
    2 пользователям это понравилось.
  2. BloodWolf
    BloodWolf Новичок
    Симпатии:
    0
    перезалейте плз )
     
    29 май 2012
Загрузка...