首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个内存地址%fs:0x28 ( fs[0x28] )有一个随机值?

为什么这个内存地址%fs:0x28 ( fs[0x28] )有一个随机值?
EN

Stack Overflow用户
提问于 2012-04-26 00:30:46
回答 3查看 34.2K关注 0票数 50

我编写了一段C代码,并对它进行了分解,并阅读了寄存器,以了解程序在汇编中是如何工作的。

代码语言:javascript
运行
复制
int test(char *this){
    char sum_buf[6];
    strncpy(sum_buf,this,32);
    return 0;
}

我一直在检查的代码的一部分是测试函数。当我分解输出,我的测试函数,我得到..。

代码语言:javascript
运行
复制
   0x00000000004005c0 <+12>:        mov    %fs:0x28,%rax
=> 0x00000000004005c9 <+21>:        mov    %rax,-0x8(%rbp)
... stuff ..
   0x00000000004005f0 <+60>:        xor    %fs:0x28,%rdx
   0x00000000004005f9 <+69>:        je     0x400600 <test+76>
   0x00000000004005fb <+71>:        callq  0x4004a0 <__stack_chk_fail@plt>
   0x0000000000400600 <+76>:        leaveq 
   0x0000000000400601 <+77>:        retq 

我想知道的是mov %fs:0x28,%rax到底在做什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-26 01:03:02

为了访问特殊的操作系统数据结构,FSGS寄存器都可以用作基准指针地址。因此,您所看到的是从FS寄存器中持有的值加载到偏移量处的值,而不是对FS寄存器内容的位操作。

具体而言,在Linux上的FS:0x28正在存储一个特殊的哨兵堆栈保护值,而代码正在执行堆栈保护检查。例如,如果进一步查看代码,您将看到FS:0x28中的值存储在堆栈上,然后会召回堆栈的内容,并在FS:0x28处使用原始值执行XOR。如果这两个值相等,这意味着由于XOR‘对两个相同的值中的两个值产生零值而设置了零位,那么我们跳到test例程,否则我们跳转到一个特殊的函数,该函数指示堆栈以某种方式损坏,并且存储在堆栈上的前哨值被更改。

如果使用GCC,this can be disabled with

代码语言:javascript
运行
复制
-fno-stack-protector
票数 86
EN

Stack Overflow用户

发布于 2019-07-08 04:56:15

代码语言:javascript
运行
复制
glibc:
  uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard (_dl_random);
# ifdef THREAD_SET_STACK_GUARD
  THREAD_SET_STACK_GUARD (stack_chk_guard); 

the _dl_random from kernel.
票数 0
EN

Stack Overflow用户

发布于 2012-04-26 00:43:17

看看http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm,我认为%fs:28实际上是%fs地址的28个字节的偏移量。所以我认为它正在从location %fs + 28加载一个完整的寄存器大小到%rax。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10325713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档