【问题标题】:returned pointer address getting modified when ASLR turned on当 ASLR 打开时,返回的指针地址被修改
【发布时间】:2015-05-08 04:16:23
【问题描述】:

我在启用了 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 是不同的。

【问题讨论】:

  • 您在什么硬件/操作系统上运行它?此代码属于哪个库/框架?或者这是你自己的代码?如果是这样,您能否分享一个可以编译和运行以重现该问题的最小程序?...
  • 请发布您的代码的最小工作示例。看起来您正在发生屏蔽和符号扩展。
  • 这几乎肯定与 ASLR 没有任何关系。更有可能是您的代码中的错误。但是除非您显示代码,否则没有人知道。
  • 我添加了与原始库代码尝试执行的操作相对应的示例代码。

标签: c pointers pass-by-reference aslr char-pointer


【解决方案1】:

我的猜测是 func 需要一个 int 或其他只有 4 个字节宽的东西,然后参数被强制转换为一个指针类型,该指针类型对其进行符号扩展。除了编译器(gcc?)即使没有像 -Wall 这样的标志也会警告你,但是嘿,也许你有奇怪的宏或其他混淆它的东西。

另外,传递的意思是您返回它(而不是作为参数传递)。如果缺少函数声明,C 默认将 int 作为返回值可以很容易地解释这一点。因此,在这种情况下,请确保您已声明了内容。

【讨论】:

    猜你喜欢
    • 2015-12-02
    • 1970-01-01
    • 2019-07-17
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多