首页
社区
课程
招聘
[求助]问个GDT的问题
发表于: 2009-7-6 20:06 5814

[求助]问个GDT的问题

2009-7-6 20:06
5814
环境 virtualBOX中的windows xp sp3

远程windbg
kd> r gdtr
gdtr=8003f000
kd> db 8003f000
8003f000  00 00 00 00 00 00 00 00-ff ff 00 00 00 9a cf 00  ................
8003f010  ff ff 00 00 00 93 cf 00-ff ff 00 00 00 fa cf 00  ................
8003f020  ff ff 00 00 00 f3 cf 00-ab 20 00 20 04 8b 00 80  ......... . ....
8003f030  01 00 00 f0 df 93 c0 ff-ff 0f 00 00 00 f3 40 00  ..............@.
8003f040  ff ff 00 04 00 f2 00 00-00 00 00 00 00 00 00 00  ................
8003f050  68 00 00 22 55 89 00 80-68 00 68 22 55 89 00 80  h.."U...h.h"U...
8003f060  ff ff 40 2f 02 93 00 00-ff 3f 00 80 0b 92 00 00  ..@/.....?......
8003f070  ff 03 00 70 ff 92 00 ff-ff ff 00 00 40 9a 00 80  ...p........@...

本地打开一个记事本查看
CS = 0x1B 00011011  3
DS = 0x23 00100011  4
ES = 0x23 00100011  4
FS = 0x38 00111000  7
GS = 0x00 00000000  0
SS = 0x23 00100011  4

0:001> dg 1b
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
001B 00000000 ffffffff Code RE    3 Bg Pg P  Nl 00000cfa
0:001> dg 23
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0023 00000000 ffffffff Data RW Ac 3 Bg Pg P  Nl 00000cf3
0:001> dg 38
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0038 7ffde000 00000fff Data RW Ac 3 Bg By P  Nl 000004f3
0:001> ~
   0  Id: 6a8.644 Suspend: 1 Teb: 7ffdf000 Unfrozen
.  1  Id: 6a8.6d4 Suspend: 1 Teb: 7ffde000 Unfrozen
其中dg 38那个base是怎么计算得来的?
dg 1b
dg 23 都没有问题
就是不知道dg 38 base是怎么算出来的

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
首先,0x38是selector的值,对照selector的定义,此selector的RPL为0,使用GDT,选择的Descriptor的索引号是0x38 >> 3,结果是7,希捷找到GDT中的第7项(最开始那一项是第0项),把那个数值对照Descriptor的结构图看一遍就清楚了。
2009-7-6 20:33
0
雪    币: 160
活跃值: (272)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
问题的问题第7项是ff 0f 00 00 00 f3 40 00
base = 7ffde000
这个怎么来的?
2009-7-6 22:07
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
不好意思,有点想当然了,细看时发现确实不正确。

是不是GDT被修改过了呢?

以下是wiki中的GDT Entry的结构图,以及Linux早期版本中的定义的x86_seg宏的定义。



#define upper_seg(type,dpl,base,limit) \
        ((base) & 0xff000000) | \
        (((base) & 0x00ff0000)>>16) | \
        (((limit)>>12) & 0xf0000) | \
        ((dpl)<<13) | \
        (0x00c09000) | \
        ((type)<<8)

#define lower_seg(type,dpl,base,limit) \
        (((base) & 0x0000ffff)<<16) | \
        ((limit) & 0x0ffff)

#define x86_seg(type,dpl,base,limit) \
	.long lower_seg(type,dpl,base,limit); \
	.long upper_seg(type,dpl,base,limit)
2009-7-7 21:25
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
奇怪的是,我用SGDT获得GDT地址的时候一直地址一会是0X8003F000,一会是0XF7745410...
2009-7-9 13:16
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
6
我又查了一下手册,GDTR是个48(对64位系统是80)位寄存器啊,调试器怎么只显示了一个32位的数?

GDTR是低16位是GDT的SIZE,而GDT的地址是GDTR的高32(64)位。

我再查查,你也再查查。是不是WinDBG的错误呢?

还有sgdt指令也是获得一个48位的值,而不是32位值。
2009-7-9 17:19
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
经过我的测试,多次执行SGDT指令后获得的GDT LIMIT都是0x3ff,而基地址则是0x8003f000或0xf7745410.这是由于我的CPU是双核造成的.
我开一个CMD,然后在taskmgr里把这个CMD设为CPU0,然后运行测试代码执行SGDT指令,GDT基地址一直是0x8003f000,而如果设为CPU1,则为0xf7745410.
不知道为什么系统为2个CPU设置了不同的GDTR值.两者的关系还需要进一步测试...
2009-7-9 20:14
0
雪    币: 160
活跃值: (272)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
有这么两种可能:
1、windbg有个BUG,导致读出不正确
2、virtualbox特殊处理了FS

第二种可能性非常大,因为在windows操作系统中,FS是固定指向TEB的,所以在虚拟的时候不处理,直接赋值,便于加速........不知道想的对不对
2009-7-10 11:43
0
游客
登录 | 注册 方可回帖
返回
//