寄存器类型:
1、CS:代码段寄存器;
2、DS:数据段寄存器;
3、SS:堆栈段寄存器;
4、FS:标志段寄存器
5、GS:全局段寄存器
6、ES:扩展段寄存器
通过读取FS寄存器指定的内存可以获得很多系统关键信息,内核态是fs = 0x30,用户态 fs = 0x3B,fs在内核态指向_KPCR,用户态指向_TEB。
TEB(Thread Environment Block),线程环境块,也就是说每一个线程都会有TEB,用于保存系统与线程之间的数据,便于操作控制。那么Fs:[0x30]就是PEB进程环境块。
- PEB就是当前进程环境,shellcode就可以轻易获取PEB信息,通过偏移0xc获取到了_PEB_LDR_DATA,这个结构体包含有关进程的已加载模块的信息.
LDR_DATA_TABLE_ENTRY结构体包含的数据如下:
比如通过上述的过程成功获取如ntdll.dll,如下所示: