(ubuntu)ASLR-清除混乱,奇怪的结果

时间:2018-12-17 08:19:28

标签: c linux ubuntu aslr

嗨,我正在使用Ubuntu,只是关闭了我的ASLR来检查2个文件(dumb.c和dumber.c)

哑巴正在创建文件并输入变量地址

dumber正在阅读并进行打印我很难理解为什么在某些计算机中它可以打印16而其他计算机32767

dumb.c

$ curl -q -v \
   -H "Connection: keep-alive" \
   -H "Accept-Encoding: identity" \
   -H "Accept-Language: en-US" \
   -H "User-Agent: Mozilla/5.0"  \
   https://www.saiglobal.com/

dumber.c

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int i = 7;
    int j = 12;
    int k = 15;
    int *p = &j;

    FILE *fp;

    if(0 == (fp = fopen("dumb.txt", "w")))
    {
        printf("well, that didn\'t work!\n");
        return -1;
    }

    fprintf(fp, "%p\n", (void*)p);
    printf("Address from Dumb: %p, value: %d\n", (void *)p, *p);

    if(fclose(fp))
    {
        printf("oh well.");
        return -1;
    }

    sleep(300);

    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:0)

dumber.c,您拥有:

fscanf(fp, "%p\n", &p); /* getting address dumb process put there */

然后您拥有:

printf("p points to: %d\n", *p); /* reading memory content at that address */

因此,在哑处理中,您将读取哑处理在其中放置的地址,从这一点来看,p并不指向j

现在,通常来说,由于这两个主电源是不同的进程,因此不管ASLR如何,哑巴看到的内存地址的内容很可能与哑地址在同一地址的值不同。 这就是进程的工作方式(我假设这些进程在Linux \ Windows \ Mac中运行),它们被加载到具有不同虚拟和物理地址映射的不同物理地址,而且您也不知道在哑进程中此地址是否指向有效地址。

现在,这里发生的是当您使用ASLR运行时,两个进程之间的进程地址空间(进程使用的虚拟地址)肯定不同。  如果没有ASLR进程,则所有进程的地址空间都相同,无论如何,物理地址都可能不同。 由于两个进程的堆栈使用情况相同,所以哑进程将j的偏移量(虚拟地址)写入文件,而哑进程读取此偏移量,并且由于哑进程具有{ {1}}与dumber处理的偏移量相同,您将访问dumber的j。使用ASLR时,哑巴看到的地址是哑巴进程的有效地址,但很可能不是哑巴的有效地址(很可能对此哑巴地址没有映射)

您可以通过在其中一个过程中更改j的位置来进行验证,执行此操作,并且在哑处理过程中,您将永远不会看到j所指向的地址上打印16作为值。