• XSS INCEPTION #5 - то, чего не было много лет. Е-зин, он же электронный журнал. Заходите! Выпуск #5 уже ждет вас!

Траблы в RunPE

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Пишу, значит, я RunPE шеллкод, тестирую на примерах к FASM - всё ок - запускает экзешник от имени другого процесса. Но вот попадается мне простой блокнот (х86) и мой RunPE уже не в состоянии его запустить. А дело в том, что блокнот имеет ImageBase=0x01000000 и не имеет релоков. В то же время в чужом процессе, от имени которого я пытаюсь запустить блокнот с помощью инжекта, эта область памяти помечена как RESERVED и MEM_MAPPED. Значит мне надо как-то закрыть этот MAP файл в чужом процессе, но как?
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Не помогает(все равно страница содержит флаг MEM_MAPPED). Проверяю так:
C:
if (uImageBase == pHdrs->OptionalHeader.ImageBase) {
        fncs.pNtUnmapViewOfSection(processInfo.hProcess, (LPVOID)uImageBase);
      }
      if (VirtualQueryEx(processInfo.hProcess, (LPCVOID)pHdrs->OptionalHeader.ImageBase, &memInfo, sizeof(memInfo))) {
        if (memInfo.Type == MEM_MAPPED) {
          fncs.pNtUnmapViewOfSection(processInfo.hProcess, memInfo.BaseAddress);
        }
        VirtualQueryEx(processInfo.hProcess, (LPCVOID)pHdrs->OptionalHeader.ImageBase, &memInfo, sizeof(memInfo));
        if (memInfo.Type == MEM_MAPPED) {
          puts("OXOXO");
        }
      }
      pImageBase = fncs.pVirtualAllocEx(processInfo.hProcess, (LPVOID)pHdrs->OptionalHeader.ImageBase, pHdrs->OptionalHeader.SizeOfImage, MEM_COMMIT | MEM_RELEASE, PAGE_EXECUTE_READWRITE);
      if (pImageBase != NULL) {
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Думаю что NtUnmapViewOfSection и ZwUnmapViewOfSection это полные синонимы.
 

DildoFagins

CPU register
Пользователь
Регистрация
11.08.2020
Сообщения
1 376
Реакции
753
Так а какой статус возвращает NtUnmapViewOfSection?
 

DildoFagins

CPU register
Пользователь
Регистрация
11.08.2020
Сообщения
1 376
Реакции
753
Ну это статус с ошибкой: STATUS_INVALID_PAGE_PROTECTION, я с хода не скажу, из-за чего это может происходить, попробуй погуглить, если не найдешь сам, попробую завтра поискать.
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Я то-гуглю, но я уже такого нагородил, что аж страшно :) Казалось-бы ниже код с ReactOS должен все прояснить, надо только вызвать функцию RtlFlushSecureMemoryCache((PVOID)lpBaseAddress, 0), но она не принимает параметром хэндл процесса, поэтому для ранпе не подходит.
C:
BOOL
NTAPI
UnmapViewOfFile(LPCVOID lpBaseAddress)
{
    NTSTATUS Status;


    /* Unmap the section */
    Status = NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)lpBaseAddress);
    if (!NT_SUCCESS(Status))
    {
        /* Check if the pages were protected */
        if (Status == STATUS_INVALID_PAGE_PROTECTION)
        {
            /* Flush the region if it was a "secure memory cache" */
            if (RtlFlushSecureMemoryCache((PVOID)lpBaseAddress, 0))
            {
                /* Now try to unmap again */
                Status = NtUnmapViewOfSection(NtCurrentProcess(), (PVOID)lpBaseAddress);
                if (NT_SUCCESS(Status)) return TRUE;
            }
        }


        /* We failed */
        BaseSetLastNTError(Status);
        return FALSE;
    }


    /* Otherwise, return sucess */
    return TRUE;
}
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Значит участок памяти одновременно PAGE_NOACCESS (было при аллокации), MEM_MAPPED и MEM_RESERVE
 

DildoFagins

CPU register
Пользователь
Регистрация
11.08.2020
Сообщения
1 376
Реакции
753
Значит участок памяти одновременно PAGE_NOACCESS (было при аллокации), MEM_MAPPED и MEM_RESERVE
Ну с другого процесса ты можешь читать и писать в эту область памяти, значит она не должна быть PAGE_NOACCESS. Может у тебя адрес imagebase не тот?
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Из другого процесса я об этом участке памяти могу только узнать из VirtualQueryEx, а не читать и писать. ImageBase=0x01000000
 

DildoFagins

CPU register
Пользователь
Регистрация
11.08.2020
Сообщения
1 376
Реакции
753
Из другого процесса я об этом участке памяти могу только узнать из VirtualQueryEx, а не читать и писать. ImageBase=0x01000000
Ну в обычной ситуации, когда ты реализуешь RunPE ты можешь читать из этой области, и писать те страницы, у которых есть соответствующие права. Если у тебя исполняемый файл отобразился с PAGE_NOACCESS, то и загрцзчик системы не может его обработать, и код в нем не может исполняться.

Или это вообще не образ, а какой то участок памяти зарезервированный? Тогда тебе не надо делать анмап, а просто освободить его и перевыделить.
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Ну смотри, я пытаюсь винжектить блокнот в интернет эксплорер. Блокнот (ImageBase=0x01000000), а у ИЕ есть релоки. Например, ИЕ загрузился (ImageBase=0x0930000). Исполняемый файл ИЕ загружается с нормальными правами чтения/записи. Но! Участок памяти, куда надо отправить блокнот имеет свойство PAGE_NOACCESS (было при аллокации), MEM_MAPPED и MEM_RESERVE !

memmap.jpg
 

DildoFagins

CPU register
Пользователь
Регистрация
11.08.2020
Сообщения
1 376
Реакции
753
Но! Участок памяти, куда надо отправить блокнот имеет свойство PAGE_NOACCESS (было при аллокации), MEM_MAPPED и MEM_RESERVE !
Ну то есть это не образ. Эта память зарезервирована в момент, когда процесс запущен в саспендед режиме и точка входа осла не работала? Ну и тебе нужно, чтобы осел работал, как надо? Если нет, то просто попробуй освободить этот участок зарезервированной памяти и выделить память под блокнот. Если нужно, то тут можно подумать, для чего эта память зарезервирована, но в общем случае решения скорее всего нет.
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Нет, осёл мне не нужен.
Эта память зарезервирована в момент, когда процесс запущен в саспендед режиме и точка входа осла не работала?
Да, именно.
Если нет, то просто попробуй освободить этот участок зарезервированной памяти и выделить память под блокнот.
Не могу освободить память, пытаюсь так:
Код:
if ctypes.windll.kernel32.VirtualFreeEx(pi.hProcess, pe.OPTIONAL_HEADER.ImageBase, 0, MEM_RELEASE):
    print "[+] Virtual Free Succeed"
else:
    print "Failed to free virtual memory"
    print "Error Code: ", hex(ctypes.windll.kernel32.GetLastError())
Error Code: 0x57
Что значит ошибку ERROR_INVALID_PARAMETER
 

DildoFagins

CPU register
Пользователь
Регистрация
11.08.2020
Сообщения
1 376
Реакции
753
Не могу освободить память, пытаюсь так
Ну а ты уверен, что imagebase совпадает с базовым адресом зарезервированного участка памяти, когда ты делаешь MEM_RELEASE, ты должен передавать базовый адрес участка памяти, а не рандомный адрес внутри этого участка (на скриншоте он у тебя начинается в AB8000).
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Уверен, я сначала тыкаю VirtualQueryEx, получаю базовый адресс зарезервированного участка памяти, а потом отправляю его в pVirtualFreeEx. Все равно ошибка 0x57.
Код:
      if (VirtualQueryEx(processInfo.hProcess, (LPCVOID)pHdrs->OptionalHeader.ImageBase, &memInfo, sizeof(memInfo))) {
        if (memInfo.Type == MEM_MAPPED) {
          DWORD dwOldProtect = 0;
          printf("BASE: %X\r\n", (DWORD)memInfo.BaseAddress);
          printf("ALLOCATION BASE: %X\r\n", (DWORD)memInfo.AllocationBase);
          printf("TYPE: %X\r\n", memInfo.Type);
          printf("ALLOCATION PROTECT: %X\r\n", memInfo.AllocationProtect);
          printf("PROTECT: %X\r\n", memInfo.Protect);
          printf("STATE: %X\r\n", memInfo.State);
          printf("Y:%X\r\n", (DWORD)fncs.pVirtualFreeEx(processInfo.hProcess, (LPVOID)memInfo.AllocationBase, 0x0, MEM_RELEASE));
          printf("=%X\r\n", GetLastError());
          printf("X:%X\r\n", (DWORD)fncs.pVirtualAllocEx(processInfo.hProcess, (LPVOID)memInfo.AllocationBase, 0x10000, MEM_COMMIT, PAGE_EXECUTE_READWRITE));
          printf("%X\r\n", VirtualProtectEx(processInfo.hProcess, (LPVOID)memInfo.BaseAddress, memInfo.RegionSize, PAGE_EXECUTE_WRITECOPY, &dwOldProtect));
          printf("%X\r\n", GetLastError());
 

DildoFagins

CPU register
Пользователь
Регистрация
11.08.2020
Сообщения
1 376
Реакции
753
Не знаю тогда. Антивирус есть на машине, может хукает функцию и не дает тебе это делать? Пока больше идей нет.
 

H3aVyH0Rs3

HDD-drive
Пользователь
Регистрация
06.02.2020
Сообщения
29
Реакции
5
Проверил на Win 10 x64 - те же траблы.
 
Верх