段间跳转之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 ... 
随机推荐
- 给Winform中的TabControl添加更现代的拖拽功能
			上周接到一个开发任务,大致是允许APP中的Tab拖动以成为一个独立Tab,脱离之前的TabControl,就是现在Web拖动标签页创建新窗口的功能,现在浏览器必备的功能,应该很简单,然而我司采用的Do ... 
- redis雪崩,穿透,击穿
			缓存雪崩:同一时间大量key到过期时间失效,可在设置失效时间时加随机数,如果直接修改数据库,那么一定会有不一致,通过失效时间去反复刷新缩短不一致的时间, 为了避免数据一直存在,一定要设置过期时间如果通 ... 
- 复制粘贴Ctrl+C改为自定义单键
			目录 那一瞬间不想用Ctrl+C了 (一)搜索渠道 关键词搜索 (二)方案对比 (三)最终方案Ditto 使用方法 (四)案例 1. 替换Ctrl+C快捷键: 2. 将英文小写替换为大写: 那一瞬间不 ... 
- java位运算求一个整数的绝对值
			1 import java.util.Scanner; 2 3 public class Question1 { 4 public static void main(String[] args) { ... 
- 力扣 - 347. 前 K 个高频元素
			目录 题目 思路1(哈希表与排序) 代码 复杂度分析 思路2(建堆) 代码 复杂度分析 题目 347. 前 K 个高频元素 思路1(哈希表与排序) 先用哈希表记录所有的值出现的次数 然后将按照出现的次 ... 
- 七大php主流框架,你用过几个?
			在php中,我们最常用的框架有七个,分别是Yii2.Laravel.Yaf.Thinkphp.Code Igniter.Zend Framework以及CakePHP,今天我们就来详细介绍一下他们.一 ... 
- JS基础学习第一天
			JavaScript JavaScript负责页面中的的行为. 它是一门运行在浏览器端的脚本语言. JS的编写的位置 1.可以编写到标签的指定属性中 12 <button onclick=&qu ... 
- 记一次metasploitable2内网渗透之21,22,23,25端口爆破
			Hydra是一款非常强大的暴力破解工具,它是由著名的黑客组织THC开发的一款开源暴力破解工具.Hydra是一个验证性质的工具,主要目的是:展示安全研究人员从远程获取一个系统认证权限. 目前该工具支持以 ... 
- hbuilderX打包苹果证书的申请方法
			现在uniapp越来越火,hbuilderX和apicloud这些工具使用html+js语言就可以开发强大的app,大大降低了app开发的技术门槛. hbuilderX或apicloud在打包ios应 ... 
- Magicodes.IE.ASPNETCore之多样化接口使用
			1.安装包 Install-Package Magicodes.IE.AspNetCore 2.开始配置 在Startup.cs的Configure()方法中,在UseRouting()中间件之后,注 ... 
