我在启用了 ASLR 的开发盒上运行了这段 C 代码。它正在向函数返回一个 char 指针 (char *),但返回的指针地址中的几个字节不知何故发生了变化,下面的 printf 输出:
kerb_selftkt_cache is 0x00007f0b8e7fc120
cache_str from get_self_ticket_cache 0xffffffff8e7fc120
char 指针0x00007f0b8e7fc120
被返回到另一个函数,该函数被修改,因为0xffffffff8e7fc120
它与原始指针地址相差一个字(4 字节)0xffffffff
而不是0x00007f0b
,最后四个字节(8e7fc120
)相同。知道会发生什么吗?以及我该如何解决这个问题。该代码在 Intel Xeon 上的 linux 64 位架构上运行。这段代码来自一个现有的专有库,所以我不能分享确切的代码,但代码逻辑看起来像这样:
typedef struct mystr {
int num;
char addr[10];
}mystr;
static mystr m1;
char *get_addr() {
return m1.addr;
}
void myprint() {
printf("mystr m1 address %p\n",&m1);
printf("mystr m1 addr %p\n",m1.addr);
}
int main (int argc, char *argv[]) {
char *retadd;
myprint();
retadd = get_addr();
printf("ret address %p\n",retadd);
return 0;
}
retadd 和 m1.addr 在 ASLR 开启时是不同的。