c - проверить, выделен ли адрес памяти - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь завершить программу с этой целью:

Возьмите один аргумент, представляющий собой шестнадцатеричное число, представляющее адрес памяти. Если адрес находится в виртуальной памяти процесса, выведите значение одного байта памяти, расположенного по этому адресу. Если нет, выйдите.

Это код, который у меня есть:

int main(int argc, char const *argv[]) {
    unsigned long ret_adr = strtoul(argv[1], NULL, 16);
    int pid = getpid();
    FILE *file;
    char c[1000];

    char file_addr[20];
    sprintf(file_addr, "/proc/%d/maps", pid);
    puts(file_addr);

    if ((file = fopen(file_addr,"r")) == NULL){
       printf("Error! opening file\n");

       // Program exits if the file pointer returns NULL.
       exit(1);
    }

    while (fgets(c, sizeof(c), file) != NULL) {
        printf("%s\n", c);
        sleep(1);
    }

    printf("pid: %d\n", pid);

    unsigned long* p = (unsigned long *)ret_adr;
    unsigned long first_byte = p[0];
    printf("%lu\n", first_byte);
    return 0;
}

Я могу получить доступ к /proc/<pid>/maps, но я не знаю, как проверить, находится ли ret_adr в карты или нет.

В нижней части кода я попытался получить указатель адреса, а затем получить байт этого указателя. Но я не верю, что это правильный ответ, потому что сам адрес должен быть «указателем», а не указателем этой переменной.

Это мой терминал для справки:

[task1]$ setarch x86_64 -R ./task1 400000
/proc/30879/maps
pid: 30879
282584257676671

1 Ответ

1 голос
/ 25 марта 2020

Вы можете вручную проанализировать файл карт.

Но есть еще одна хитрость, которая существует в Unix с тех пор: попытка вызвать функцию write, используя указатель в качестве буфера и файл дескриптор открыт до /dev/null. Если адрес памяти хорош, он будет успешным. Если это не так, вы получите код ошибки EFAULT в errno.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...