负段索引?
Negative segment index?
是否可以访问具有负索引的段寄存器?
如果是,结果会怎样?这甚至有意义吗?
mov rcx, cs:off_619528 ; 0xFFFFFFFFFFFFFFD0 -> -48
mov rdx, fs:[rcx]
显然在 64 位模式下 cpu 非常懒惰,只是将段基址添加到给定的偏移量。因此,负值是有效的并且会做人们期望的事情,即在段基址之前的地址。不过地址仍然需要有效。
示例代码:
#include <stdio.h>
#include <asm/prctl.h>
#include <sys/prctl.h>
int main()
{
unsigned char* addr;
unsigned char val;
arch_prctl(ARCH_GET_FS, &addr);
printf("FS base: %p\nold value: 0x%02x\n", addr, addr[-48]);
addr[-48] = 0x42;
printf("new value: 0x%02x\n", addr[-48]);
__asm__ __volatile__ ( "movb %%fs:(%1), %0" : "=r" (val) : "r" (-48LL));
printf("read using fs: 0x%02x\n", val);
return 0;
}
示例输出:
$ ./a.out
FS base: 0x7ff053c03700
old value: 0x00
new value: 0x42
read using fs: 0x42
PS: 对不起,我第一次弄错了。
是否可以访问具有负索引的段寄存器? 如果是,结果会怎样?这甚至有意义吗?
mov rcx, cs:off_619528 ; 0xFFFFFFFFFFFFFFD0 -> -48
mov rdx, fs:[rcx]
显然在 64 位模式下 cpu 非常懒惰,只是将段基址添加到给定的偏移量。因此,负值是有效的并且会做人们期望的事情,即在段基址之前的地址。不过地址仍然需要有效。
示例代码:
#include <stdio.h>
#include <asm/prctl.h>
#include <sys/prctl.h>
int main()
{
unsigned char* addr;
unsigned char val;
arch_prctl(ARCH_GET_FS, &addr);
printf("FS base: %p\nold value: 0x%02x\n", addr, addr[-48]);
addr[-48] = 0x42;
printf("new value: 0x%02x\n", addr[-48]);
__asm__ __volatile__ ( "movb %%fs:(%1), %0" : "=r" (val) : "r" (-48LL));
printf("read using fs: 0x%02x\n", val);
return 0;
}
示例输出:
$ ./a.out FS base: 0x7ff053c03700 old value: 0x00 new value: 0x42 read using fs: 0x42
PS: 对不起,我第一次弄错了。