我在启用了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;
}
当打开ASLR时,retadd和m1.addr不同。
答案 0 :(得分:2)
我的猜测是func接受一个只有4个字节宽的int或其他东西,然后该参数被转换为一个对其进行符号扩展的指针类型。除了编译器(gcc?)之外,即使没有像-Wall这样的标志也要警告你,但是嘿,也许你有奇怪的屁股宏或者混淆它的东西。
或者你通过传递的意思是你返回它(而不是作为参数传递)。如果函数声明丢失,C可以很容易地解释为 int 作为返回值。因此,在这种情况下,请确保您已声明了内容。