• XSS.stack #1 – первый литературный журнал от юзеров форума

Возврат из шелл-кода на OEP

dobryakov

floppy-диск
Пользователь
Регистрация
15.09.2024
Сообщения
4
Реакции
0
Доброго всем времени!
Осваиваю немного внедрение в ПЕ файл своего кода.
Сам шелл-код генерируется одной из утилит типа DLL2ShellCode.
В своем коде я
Запоминаю значение старой точки входа OldEntryPoint = EntryPoint + ImageBase;
Добавляю новую секцию
Загружаю туда шеллкод
Меняю все необходимые поля заголовков и т.д.

В общем на тестовом примере все работает, но мне в конце нужно вернуть управление на OldEntryPoint

пытался сделать как то так(это сама длл, которая внедряется как шеллкод в целевой ПЕ):
C++:
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    DWORD64 rwx = 7083504; // это для теста жестко прошит адрес OEP
    FARPROC fp = (FARPROC)rwx;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        //OutputDebugStringA("DLL_PROCESS_ATTACH");
        MessageBoxA(0, "DllMain!", "", 0);
        fp(); // По идее тут должен вызваться код по OEP...
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

но это не работает(
Подозреваю, я что то глобально не допонимаю, но что?
подскажите, куда копать
 
Доброго всем времени!
Осваиваю немного внедрение в ПЕ файл своего кода.
Сам шелл-код генерируется одной из утилит типа DLL2ShellCode.
В своем коде я
Запоминаю значение старой точки входа OldEntryPoint = EntryPoint + ImageBase;
Добавляю новую секцию
Загружаю туда шеллкод
Меняю все необходимые поля заголовков и т.д.

В общем на тестовом примере все работает, но мне в конце нужно вернуть управление на OldEntryPoint

пытался сделать как то так(это сама длл, которая внедряется как шеллкод в целевой ПЕ):
C++:
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    DWORD64 rwx = 7083504; // это для теста жестко прошит адрес OEP
    FARPROC fp = (FARPROC)rwx;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        //OutputDebugStringA("DLL_PROCESS_ATTACH");
        MessageBoxA(0, "DllMain!", "", 0);
        fp(); // По идее тут должен вызваться код по OEP...
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

но это не работает(
Подозреваю, я что то глобально не допонимаю, но что?
подскажите, куда копать
Ты откуда берёшь вот это ImageBase значение? У тебя должно быть что-то типо такого:
C++:
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>


BOOL APIENTRY DllMain(HMODULE hModule,
    DWORD  ul_reason_for_call,
    LPVOID lpReserved
)
{
    HANDLE hParentPe = GetModuleHandle(NULL);
    PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)hParentPe;
    PIMAGE_NT_HEADERS64 pNt = (PIMAGE_NT_HEADERS64)((UINT_PTR)hParentPe + pDos->e_lfanew);
    FARPROC fp = (FARPROC)((UINT_PTR)hParentPe + pNt->OptionalHeader.AddressOfEntryPoint);
   ;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:


        MessageBoxA(0, "DllMain!", "", 0);
        fp();
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

На бинарнике с отключенным црт это даёт бесконечный луп:


C++:
unsigned char b1[] = { //shellcode };

DWORD dwOld;
MessageBoxA(0, "starting original PE", "Entry Point", 0);

VirtualProtect(b1, sizeof(b1), PAGE_EXECUTE_READWRITE,&dwOld);


FARPROC fp = (FARPROC)&b1;
fp();
ExitProcess(0);

bp5F7.gif
 
Ты откуда берёшь вот это ImageBase значение? У тебя должно быть что-то типо такого:
Я так понял, что у ТСа есть шеллкод, в нём он ищет место, где должен быть OEP. То есть алгоритм примерно такой:
  1. Нашел бинарь
  2. Взял оттуда pNt->OptionalHeader.AddressOfEntryPoint
  3. Заменил в своём шеллкоде адрес OEP
  4. Дальше пункты, которые он расписал (с заменой AddressOfEntryPoint на адрес шеллкода из новой секции)
По сути обычный инфектор он пишет.
Запоминаю значение старой точки входа OldEntryPoint = EntryPoint + ImageBase;
Не ориентируйся на ImageBase из заголовков. Сохрани только AddressOfEntryPoint. В шеллкоде ищи OEP так: GetModuleHandleA(NULL) + AddressOfEntryPoint (который ты сохранил)

но это не работает(
и уточни что не работает конкретно? Ты не на тот адрес управление передал или что? Или с адресом всё нормально, но краш где-то позже происходит?
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх