Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

Обзор эксплойтов

Крис Касперски ака мыщъх

Хакер, номер #091, стр. 091-060-8


Всего-то и нужно, что заменить 67B8CF15: JL loc_67B8CF1C (7Ch 05h) на JB loc_67B8CF1C (72h 05h). Если бы файл был неупакован, то это можно было бы сделать прямо в hiew'е, а так... нет. Конечно, распаковать opera.dll вполне возможно, тем более что ASPack – упаковщик вполне известный, но не всегда распаковка проходит успешно, и потом начинают вылезать баги в разных местах.

Мы пойдем другим путем, прибегнув к on-line patch'у, то есть запустим opera.exe, дождемся распаковки opera.dll и исправим байты прямо в оперативной памяти! Аналогичный подход может быть применен и к другим программам, не только к Опере, поэтому ниже приводится исходный текст простейшего универсального on-line patсher'а.

Листинг 9: исходный текст on-line patcher'a opera_loader.c

#include <stdio.h>

#include <windows.h>

#define MAX_SIZE 16 // длина буфера для патча

main(int argc, char **argv)

{

// объявляем переменные

STARTUPINFO si; PROCESS_INFORMATION pi; DWORD N,FL;

// имя исполняемого файла для запуска

unsigned char name[]="opera.exe";

unsigned char buf[MAX_SIZE];

// указываем что и где мы будем патчить

unsigned char jmp_from[] = "\x7Ch\x05h"; // old

unsigned char jmp_to[] = "\x72\x90"; // new

void* jmp_off = (void*)0x67B8CF1C;// address

printf("loading & patching...\n");

// инициализация всех структур данных

si.cb = sizeof(si); memset(&si,0,sizeof(si)); memset(buf,0,MAX_SIZE);

// запускаем оперу на выполнение, для простоты не передавая

// ей аргументы командой строки

CreateProcess(0, name, 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi);

// ждем 1 сек, в течение которой opera.dll должна загрузиться и распаковаться

// возможно, на медленных ЦП это значение придется увеличить

Sleep(1000);

// проверка версии оперы перед патчем

ReadProcessMemory(pi.hProcess, jmp_off, buf, strlen(jmp_from), &N);

if (N != strlen(jmp_from)){printf("-ERR:reading memory\x7\n"); return -1;}

if (strcmp(jmp_from,buf)){printf("-ERR:incorrect version!\x7\n");return -1;}

// падчим условный знаковый переход JL на беззнаковый JB

WriteProcessMemory(pi.hProcess, jmp_off, jmp_to, strlen(jmp_to), &N);

if (N != strlen(jmp_to)){printf("-ERR:writing memory\x7\n");return -1;}

// говорим ОК и сваливаем

printf("OK\nall ok \n");

}

Естественно, теперь каждый раз придется запускать не opera.exe, а opera_loader.exe. Впрочем, чтобы не напрягаться, достаточно всего лишь сменить ярлыки и файловые ассоциации. Правда, в силу небольшой конструктивной недоработки on-line patcher'а он не передает Опере аргументы командой строки, поэтому если она установлена основным браузером по умолчанию, то htm-файлы открываться не будут! Используйте drag-n-drop или доработайте patcher «напильником» до законченной конструкции.

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

Назад на стр. 091-060-7  Содержание