(Ubuntu) ASLR - очистить беспорядок, странный результат - PullRequest
0 голосов
/ 17 декабря 2018

Привет! Я использую Ubuntu и просто отключил ASLR, чтобы проверить 2 файла (dumb.c и dumber.c)

тупо создает файл и вводит в него переменный адрес

тупее читает и печатает У меня есть проблема, чтобы понять причину, почему на некоторых компьютерах печатается 16, а на других 32767

dumb.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;
}

dumber.c

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

int main()
{
    int i = 8;
    int j = 16;
    int k = 32;
    int *p = &j;

    FILE *fp;

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

    fscanf(fp, "%p\n", &p);

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

    printf("\nDumber Address: %p\n", (void *)p);
    printf("p points to: %d\n", *p);

    return EXIT_SUCCESS;
}

1 Ответ

0 голосов
/ 17 декабря 2018

В 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 в файл, а тупые процессы считывают это смещение, а поскольку тупой процесс имеет значение j втакое же смещение, как и у тупого процесса, вы получите доступ к j.В ASLR адрес, который видит тупее, был действительным адресом для тупого процесса, но, скорее всего, не действительным адресом для тупого (вероятно, нет сопоставления для этого адреса для тупого)

Вы можете проверить это, изменив положение jв одном из процессов сделайте это, и вы никогда не увидите 16, напечатанных как значение по адресу, указанному j в тупом процессе.

...