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

PEB->ProcessParameters->Environment = nullptr

Jeffs

(L1) cache
Забанен
Регистрация
28.12.2018
Сообщения
611
Реакции
358
Пожалуйста, обратите внимание, что пользователь заблокирован
Изучаю данный метод инжекта:
При попытке получить адрес Environment из PEB созданного мной процесса - получаю nullptr.
Тот же Process Explorer прекрасно отображает все переменные среды созданного процесса.
Не пойму, что не так?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Больше инфы. Процесс x86/64, твоё апп x86/64?
Моё приложение - x86, процесс, который создаётся - x86 блокнот.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Моё приложение - x86, процесс, который создаётся - x86 блокнот.
Код показывай, может не по тому смещение считываешь это значение или еще чего.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Код показывай, может не по тому смещение считываешь это значение или еще чего.
Вот код: https://github.com/odzhan/injection/blob/master/cmdline/var_inject.c#L61
На удивление, если попробовать вытащить ProcessParameters из PEB текущего процесса - так же nullptr:
RTL_USER_PROCESS_PARAMETERS* upp = (RTL_USER_PROCESS_PARAMETERS*)NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters;
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ты в отладке чекаешь или как?
Под дебаггером визуалки смотрю.
Тестанул под x64 - все отлично работает, под x86 фигня какая-то.
Тестирую под виртуалкой Win10 20H2 x64, если это имеет какое-то значение.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Под дебаггером визуалки смотрю.
Тестанул под x64 - все отлично работает, под x86 фигня какая-то.
Тестирую под виртуалкой Win10 20H2 x64, если это имеет какое-то значение.
Под 64 работает скорее всего, что vs у тя 64 и позволяет читать память 64 приложухи (т.е. ты берешь пеб чужого процесса).
А nullptr возвращает потому что дебагер 64, а блокнот x86. Лучше смотри через олидебаг x64/x86 соотвественно.
Подправьте если не прав.

То, что сказал выше может работать в обратном случае.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Под 64 работает скорее всего, что vs у тя 64 и позволяет читать память 64 приложухи (т.е. ты берешь пеб чужого процесса).
А nullptr возвращает потому что дебагер 64, а блокнот x86. Лучше смотри через олидебаг x64/x86 соотвественно.
Подправьте если не прав.
x64 build: NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters != nullptr;
x86 build: NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters == nullptr;
Битность визуалки/стороннего процесса, думаю, тут ни причём.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Вот код:
Найди в этой куче говна определения структуры PEB и запости сюда.
Не важно, нашел: https://github.com/odzhan/injection/blob/master/ntlib/ntddk.h#L3092

Ну вроде определения PEB выглядит нормально. Но в WOW64 процессах два PEB'а (64-битный и 32-битный), может в этом проблема.
 
Последнее редактирование:
Hello.

If you RTL_USER_PROCESS_PARAMETERS is NULL its because your PEB structure isn't aligned correctly. This is a common problem. I will demonstrate how to do this correctly. Apologies to Moderators for the long post. :)

This code will demonstrate how to retrieve the structure, you should know how to access the members ;)

Код:
#include <windows.h>

typedef struct _LSA_UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;

typedef struct _LDR_MODULE {
    LIST_ENTRY              InLoadOrderModuleList;
    LIST_ENTRY              InMemoryOrderModuleList;
    LIST_ENTRY              InInitializationOrderModuleList;
    PVOID                   BaseAddress;
    PVOID                   EntryPoint;
    ULONG                   SizeOfImage;
    UNICODE_STRING          FullDllName;
    UNICODE_STRING          BaseDllName;
    ULONG                   Flags;
    SHORT                   LoadCount;
    SHORT                   TlsIndex;
    LIST_ENTRY              HashTableEntry;
    ULONG                   TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;

typedef struct _PEB_LDR_DATA {
    ULONG                   Length;
    ULONG                   Initialized;
    PVOID                   SsHandle;
    LIST_ENTRY              InLoadOrderModuleList;
    LIST_ENTRY              InMemoryOrderModuleList;
    LIST_ENTRY              InInitializationOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;

typedef struct _PEB {
    BOOLEAN                 InheritedAddressSpace;
    BOOLEAN                 ReadImageFileExecOptions;
    BOOLEAN                 BeingDebugged;
    BOOLEAN                 Spare;
    HANDLE                  Mutant;
    PVOID                   ImageBase;
    PPEB_LDR_DATA           LoaderData;
    PVOID                   ProcessParameters;
    PVOID                   SubSystemData;
    PVOID                   ProcessHeap;
    PVOID                   FastPebLock;
    PVOID                   FastPebLockRoutine;
    PVOID                   FastPebUnlockRoutine;
    ULONG                   EnvironmentUpdateCount;
    PVOID*                  KernelCallbackTable;
    PVOID                   EventLogSection;
    PVOID                   EventLog;
    PVOID                   FreeList;
    ULONG                   TlsExpansionCounter;
    PVOID                   TlsBitmap;
    ULONG                   TlsBitmapBits[0x2];
    PVOID                   ReadOnlySharedMemoryBase;
    PVOID                   ReadOnlySharedMemoryHeap;
    PVOID*                  ReadOnlyStaticServerData;
    PVOID                   AnsiCodePageData;
    PVOID                   OemCodePageData;
    PVOID                   UnicodeCaseTableData;
    ULONG                   NumberOfProcessors;
    ULONG                   NtGlobalFlag;
    BYTE                    Spare2[0x4];
    LARGE_INTEGER           CriticalSectionTimeout;
    ULONG                   HeapSegmentReserve;
    ULONG                   HeapSegmentCommit;
    ULONG                   HeapDeCommitTotalFreeThreshold;
    ULONG                   HeapDeCommitFreeBlockThreshold;
    ULONG                   NumberOfHeaps;
    ULONG                   MaximumNumberOfHeaps;
    PVOID**                    ProcessHeaps;
    PVOID                   GdiSharedHandleTable;
    PVOID                   ProcessStarterHelper;
    PVOID                   GdiDCAttributeList;
    PVOID                   LoaderLock;
    ULONG                   OSMajorVersion;
    ULONG                   OSMinorVersion;
    ULONG                   OSBuildNumber;
    ULONG                   OSPlatformId;
    ULONG                   ImageSubSystem;
    ULONG                   ImageSubSystemMajorVersion;
    ULONG                   ImageSubSystemMinorVersion;
    ULONG                   GdiHandleBuffer[0x22];
    ULONG                   PostProcessInitRoutine;
    ULONG                   TlsExpansionBitmap;
    BYTE                    TlsExpansionBitmapBits[0x80];
    ULONG                   SessionId;
} PEB, *PPEB;

typedef struct _STRING {
    USHORT Length;
    USHORT MaximumLength;
    PCHAR  Buffer;
} ANSI_STRING, *PANSI_STRING;

typedef struct _RTL_DRIVE_LETTER_CURDIR {
    WORD Flags;
    WORD Length;
    ULONG TimeStamp;
    ANSI_STRING DosPath;
} RTL_DRIVE_LETTER_CURDIR, *PRTL_DRIVE_LETTER_CURDIR;

typedef struct _CURDIR {
    UNICODE_STRING DosPath;
    PVOID Handle;
}CURDIR, *PCURDIR;

typedef struct _RTL_USER_PROCESS_PARAMETERS {
    ULONG MaximumLength;
    ULONG Length;
    ULONG Flags;
    ULONG DebugFlags;
    PVOID ConsoleHandle;
    ULONG ConsoleFlags;
    PVOID StandardInput;
    PVOID StandardOutput;
    PVOID StandardError;
    CURDIR CurrentDirectory;
    UNICODE_STRING DllPath;
    UNICODE_STRING ImagePathName;
    UNICODE_STRING CommandLine;
    PVOID Environment;
    ULONG StartingX;
    ULONG StartingY;
    ULONG CountX;
    ULONG CountY;
    ULONG CountCharsX;
    ULONG CountCharsY;
    ULONG FillAttribute;
    ULONG WindowFlags;
    ULONG ShowWindowFlags;
    UNICODE_STRING WindowTitle;
    UNICODE_STRING DesktopInfo;
    UNICODE_STRING ShellInfo;
    UNICODE_STRING RuntimeData;
    RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32];
    ULONG EnvironmentSize;
}RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

INT main(VOID)
{
    //because this is a 32bit application, we will read the FS register, not the GS register
    PPEB PebData = (PPEB)__readfsdword(0x30);
    //PPEB PebData = (PPEB)__readgsqword(0x60); --- 64bit :)

    PRTL_USER_PROCESS_PARAMETERS ProcessParameters = (PRTL_USER_PROCESS_PARAMETERS)PebData->ProcessParameters; //typo fixed :)

    return ERROR_SUCCESS;
}
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Думаю, надо получать PEB64 , если это WOW64 приложение. Конкретно этот инжект не копал, но посмотрел вот на первом попавшемся приложении - в 32 битном РЕВ ProcessParameters = null, в 64 бит (нативном) - указывает на RTL_USER_PROCESS_PARAMETERS
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Думаю, надо получать PEB64 , если это WOW64 приложение. Конкретно этот инжект не копал, но посмотрел вот на первом попавшемся приложении - в 32 битном РЕВ ProcessParameters = null, в 64 бит (нативном) - указывает на RTL_USER_PROCESS_PARAMETERS
Собираю под x86, пытаюсь получить ProcessParameters текущего процесса - NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters == nullptr. Не пойму, с чем это связано.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Собираю под x86, пытаюсь получить ProcessParameters текущего процесса - NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters == nullptr. Не пойму, с чем это связано.
А, еще. Попробуй убрать Padding0 поле из твоего объявления PEB. После пачки UCHAR'ов указатель должен быть выровнен видимо в 64-битном режиме, а в 32-битном это скорее всего не нужно.
 
А, еще. Попробуй убрать Padding0 поле из твоего объявления PEB. После пачки UCHAR'ов указатель должен быть выровнен видимо в 64-битном режиме, а в 32-битном это скорее всего не нужно.
It might be a bad declaration - except I supplied code + an image.

NtCurrentTeb forwards to an intrinsic functions


Код:
FORCEINLINE struct _TEB* NtCurrentTeb(VOID)
{
 #if defined(_M_IX86)
     return (PTEB)__readfsdword(0x18);
 #elif defined (_M_AMD64)
     return (struct _TEB *)__readgsqword(0x30);
 #elif defined (_M_ARM)
     return (struct _TEB *)KeGetPcr()->Used_Self;
 #endif
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да, проблема заклюалась именно в "кривом" обьявлении структуры PEB.
Всем спасибо за ответы! Сам бы в жизни не догадался, наверное.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да, проблема заклюалась именно в "кривом" обьявлении структуры PEB.
Всем спасибо за ответы! Сам бы в жизни не догадался, наверное.
Ну ты имей ввиду, что 64-битного режима этот Padding0 необходим будет, то есть можешь взять его в #ifdef например.
 


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