好友
阅读权限10
听众
最后登录1970-1-1
|
事情是这样的我原本计划采用PEB遍历获取ntdll基址后,手动解析其导出表以定位LdrGetProcedureAddress,进而通过该函数动态获取其他API。这样写的优势在于代码更短、稳定性更高、兼容性更好,且能有效绕过传统shellcode的检测机制。然而,在实现过程中发现,Windows 11(22H2及以上版本)对ntdll.dll的导出表实施了“只读/隐藏”保护,直接通过[rcx+0x90]读取导出表RVA时会返回0。这是由于系统拦截了相关内存读取,且用户态调试器默认不具备访问ntdll内核内存的权限,导致我的shellcode在尝试通过ntdll.dll获取Ldr系列函数、进而加载kernel32.dll并哈希匹配导出函数的路径完全受阻。大家有什么好的想法咱们一起可以交流一下唉{:1_893:}
详情如下所示:
1. PEB-InMemoryOrderModuleList-ntdll.ll基址成功---->在写这段代码的时候也遇到小坑了。匹配模块名"ntdll.ll"(大写与系统内存一致)这是部分windows10系统上的,调试的时候发现模块名是小写,索性就同时匹配大小写。
shellcode_entry:
push rbp
mov rbp, rsp
push r15
push r14
push r13
push r12
push r11
push r10
push r9
push r8
push rcx
push rbx
and rsp,0xfffffffffffffff0
; Step 1: Get PEB via GS:[0x60]
mov rax, [gs:0x60] ; PEB
test rax, rax
jz cleanup
mov rax, [rax + 0x18] ; PEB.Ldr (PEB_LDR_DATA*)
mov rax, [rax + 0x20] ; PEB_LDR_DATA.InMemoryOrderModuleList (LIST_ENTRY*)
mov r9, rax ; r9 = current LIST_ENTRY*
.find_ntdll:
mov r9, [r9]
test r9, r9
jz cleanup
cmp r9, rax
je cleanup
mov r10, r9
sub r10, 0x10
test r10, r10
jz .find_ntdll
mov rdx, [r10 + 0x58 + 0x08] ; BaseDllName.Buffer
test rdx, rdx
jz .find_ntdll
mov cl, [rdx]
cmp cl, 'N'
je .check_char2
cmp cl, 'n'
jne .find_ntdll
.check_char2:
mov cl, [rdx + 2]
cmp cl, 'T'
je .check_char3
cmp cl, 't'
jne .find_ntdll
.check_char3:
mov cl, [rdx + 4]
cmp cl, 'D'
je .check_char4
cmp cl, 'd'
jne .find_ntdll
.check_char4:
mov cl, [rdx + 6]
cmp cl, 'L'
je .check_char5
cmp cl, 'l'
jne .find_ntdll
.check_char5:
mov cl, [rdx + 8]
cmp cl, 'L'
je .check_char6
cmp cl, 'l'
jne .find_ntdll
.check_char6:
mov cl, [rdx + 10]
cmp cl, '.'
jne .find_ntdll
.check_char7:
mov cl, [rdx + 12]
cmp cl, 'D'
je .check_char8
cmp cl, 'd'
jne .find_ntdll
.check_char8:
mov cl, [rdx + 14]
cmp cl, 'L'
je .check_char9
cmp cl, 'l'
jne .find_ntdll
.check_char9:
mov cl, [rdx + 16]
cmp cl, 'L'
je .ntdll_found
cmp cl, 'l'
jne .find_ntdll
.ntdll_found:
;找到ntdll.dll 获取基址
mov r11, [r10 + 0x30] ; DllBase ->获得ntdll地址
test r11, r11
jz cleanup
关键代码
2. 获取到nt头地址
关键代码如下所示
; 1. 读取e_lfanew地址
mov edx, [rdi + 0x3c] ; e_lfanew
test edx, edx
jz .not_found
; 2. 修正导出表偏移为0x90 -->计算nt头地址
mov rcx, rdi
add rcx, rdx ; NT Headers VA
cmp dword [rcx], 0x4550 ; 'PE\0\0'签名
jne .not_found
成功获取
3. 获取导出表唉问题就出现在这里
|
|