x64 gs寄存器的一点资料

编写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下这个搜索的过程
名称:  Snap2.jpg查看次数: 338文件大小:  37.4 KB

win7 x64下测试通过. 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 64位操作系统中,主要使用的寄存器有以下几个,并列出它们的一些常见功能: 1. RAX:通用寄存器,用于存储函数返回值、参与运算和数据传递。 2. RBX:通用寄存器,用于存储通用数据。 3. RCX:通用寄存器,用于存储函数参数。 4. RDX:通用寄存器,用于存储函数参数。 5. RSI:通用寄存器,用于存储函数参数。 6. RDI:通用寄存器,用于存储函数参数。 7. R8-R15:额外的通用寄存器,用于存储函数参数、通用数据。 8. RBP:基址指针寄存器,指向当前栈帧的基址。 9. RSP:栈指针寄存器,指向当前栈帧的栈顶。 10. RIP:指令指针寄存器,存储下一条将要执行的指令的地址。 11. RFLAGS:标志寄存器,存储控制和状态标志位,如零标志、进位标志等。 这些寄存器在64位操作系统下扩展为64位宽度,与32位操作系统下的32位寄存器有所不同。它们主要用于数据传递、函数参数传递、运算和控制指令流程。 除了上述通用寄存器外,还有一些特殊用途的寄存器,如: - CS, DS, ES, FS, GS:段寄存器,用于存储段选择子。 - SS:栈段寄存器,用于存储指向当前栈段的选择子。 - CR0, CR2, CR3, CR4:控制寄存器,用于控制和管理特定系统状态和功能。 - DR0-DR7:调试寄存器,用于调试和监控程序执行过程。 这些特殊寄存器主要涉及内存管理、段选择和系统状态等方面的功能。 需要注意的是,具体的寄存器使用和功能可能因编程语言、应用程序或操作系统要求而有所不同。此外,Windows 64位操作系统还支持SIMD寄存器(如XMM0-XMM15、YMM0-YMM15),用于执行向量化指令和高性能计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值