首页
社区
课程
招聘
x64 gs寄存器的一点资料
发表于: 2012-1-15 17:23 14459

x64 gs寄存器的一点资料

2012-1-15 17:23
14459
编写shellcode很重要的一步就是搜索kernel32的基址,毕竟我们要获取API的地址

x86下总所周知的fs寄存器搜索kernel32基址的办法,在x64下已经失效了.

x64下fs的角色已经换成了gs.

暂时发现存储的一些感兴趣的东西,如果有其他的,希望能告知我.

gs:[0x30]                 TEB

gs:[0x40]                 Pid

gs:[0x48]                 Tid

gs:[0x60]                PEB

gs:[0x68]                 LastError

值得一提的是,虽然gs:[0x60] 直接存放的PEB,但是由于vista/7后的地址随机化机制,还是从TEB获取比较靠谱.

0:009> dt 000007fffff98000 _TEB
ntdll!_TEB
+0×000 NtTib            : _NT_TIB
+0×038 EnvironmentPointer : (null)
+0×040 ClientId         : _CLIENT_ID
+0×050 ActiveRpcHandle  : (null)
+0×058 ThreadLocalStoragePointer : (null)
+0×060 ProcessEnvironmentBlock : 0x000007ff`fffd5000 _PEB    //这里即是PEB

//用c语言描述就是
#define x64_GetPeb()                    ( (LONG64*)(*((LONG64*)((BYTE*)x64_GetTeb()+0×060))) )

得到了PEB,剩下的就和x86下一样了.只是偏移不一样了

0:009> dt 0x000007ff`fffd5000 _PEB
ntdll!_PEB
+0×000 InheritedAddressSpace : 0 ”
+0×001 ReadImageFileExecOptions : 0 ”
+0×002 BeingDebugged    : 0×1 ”
+0×003 BitField         : 0×8 ”
+0×003 ImageUsesLargePages : 0y0
+0×003 IsProtectedProcess : 0y0
+0×003 IsLegacyProcess  : 0y0
+0×003 IsImageDynamicallyRelocated : 0y1
+0×003 SkipPatchingUser32Forwarders : 0y0
+0×003 SpareBits        : 0y000
+0×008 Mutant           : 0xffffffff`ffffffff Void
+0×010 ImageBaseAddress : 0×00000000`ff310000 Void
+0×018 Ldr              : 0×00000000`77222640 _PEB_LDR_DATA

0:009> dt 0×00000000`77222640 _PEB_LDR_DATA
ntdll!_PEB_LDR_DATA
+0×000 Length           : 0×58
+0×004 Initialized      : 0×1 ”
+0×008 SsHandle         : (null)
+0×010 InLoadOrderModuleList : _LIST_ENTRY [ 0x00000000`00202780 - 0x2421b0 ]
+0×020 InMemoryOrderModuleList : _LIST_ENTRY [ 0x00000000`00202790 - 0x2421c0 ]
+0×030 InInitializationOrderModuleList : _LIST_ENTRY [ 0x00000000`00202890 - 0x2421d0 ]

同样的,搜索InInitializationOrderModuleList 即可得到Kernel32的基址.

由于x64下vs2005没法直接使用内联汇编,所以只把必须使用汇编来做的事情写成单独的asm

x64下.指针的长度已经是8个字节,所以偏移不一样了.

0:009> dt _LDR_DATA_TABLE_ENTRY
ntdll!_LDR_DATA_TABLE_ENTRY
+0×000 InLoadOrderLinks : _LIST_ENTRY
+0×010 InMemoryOrderLinks : _LIST_ENTRY
+0×020 InInitializationOrderLinks : _LIST_ENTRY
+0×030 DllBase          : Ptr64 Void
+0×038 EntryPoint       : Ptr64 Void
+0×040 SizeOfImage      : Uint4B
+0×048 FullDllName      : _UNICODE_STRING

C语言表述x64下这个搜索的过程


win7 x64下测试通过.

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (6)
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
2
我来顶顶.....

但是由于vista/7后的地址随机化机制》????  不是很懂额 忘解释一下行么
2012-1-15 17:58
0
雪    币: 107
活跃值: (326)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼上找度娘问一句就知道 了..这么简单的东西...
2012-1-15 19:45
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
马克了。。。。
2012-1-15 20:07
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
我是来围观楼主的。。。。
2012-2-27 13:33
0
雪    币: 30
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
在不用r $teb的情况下,楼主是如何获得TEB地址的?
2012-4-4 23:32
0
雪    币: 1573
活跃值: (198)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
收藏了!!!!
2018-5-3 23:09
0
游客
登录 | 注册 方可回帖
返回
//