我编写了一段C代码,并对它进行了分解,并阅读了寄存器,以了解程序在汇编中是如何工作的。
int test(char *this){
char sum_buf[6];
strncpy(sum_buf,this,32);
return 0;
}
我一直在检查的代码的一部分是测试函数。当我分解输出,我的测试函数,我得到..。
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
到底在做什么?
发布于 2012-04-26 01:03:02
为了访问特殊的操作系统数据结构,FS
和GS
寄存器都可以用作基准指针地址。因此,您所看到的是从FS
寄存器中持有的值加载到偏移量处的值,而不是对FS
寄存器内容的位操作。
具体而言,在Linux上的FS:0x28
正在存储一个特殊的哨兵堆栈保护值,而代码正在执行堆栈保护检查。例如,如果进一步查看代码,您将看到FS:0x28
中的值存储在堆栈上,然后会召回堆栈的内容,并在FS:0x28
处使用原始值执行XOR
。如果这两个值相等,这意味着由于XOR
‘对两个相同的值中的两个值产生零值而设置了零位,那么我们跳到test
例程,否则我们跳转到一个特殊的函数,该函数指示堆栈以某种方式损坏,并且存储在堆栈上的前哨值被更改。
如果使用GCC,this can be disabled with
-fno-stack-protector
发布于 2019-07-08 04:56:15
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.
发布于 2012-04-26 00:43:17
看看http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm,我认为%fs:28
实际上是%fs
地址的28个字节的偏移量。所以我认为它正在从location %fs + 28
加载一个完整的寄存器大小到%rax。
https://stackoverflow.com/questions/10325713
复制相似问题