首页
社区
课程
招聘
[原创]X64 Kernel Shellcode获取Ntos Base
2021-3-30 16:05 10518

[原创]X64 Kernel Shellcode获取Ntos Base

2021-3-30 16:05
10518

之前网上的思路是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





[培训]《安卓高级研修班(网课)》月薪三万计划

最后于 2021-3-30 16:52 被xiaofu编辑 ,原因:
收藏
点赞7
打赏
分享
最新回复 (9)
雪    币: 8713
活跃值: (8610)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
r0Cat 7 2021-3-30 16:26
2
0
感谢分享
雪    币: 3549
活跃值: (3955)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
sonyps 2021-3-30 17:21
3
0

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

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

。。看错标题了

最后于 2021-3-31 23:58 被Adventure编辑 ,原因:
雪    币: 23
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
大魔法狮子 2021-11-25 22:57
10
0
sonyps 既然暴力搜索会裂开,那么不是就说明搜索代码不严谨,没有判断虚拟内存是否可读,那么ZwQueryVirtualMemory确定为是在上一个可读区域内搜索,没找到就继续再找上一个可读区域再搜索不是就好了?
2333,这波跨频道聊天了
游客
登录 | 注册 方可回帖
返回