首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Linux AMD64中使用fs/gs寄存器?

在Linux AMD64中使用fs/gs寄存器,需要了解它们的功能和用途。fs和gs寄存器是x86_64架构中的两个16位寄存器,它们可以存储64位地址,用于指向特定的内存区域。这些内存区域通常用于存储特定的数据或实现特殊的功能。

fs寄存器通常用于指向线程局部存储(Thread Local Storage,TLS)区域,TLS是一种线程私有数据存储机制,允许每个线程拥有自己的私有数据副本。fs寄存器的地址可以通过%fs:0来访问,其中%fs表示fs寄存器,0表示偏移量。

gs寄存器通常用于指向内核空间的数据区域,例如内核栈和内核TLS区域。在Linux内核中,gs寄存器的地址可以通过%gs:0来访问。

要在Linux AMD64中使用fs/gs寄存器,需要使用汇编语言编写代码。以下是一个简单的示例,展示了如何在x86_64架构中使用fs寄存器访问TLS区域:

代码语言:txt
复制
.section .tdata
var:
    .long 0

.section .text
.globl _start
_start:
    movq %fs:0, %rax
    movq var@tpoff(%rip), %rdx
    addq %rax, %rdx
    movl $1, (%rdx)
    movl $60, %eax
    xorq %rdi, %rdi
    syscall

在这个示例中,我们首先将fs寄存器的值加载到rax寄存器中,然后计算TLS变量的地址,并将1存储在该地址处。最后,我们调用系统调用退出程序。

需要注意的是,在使用fs/gs寄存器时,需要遵循操作系统和编译器的规范,以确保正确访问内存区域。同时,由于这些寄存器的用途和实现方式可能因操作系统和硬件架构而异,因此在使用它们时需要了解具体的实现细节。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

汇编FS寄存器的说明和使用

FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移 说明 000 指向SEH链指针 004 线程堆栈顶部 008 线程堆栈底部 00C SubSystemTib 010 FiberData...014 ArbitraryUserPointer 018 FS寄存器在内存的镜像地址 020 进程PID 024 线程ID 02C 指向线程局部存储指针 030 PEB结构地址(进程结构...) 034 上个错误号 了解了FS寄存器的数据构成,即可轻松使用汇编语言获得自身PID和TID,例如获取PID,只需要取fs:[20h]即可。...下面是另一个稍复杂的使用场景:获取KERNEL32.DLL基址(来自互联网,本人未经验证)。...得到KERNEL32.DLL基址的方法 assume fs:nothing ;打开FS寄存器 mov eax,fs:[30h] ;得到PEB结构地址 mov eax,[eax + 0ch] ;得到

4.2K40

golang源码分析:go 汇编

目前使用最为广泛的AMD64这种体系结构的CPU,这种CPU共有20多个可以直接在汇编代码中使用寄存器,其中有几个寄存器在操作系统代码才会见到,而应用层代码一般只会用到如下分为三类的19个寄存器。...它用来存放下一条即将执行的指令的地址,这个寄存器决定了程序的执行流程; 段寄存器fsgs寄存器。...一般用它来实现线程本地存储(TLS),比如AMD64 linux平台下go语言和pthread都使用fs寄存器来实现系统线程的TLS,在本章线程本地存储一节和第二章详细分析goroutine调度器的时候我们可以分别看到...Linux平台下Pthread线程库和go是如何使用fs寄存器的。...上述这些寄存器除了fsgs寄存器是16位的,其它都是64位的,也就是8个字节,其中的16个通用寄存器还可以作为32/16/8位寄存器使用,只是使用时需要换一个名字,比如可以用eax这个名字来表示一个

91530
  • go语言调度器源代码情景分析之二:CPU寄存器

    假设有如下go语言编写的一行代码: c = a + b 在AMD64 Linux平台下,使用go编译器编译它可得到如下AT&T格式的汇编代码(如果对汇编代码不熟悉的话可以直接看每一条指令后面的注释,不影响我们理解...它用来存放下一条即将执行的指令的地址,这个寄存器决定了程序的执行流程; 段寄存器fsgs寄存器。...一般用它来实现线程本地存储(TLS),比如AMD64 linux平台下go语言和pthread都使用fs寄存器来实现系统线程的TLS,在本章线程本地存储一节和第二章详细分析goroutine调度器的时候我们可以分别看到...Linux平台下Pthread线程库和go是如何使用fs寄存器的。...上述这些寄存器除了fsgs寄存器是16位的,其它都是64位的,也就是8个字节,其中的16个通用寄存器还可以作为32/16/8位寄存器使用,只是使用时需要换一个名字,比如可以用eax这个名字来表示一个

    1.1K40

    ROP-SROP学习

    内核为该进程保存相应上下文,主要是将所有寄存器压入栈,以及压入signal信息,以及指向sigreturn的系统调用地址。...这里以Linux为例: 在第二步的时候,内核会帮用户进程将其上下文保存在该进程的栈上,然后在栈顶填上一个地址rt_sigreturn,这个地址指向一段代码,在这段代码中会调用sigreturn系统调用。...地址,根据相应寄存器的值,此时便会得到shell 如果需要多次使用该方法 只需要修改signal frame的两处即可: 将signal frame的RSP指向下一个signal frame的地址...(arch='amd64',os='linux',log_level='debug') sh = process("....ucontext_t 结构体 X86 struct sigcontext { unsigned short gs, __gsh; unsigned short fs, __fsh; unsigned

    1.3K10

    保护模式 2讲 -段 -段寄存器结构

    出了FS寄存器.还有 ES CS SS DS GS LDTR TR等段寄存器 我们上面所说的 段.base 其实是段寄存器的一个成员....可以理解为段寄存器就是一个结构体 PS: 在inter手册也称为段寄存器为段描述符 2.2 段寄存器结构 在我们x86平台下.我们知道一个寄存器是 4个字节. 32位. 可以表达一个32位的数据....使用OD 或者X64dbg看段寄存器只会显示16位的段选择子可见部分....(分段机制) 0x003B 可读,可写 0x7FFDF000 0xFFF GS使用使用使用使用 2.4.2 段寄存器的 段属性探测 我们可以巧妙的利用汇编.来探测一下段属性 是否存在的...FS是有基地址的. 当其赋值给gs的时候. gs代表的就是fs. 所以用 gs去操作[0]地址是有效的.

    1.4K20

    linux内核上下文切换解析

    linux的上下文切换就是进程线程的切换,也就是切换struct task_struct结构体,一个任务的上下文包括cpu的寄存器,内核栈等,由于1个cpu上的所有任务共享一套寄存器,所以在任务挂起的时候需要保存寄存器...但是Linux为了适用更多的cpu架构没使用处理器相关的上下文切换技术,而是大部分通过软件实现。linux上下文切换就在schedule()函数里,很多地方都会调用这个函数。...先看一段linux2.6.18版本还使用O(1)调度算法的schedule函数代码: /* * schedule() is the main scheduler function. */ asmlinkage...prev->fs); savesegment(gs, prev->gs); /* * 装载每线程的线程本地描述符 */ load_TLS(next, cpu); /* *装载新的...fs gs */ if (unlikely(prev->fs | next->fs)) loadsegment(fs, next->fs); if (prev->gs | next->gs

    1.3K31

    Linux64位程序的漏洞利用

    EIP 段寄存器: CS SS DS ES FS GS 指示器: EFLAGS 其中EAX~EDX四个通用寄存器支持部分引用, EAX低16位可通过AX来引用, AL的高8位和低8位又可以分别通过...段寄存器 作用 CS Code Segment SS Stack Segment DS Data Segment ES,FS,GS 主要用作远指针寻址 指示器EFLAGS保存了指令运行的一些状态(flag...因为64位程序有了更多的通用寄存器, 所以通常会使用寄存器来进行函数参数传递 而不是通过栈, 来获得更高的运行速度....本文主要是介绍Linux平台下的漏洞利用, 所以就专注于System V AMD64 ABI 的调用约定, 即函数参数从左到右依次用寄存器RDI,RSI,RDX,RCX,R8,R9来进行传递, 如果参数个数多于...可惜使用常见的自动化rop工具在小型程序难以找到合适的gadget.

    1.2K70

    何在Linux检查内存使用情况

    在对系统或应用程序速度减慢或行为异常进行故障排除时,首先要检查的问题之一是系统内存使用情况。 本文介绍了如何使用几种不同的命令来检查Linux的RAM使用情况。...free命令 free是用于检查Linux系统内存使用的最常用命令。 它显示有关总内存,已用内存和可用内存的信息。...used-已使用的内存。 计算公式为:used = total - free - buffers - cache free -可用/未使用的内存。...可以解析/proc/meminfo文件的信息,并在shell脚本中使用。 ps_mem脚本 ps_mem是一个Python脚本,用于报告每个程序的RAM内存使用情况。...它可以与Python 2和3一起使用,并且可以使用pip安装 sudo pip3 install ps_mem 运行ps_mem需要管理员权限: sudo ps_mem 输出将按升序包括每个正在运行的程序的内存使用情况

    5.8K30

    操作系统开发:BIOSMBR基础与调试

    这里在实验之前需要下载 Bochs-win32-2.6.11 作者使用的是Linux版本的,在Linux写代码不太舒服,所以最好在Windows上做实验,下载好虚拟机以后还需要下载Nasm汇编器,以及GCC...编译器,为了能够使用DD命令实现磁盘拷贝,这里你可以安装windows 10 下面的子系统Ubuntu,需要使用命令时可以直接切换。...并将编译好的mbr.bin写入到镜像 dd if=mbr.bin of=linux.img bs=512 count=1 conv=notrunc 在Bochs目录下新建并编辑bosh.src保存...多数情况下,南桥和北桥是成对出现的,南桥主要负责连接PCI,PCI-Express,AGP等低速设备,而北桥则用于链接高速设备,内存等。...IO接口都是串行口,其在设计之初就是负责与CPU进行通信的,我们想要与CPU通信,其实是向这些接口中写入数据,同时为了区别CPU寄存器,所以把IO接口叫做端口,某些外设可以通过内存映射来访问,即把某些端口映射到指定内存

    32420

    操作系统开发:BIOSMBR 编写开机引导

    这里在实验之前需要下载 Bochs-win32-2.6.11 作者使用的是Linux版本的,在Linux写代码不太舒服,所以最好在Windows上做实验,下载好虚拟机以后还需要下载Nasm汇编器,以及GCC...编译器,为了能够使用DD命令实现磁盘拷贝,这里你可以安装windows 10 下面的子系统Ubuntu,需要使用命令时可以直接切换。...并将编译好的mbr.bin写入到镜像 dd if=mbr.bin of=linux.img bs=512 count=1 conv=notrunc 在Bochs目录下新建并编辑bosh.src保存...多数情况下,南桥和北桥是成对出现的,南桥主要负责连接PCI,PCI-Express,AGP等低速设备,而北桥则用于链接高速设备,内存等。...IO接口都是串行口,其在设计之初就是负责与CPU进行通信的,我们想要与CPU通信,其实是向这些接口中写入数据,同时为了区别CPU寄存器,所以把IO接口叫做端口,某些外设可以通过内存映射来访问,即把某些端口映射到指定内存

    1.3K20

    Linux内核13-进程切换

    1.2 任务状态段-TSS x86架构包含一个特殊的段寄存器,称为任务状态段(TSS),用来保存硬件上下文内容。尽管Linux使用硬件上下文切换,但还是给每个不同CPU建立一个TSS。...在Linux的设计,每个CPU就只有一个TSS,所以,Busy位总是设为1。换句话说,LinuxType域一般为11。...为了强制函数从寄存器获取参数,内核使用__attribute__和regparm进行声明。这是gcc编译器对C语言的一个非标准扩展。...3个段选择器存储在进程描述符的tls_array数组。 存储fsgs寄存器的内容到旧进程的prev_p->thread.fs和prev_p->thread.gs。...汇编指令如下: 寄存器esi指向prev_p->thread结构。gs寄存器用来存放TLS段的地址。fs寄存器实际上windows使用。 加载新进程的fsgs寄存器内容。

    1.9K20

    80386的各种寄存器一览

    注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程的一些概念性问题...(16位) • CS:代码段寄存器 • DS:数据段寄存器 • SS:堆栈段寄存器 • ES、FSGS:附加数据段寄存器 这些段寄存器存放的不再是某个段的基地址,而是某个段的选择符(Selector...因为16 位的寄存器无法存放32 位的段基地址,段基地址只好存放在段的描述符(Descriptor)。...3、标志和控制寄存器(32位) 标志寄存器 EFLAGS 指令指针 EIP 机器状态字 CR0 Intel 预留 CR1 页故障地址 CR2 页目录地址 CR3 指令指针寄存器(EIP)存放下一条将要执行指令的偏移量...• 任务状态寄存器TR(Task State Register)是16 位寄存器,用于保存任务状态段TSS 段的16 位选择符。 ? 5、调试寄存器和测试寄存器(32位) ?

    1.7K01

    【连载】两百行Rust代码解析绿色线程原理(五)附录:支持 Windows

    除了 XMM 寄存器,rdi 和 rsi 寄存器在 Windows 上也是非易失性的,这意味着它们已由被调用者保存(在Linux上,这些寄存器用于第一个和第二个函数参数),因此我们也需要添加它们。...显然,这些段寄存器(x64 上的 GS 和 x86 上的 FS)是 Intel 旨在[允许程序访问许多不同的内存段](https://stackoverflow.com/questions/10810203.../what-is-the-fs- gs-register-intended-for)而设计的,它们原本打算作为永久性虚拟存储的一部分。...这意味着操作系统可以自由地将这些段寄存器用于其认为适当的用途。Windows 将当前正在运行线程的相关信息存储在 GS 寄存器,而 Linux 使用这些寄存器进行线程本地存储。...你会看到,当我们从 128 位寄存器移出数据时,我们需要使用一些特殊的汇编指令。

    65520

    何在 Ubuntu Linux 设置和使用 FTP 服务器?

    在 Ubuntu Linux ,您可以设置和使用 FTP 服务器,以便通过网络与其他设备共享文件。本文将详细介绍如何在 Ubuntu Linux 设置和使用 FTP 服务器。...执行以下命令以安装 vsftpd:sudo apt updatesudo apt install vsftpd安装过程,您可能需要输入您的管理员密码进行确认。...打开 vsftpd 配置文件使用您喜欢的文本编辑器( Nano 或 Vim)打开 vsftpd 配置文件 /etc/vsftpd.conf:sudo nano /etc/vsftpd.conf2....Nautilus:Nautilus 是 GNOME 桌面环境的文件管理器,支持 FTP 协议。...结论通过按照以上步骤,在 Ubuntu Linux 设置和使用 FTP 服务器是相对简单的。通过安装和配置 vsftpd,您可以轻松地在本地网络上共享文件,并通过 FTP 客户端进行文件传输。

    1.7K10
    领券