У меня есть эта часть кода C, работающая на блоке разработки с включенным ASLR. Он возвращает обугленный указатель (символ *) к функции, но как-то несколько байт возвращаемого адреса указателя становятся изменены, выход Printf ниже:Возвращаемый адрес указателя, который был изменен при включении ASLR
kerb_selftkt_cache is 0x00007f0b8e7fc120
cache_str from get_self_ticket_cache 0xffffffff8e7fc120
Указатель символа 0x00007f0b8e7fc120
возвращается в другую функцию, которая изменяется как 0xffffffff8e7fc120
, который отличается от исходного адреса указателя на одно слово (4 байта) 0xffffffff
вместо 0x00007f0b
, последние четыре байта (8e7fc120
) являются такими же. Любая идея, что может быть? и как я могу это исправить. Код работает на 64-битной архитектуре Linux на Intel Xeon. Этот код из существующей собственной библиотеки, поэтому я не могу разделить точный код, но логика кода выглядит примерно так:
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;
}
retadd и m1.addr различны, когда ASLR включена.
Какое оборудование/ОС вы используете? К какой библиотеке/структуре относится этот код? Или это ваш собственный код? Если да, можете ли вы поделиться минимальной программой, которую можно скомпилировать и запустить для воспроизведения проблемы? ... – TheCodeArtist
Просьба представить минимальный рабочий пример вашего кода. Похоже, у вас есть маскировка и расширение знака. – DevNull
Это почти не имеет никакого отношения к ASLR. Скорее всего, ошибка в коде. Но никто не может сказать, если вы не покажете код. – kaylum