首页
论坛
课程
招聘
[系统内核] [原创]X64 Kernel Shellcode获取Ntos Base
2021-3-30 16:05 3998

[系统内核] [原创]X64 Kernel Shellcode获取Ntos Base

2021-3-30 16:05
3998

之前网上的思路是GetPcr()->IdtBase拿到isr地址对齐后往上爆搜 'MZ' 0x5A4D,来拿到ntos base。

在win10 2004以下版本中没什么问题。

isr本身位于.text中,往上很快就能得到pe头

但是在win10 2004下,ntos的区段结构变了,.text不再是第一个区段.几个data区段跑到了上面,还有3个区段不能访问

如果继续往上爆搜,则会直接裂开。


那么换个思路,可以看到在ntos的.text中还是有很多地方引用了image base了的

,直接往上爆搜 48 8D 1D ?? ?? ?? FF ,  (lea xxx, -aaaaaaa)  ,最后一个0xff确保方向朝上,然后判断 aaaa是否PAGE_SIZE对齐( & 0xFFF == 0),

代码如下

.CODE
PUBLIC GetKernelBase
GetKernelBase PROC
mov     rax, qword ptr gs:[18h]
mov     rcx, [rax+38h]
mov     rax, 0FFFFFFFFFFFFF000h
and     rax, [rcx+4h]
jmp      while_start
search_mem_start:
add     rax, 0FFFFFFFFFFFFF000h
while_start: 
xor     ecx, ecx
jmp      search_mem_check
search_mem_next: 
add     rcx, 1
cmp     rcx, 0FF9h
jz       search_mem_start
search_mem_check:  
cmp     byte ptr[rax+rcx], 48h
jnz     search_mem_next
cmp     byte ptr[rax+rcx+1], 8Dh
jnz     search_mem_next
cmp     byte ptr[rax+rcx+2], 1Dh
jnz     search_mem_next
cmp     byte ptr[rax+rcx+6], 0FFh
jnz     search_mem_next
mov     r8d,[rax+rcx+3]
lea     edx,[rcx+r8]
add     edx, eax
add     edx, 7
test    edx, 0FFFh
jnz      search_mem_next
mov     rdx, 0FFFFFFFF00000000h
and     rdx, rax
add     r8d, eax
lea     eax,[rcx+r8]
add     eax, 7
or      rax, rdx
ret     
GetKernelBase ENDP
END





第五届安全开发者峰会(SDC 2021)议题征集正式开启!

最后于 2021-3-30 16:52 被xiaofu编辑 ,原因:
收藏
点赞5
打赏
分享
最新回复 (8)
雪    币: 7233
活跃值: 活跃值 (4785)
能力值: (RANK:530 )
在线值:
发帖
回帖
粉丝
r0Cat 活跃值 6 2021-3-30 16:26
2
0
感谢分享
雪    币: 657
活跃值: 活跃值 (742)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sonyps 活跃值 2021-3-30 17:21
3
0

既然暴力搜索会裂开,那么不是就说明搜索代码不严谨,没有判断虚拟内存是否可读,那么ZwQueryVirtualMemory确定为是在上一个可读区域内搜索,没找到就继续再找上一个可读区域再搜索不是就好了?

最后于 2021-3-30 17:24 被sonyps编辑 ,原因:
雪    币: 1499
活跃值: 活跃值 (2080)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
xiaofu 活跃值 8 2021-3-30 17:28
4
0
sonyps 既然暴力搜索会裂开,那么不是就说明搜索代码不严谨,没有判断虚拟内存是否可读,那么ZwQueryVirtualMemory确定为是在上一个可读区域内搜索,没找到就继续再找上一个可读区域再搜索不是就好了?
shellcode不能直接调用api,只有拿到base了再检索导出表调用
雪    币: 151
活跃值: 活跃值 (562)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huojier 活跃值 2021-3-30 20:05
5
0
你要是R3写内核shellcode的 可以直接用ZW API解析base 并且得到那些API地址 都可以直接在R3完成
雪    币: 657
活跃值: 活跃值 (742)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sonyps 活跃值 2021-3-30 21:33
6
0
xiaofu shellcode不能直接调用api,只有拿到base了再检索导出表调用
好吧
雪    币: 1606
活跃值: 活跃值 (572)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dearfuture 活跃值 2021-3-31 09:45
7
0
sonyps 既然暴力搜索会裂开,那么不是就说明搜索代码不严谨,没有判断虚拟内存是否可读,那么ZwQueryVirtualMemory确定为是在上一个可读区域内搜索,没找到就继续再找上一个可读区域再搜索不是就好了?
这个api本身也只能用于查询r3内存信息吧
雪    币: 159
活跃值: 活跃值 (708)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengyunabc 活跃值 1 2021-3-31 10:01
8
0
感谢分享!
雪    币: 4277
活跃值: 活跃值 (601)
能力值: ( LV7,RANK:113 )
在线值:
发帖
回帖
粉丝
Adventure 活跃值 2021-3-31 23:57
9
0

。。看错标题了

最后于 2021-3-31 23:58 被Adventure编辑 ,原因:
游客
登录 | 注册 方可回帖
返回