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

HeapAlloc дает ошибку

n0kkster

HDD-drive
Пользователь
Регистрация
12.04.2021
Сообщения
45
Реакции
12
Приветствую!
Имеется такой вот код, который затем компилится в шеллкод и исполняется в другом процессе.

C:
    typedef HANDLE(WINAPI* PGETPROCESSHEAP)(VOID);
    typedef LPVOID(WINAPI* PHEAPALLOC)(HANDLE, DWORD, SIZE_T);
...     
    PGETPROCESSHEAP pGetProcessHeap = (PGETPROCESSHEAP)GetApiByHash(0x1dacacd3);
    HANDLE procheap = pGetProcessHeap();
    PHEAPALLOC pHeapAlloc = (PHEAPALLOC)GetApiByHash(0xe00e87fb);
    PBYTE holder = (PBYTE)pHeapAlloc(procheap, HEAP_ZERO_MEMORY, szPayload);
...
При вызове HeapAlloc, процесс падает. Однако если я вызову тот же код (за исключением лишь того, что не импортированный по апи) в том же процессе, все пройдет гладко.
C:
...
    HANDLE procheap = GetProcessHeap();
    PBYTE holder = (PBYTE)HeapAlloc(procheap, HEAP_ZERO_MEMORY, szPayload);
...
В чем ошибка может быть?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А адреса функций правильно находятся?
С какой причиной вообще падает на вызове?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В чем ошибка может быть?
Вангую, что GetApiByHash ничего не слышала про форвардинг импортов, а HeapAlloc форвардится из kernel32.dll на RtlAllocateHeap из ntdll.dll.
 
Вангую, что GetApiByHash ничего не слышала про форвардинг импортов, а HeapAlloc форвардится из kernel32.dll на RtlAllocateHeap из ntdll.dll.
то есть правильнее будет грузануть ntdll.dll и из неё вытащить RtlAllocateHeap? Не совсем просто шарю за то, что винапи вызывает под капотом, знаю, что malloc вроде зовёт HeapAlloc, поэтому и решил юзать ее.
 
Последнее редактирование:
А адреса функций правильно находятся?
С какой причиной вообще падает на вызове?
Адреса вроде правильно, хеши перепроверил, плюс та же GetApiByHash правильно возвращает другие винапи функи. Мистер дильдофэггинс вроде дал наводку на корень проблемы
 
Пожалуйста, обратите внимание, что пользователь заблокирован
то есть правильнее будет грузануть ntdll.dll и из неё вытащить RtlAllocateHeap? Не совсем просто шарю за то, что винапи вызывает под капотом, знаю, что malloc вроде зовёт HeapAlloc, поэтому и решил юзать ее.
Винапи под капотом вызвает native api, ниже уже только ядро. Более простым вариантом будет да, парсинг NTDLL, т.к. оттуда форвардинга уже точно не будет. Кстати , GetProcessHeap можно
выбросить, брать адрес хипа из РЕВ. Минус - далеко не все функции можно перевести на натив, допустим хип или там createfile да (и то, оно посложнее будет). А функции СОМ или там перечисление сетевых шар на нативе вы не закодите. Поэтому, нужно изучить апи форвардинг (переадресацию). Тем более, что начиная с вин7 m$ ввела совершнно безумную инновацию api-sets , и какая-нибудь функция на каком-то сервиспаке может лежать в непонятной api-ms-lgbt-blm-1488.dll.

Как понять, что функция переадресована? Виртуальный адрес такой функции находится в пределах таблицы экспорта, и выглядит как строка-нуллбайт-имя длл.имя апи. Вот кусок кода
C:
//lpBaseAddr - базовый адрес модуля в памяти
PIMAGE_EXPORT_DIRECTORY p_image_export = (PIMAGE_EXPORT_DIRECTORY)(lpBaseAddr + получить адрес таблицы экспорта);
....
DWORD * functions = (DWORD*)(lpBase+p_image_export->AddressOfFunctions);

for(UINT i = 0; i < p_image_export->NumberOfFunctions; i++)
{
    LPBYTE fn_addr = lpBaseAddr+functions[i];

    if (fn_addr== lpBaseAddr)
        continue;

    else if(fn_addr>= (LPBYTE)p_image_export && fn_addr< ((LPBYTE)p_image_export + p_ntheaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size))
//функция переадресована, строка будет вида api_name \0 dll_name . api_name

}
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован


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