返回的指针地址在 ASLR 打开时被修改
returned pointer address getting modified when ASLR turned on
我在启用了 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
) 相同。知道会发生什么吗?我该如何解决这个问题。代码是 运行 on linux Intel Xeon 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时是不同的。
我的猜测是 func 接受一个 int 或其他只有 4 个字节宽的东西,然后参数被转换为一个指针类型,该指针类型对其进行符号扩展。除了编译器(gcc?)应该警告你,即使没有像 -Wall 这样的标志,但是嘿,也许你有奇怪的宏或混淆它的东西。
或者,您所说的传递的意思是您 return 它(而不是作为参数传递)。如果缺少函数声明,C 默认将 int 作为 return 值,这很容易解释。因此,在那种情况下,请确保您声明了内容。
我在启用了 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
) 相同。知道会发生什么吗?我该如何解决这个问题。代码是 运行 on linux Intel Xeon 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时是不同的。
我的猜测是 func 接受一个 int 或其他只有 4 个字节宽的东西,然后参数被转换为一个指针类型,该指针类型对其进行符号扩展。除了编译器(gcc?)应该警告你,即使没有像 -Wall 这样的标志,但是嘿,也许你有奇怪的宏或混淆它的东西。
或者,您所说的传递的意思是您 return 它(而不是作为参数传递)。如果缺少函数声明,C 默认将 int 作为 return 值,这很容易解释。因此,在那种情况下,请确保您声明了内容。