Я пытаюсь завершить программу с этой целью:
Возьмите один аргумент, представляющий собой шестнадцатеричное число, представляющее адрес памяти. Если адрес находится в виртуальной памяти процесса, выведите значение одного байта памяти, расположенного по этому адресу. Если нет, выйдите.
Это код, который у меня есть:
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