12-陷阱门
1. 陷阱門(mén)的結(jié)構(gòu)
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 字節(jié) |76543210|76543210|7 65 4 3210|76543210|76543210|76543210|76543210|76543210| 比特 |-----------------|1|--|0|1111|--------|--------|--------|--------|--------| 占位 |offset in segment|P|D |S|TYPE| |segment selector |offset in segment| 含義 | 31-16 |P | | | 15-0 ||L |通常陷阱門(mén)是以 ----ef00 0008----這種形式出現(xiàn)的,當(dāng)然了,第 5 個(gè)十六進(jìn)制數(shù)不一定就是 e,如果 DPL = 0 的話(huà),那這個(gè)數(shù)就是 8. 后面的 0008 是段選擇子,而左右兩側(cè)的占位符是要跳轉(zhuǎn)的地址。
不細(xì)心的同學(xué)還以為我上面這段都是從中斷門(mén)那里抄過(guò)來(lái)的。沒(méi)錯(cuò),確實(shí)是抄來(lái)的,99%相同,有2個(gè)位置我改了,一個(gè)是 TYPE 那里,在中斷門(mén)中 TYPE 是 1110 ,現(xiàn)在改成了 1111. 后面的 ee 也改成了 ef.
其它的和中斷門(mén)完全相同。那么在后面的實(shí)驗(yàn)里,除了在安裝描述符上和中斷門(mén)那不一樣,測(cè)試代碼甚至都不用改。
2. 實(shí)驗(yàn)
說(shuō)了這么多,到底哪不一樣?這里仍然使用中斷門(mén)的實(shí)驗(yàn)代碼。但是設(shè)計(jì)的描述符稍微不一樣了一點(diǎn)。
- 陷阱門(mén)描述符設(shè)計(jì)
和前面唯一的區(qū)別就是第6位的e變成了f(之前設(shè)計(jì)的中斷門(mén)描述符是 0040ee00`00081020)
- 安裝描述符
- 執(zhí)行結(jié)果
3. 陷阱門(mén)對(duì) EFLAGS 的影響
從實(shí)驗(yàn)結(jié)果上可以看到與上節(jié)不同的是,這里的EFLAGS并未受到影響。不同于上節(jié),進(jìn)入中斷門(mén),CPU會(huì)把EFLAGS中的IF位置1,而進(jìn)入陷阱門(mén),CPU并不修改 IF 位。
4. 陷阱門(mén)對(duì)堆棧的影響
同中斷門(mén)一樣,當(dāng)代碼從 3 環(huán)進(jìn)入 0環(huán)時(shí),CPU同樣做兩件事。
- 切換到 0 環(huán)棧(也就是修改 ss 段寄存器和 esp 寄存器)
- 在0環(huán)棧中壓入 ss3, esp3, eflags, cs3, eip3
在提權(quán)的時(shí)候,一直遺留了一個(gè)小小細(xì)節(jié),0 環(huán)棧的段描述符 ss0 和 棧頂指針 esp0,從哪里來(lái)?如果你想到了這個(gè)問(wèn)題,是否冒出了黑人問(wèn)號(hào) ????
本節(jié)并不打算講 TSS(Task State Segment,任務(wù)狀態(tài)段),但是為了引出這個(gè)話(huà)題,先拋出名詞。然后告訴你,CPU在切換棧的時(shí)候,SS和ESP來(lái)源于 TSS。
TSS 位于內(nèi)存中的某個(gè)位置,結(jié)構(gòu)固定。其中兩個(gè)字段,就保存了 SS0 和 ESP0.
5. 代碼
本節(jié)代碼和上節(jié)中斷門(mén)完全相同,請(qǐng)移步至中斷門(mén)查看代碼。
總結(jié)
- 上一篇: 红帽linux安装要钱吗,红帽linux
- 下一篇: 测试就是点点点?