段间跳转之TSS段
TR寄存器,TSS描述符,TSS段
TR寄存器与普通的段寄存器一样都有可见部分和不可见部分。TR的可见部分为16位为其段选择子,不可见部分是32位的TSS基地址和16位的大小。

TSS描述符存在GDT表中,注意其G位为0,所以TSS段的大小Limit的单位为字节,TYPE位为10B1(B为忙碌标志)。cpu利用TSS描述符来填充TR寄存器不可见部分。

TSS段是一个104个字节的内存,是Inter用来提供实现任务切换的,但是windows和linux都没有使用。TR寄存器隐藏部分的基地址就是TSS段的基地址。TSS可以保存一堆寄存器实现一次替换所有寄存器。Previous Task Link用来保存旧的段选择子,iretd指令利用此字段返回。

读写TR寄存器
Ring 0
ldt指令是一个特权指令,其能够为TR寄存器的可见部分提供一个值。
sdt指令是一个不同指令,其能够从TR寄存器中读取可见部分的值。
Ring 3
在应用层只能通过jmp far和call far指令更改TR寄存器,读TR寄存器与在0环相同都是通过SDT指令。
利用jmp far更改TR寄存器
构造一个TSS段描述符,0000E95D`00000068,即TSS段的基地址为0x005D0000,长度为0x68(104)个字节。

我们构造TSS段,给各个字段赋值。其中我们让cs为8,cpl为0是为了提权。
TSS[0] = 0x00000000; // Previous Task Link
TSS[1] = 0x00000000; // ESP0
TSS[2] = 0x00000000; // SS0
TSS[3] = 0x00000000; // ESP1
TSS[4] = 0x00000000; // SS1
TSS[5] = 0x00000000; // ESP2
TSS[6] = 0x00000000; // SS2
TSS[7] = dwCr3; // CR3
TSS[8] = (DWORD)TestPorc; // EIP
TSS[9] = 0x00000000; // EFLAGS
TSS[10] = 0x00000000; // EAX
TSS[11] = 0x00000000; // ECX
TSS[12] = 0x00000000; // EDX
TSS[13] = 0x00000000; // EBX
TSS[14] = (DWORD)esp; // ESP
TSS[15] = 0x00000000; // EBP
TSS[16] = 0x00000000; // ESI
TSS[17] = 0x00000000; // EDI
TSS[18] = 0x00000023; // ES
TSS[19] = 0x00000008; // CS 0x0000001B
TSS[20] = 0x00000010; // SS 0x00000023
TSS[21] = 0x00000023; // DS
TSS[22] = 0x00000030; // FS 0x0000003B
TSS[23] = 0x00000000; // GS
TSS[24] = 0x00000000; // LDT Segment Selector
TSS[25] = 0x20ac0000; // I/O Map Base Address
执行jmp far 0x48:0x00000000,执行后我们发现代码跳转到了TestPorc地址处。EFLAGS的NT位被置位0,所以jmp far的TSS切换不能利用iret指令返回,如果要返回应该利用指令jmp far旧的TSS段选择子返回。

而且jmp far不会将旧的TSS段选择子保存在TSS段的Previous Task Link中,如果我们需要返回应该在跳转前保存旧的TSS段选择子,然后在利用jmp far指令返回。

注意其CPU在切换任务时,会将现在的TSS段描述符的TYPE的B忙位置1。

利用call far更改TR寄存器
构造一个TSS段描述符,0000E93F`00000068,即TSS段的基地址为0x003F0000,长度为0x68(104)个字节。

我们构造和jmp far一样的TSS段,给各个字段赋值。执行jmp far 0x48:0x00000000,执行后我们发现代码跳转到了TestPorc地址处。EFLAGS的NT位被置为1,所以call far的TSS切换能利用iret指令返回,其返回利用保存在TSS段中的
Previous Task Link保存的旧的TSS段选择子。

我们查看其TSS段,发现Previous Task Link的值为0x28,所以旧的TSS段选择子为0x28。

我们查看堆栈,发现call far 更改TR寄存器并不会更改堆栈的内容。

同样其也会将现在的TSS段描述符的TYPE的忙位B置1。

疑问
当jmp far 和 call far改变TR寄存器时我们使用的段选择子的RPL都为0,当RPL为3时会出错。
当jmp far 和 call far改变TR寄存器时我们的TSS段的cs的CPL为3会出错。
段间跳转之TSS段的更多相关文章
- “段寄存器”的故事[转](彻底搞清内存段/elf段/实模式保护模式以及段寄存器)
http://blog.csdn.net/michael2012zhao/article/details/5554023 一. 段寄存器的产生 段寄存器的产生源于Intel 8086 CPU体系结构中 ...
- 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }
[0]写在前面 0.1)我们讲 CPU的保护机制,它是可靠的多任务运行环境所必须的: 0.2) CPU保护机制:分为段级保护 + 页级保护: 0.2.1)段级保护分为:段限长 limit 检查.段类型 ...
- [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令
1- jmp为无条件转移指令,可以只修改IP, 也可以同时修改CS和IP jmp指令要给出两种信息: (1) 转移的目的地址 (2) 转移的距离(段间转移, 段内转移, 段内近转移) 2- 依据位移进 ...
- spring mvc controller间跳转 重定向 传参 (转)
转自:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求:spring MVC框架contr ...
- Spring mvc框架 controller间跳转 ,重定向 ,传参
一.需求背景 1. 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. @Req ...
- 应用程序间跳转 (友盟SSO 授权 与系统自带的分享)
应用程序间跳转的应用场景 使用第三方用户登录,如微信登录,返回用户名和密码 需要用户授权,返回到调用程序,同时返回授权的用户名 应用程序推广,跳转到itunes并显示指定app下载页 第三方支付,跳转 ...
- IOS 在控制器间跳转实现过渡动画
已经掌握了CALayer下的CATransition动画在同一个控制器下实现,但是在不同控制器间跳转又该如何实现呢? MyViewController *myVC = [[MyViewControll ...
- springMVC controller间跳转、重定向、传参
转载自:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求:spring MVC框架co ...
- Spring Mvc Controller间跳转 重定向 传参 (转)
原文链接:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ 1. 需求背景 需求:spring MVC框架con ...
随机推荐
- 攻防世界 reverse 新手练习区
1.re1 DUTCTF IDA shift+F12 查看字符串 DUTCTF{We1c0met0DUTCTF} 2.game ZSCTF zsctf{T9is_tOpic_1s_v5ry_int7r ...
- python那些需要知道的事儿——逻辑运算与比大小
一.逻辑运算 逻辑运算符: and or not,结果为布尔值(True和False) 1.基本逻辑运算符介绍 not :将后面的逻辑运算结果取反 >>> not 1 < ...
- redis数据库如何批量删除键和设置过期时间?
我们可以借助Linux中的xargs,在终端中执行命令来实现这两个功能. 一.批量删除键 批量删除以"key"开头key的方法,需要借助Linux中的xargs,在终端中执行以下命 ...
- kubernetes删除pod一直处于terminating状态的解决方法
kubernetes删除pod一直处理 Terminating状态 # kubectl get po -n mon NAME READY STATUS RESTARTS AGE alertmanage ...
- Elasticsearch扩展X-pack实施流程-实施
Elasticsearch扩展X-PACK实施流程 elasticsearch5.2.1安装X-PACK,对ES集群进行监控,报警,安全验证,报告,图形化操作 注意 版本号需要固定,小版本都不能差,要 ...
- [矩阵乘法] PKU3233 Matrix Power Series
[ 矩 阵 乘 法 ] M a t r i x P o w e r S e r i e s [矩阵乘法]Matrix Power Series [矩阵乘法]MatrixPowerSeries Desc ...
- Spring Security Oauth2 认证(获取token/刷新token)流程(password模式)
https://blog.csdn.net/bluuusea/article/details/80284458
- XSS-change通关历程
Level1:没有过滤. <script>alert(1)</script> <svg/onload=alert(1)> <script>confirm ...
- gitee 学习笔记
这个流程只能是在自己的测试仓库中联系哟 首先创建一个自己的仓库 接下来安装git客户端,通过gitee官网给了一个例子创建ssh密钥 然后输入命令 get clone 你仓库的https 或者ssh地 ...
- 重磅:谷歌强势回归! google大会报名
google退出中国已经很久了,有关google回归的消息也流传了很久,今天,我们迎来了回归的开幕式. 1.中国区开发者网站 不需要梯子,赶紧取感受下吧: https://developers.goo ...