2015-05-08 6 views
0

У меня есть эта часть кода 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 включена.

+0

Какое оборудование/ОС вы используете? К какой библиотеке/структуре относится этот код? Или это ваш собственный код? Если да, можете ли вы поделиться минимальной программой, которую можно скомпилировать и запустить для воспроизведения проблемы? ... – TheCodeArtist

+0

Просьба представить минимальный рабочий пример вашего кода. Похоже, у вас есть маскировка и расширение знака. – DevNull

+0

Это почти не имеет никакого отношения к ASLR. Скорее всего, ошибка в коде. Но никто не может сказать, если вы не покажете код. – kaylum

ответ

2

Мое предположение, что func принимает int или что-то еще только 4 байта в ширину, тогда аргумент получает листинг типа указателя, который расширяет его. За исключением того, что компилятор (gcc?) Должен предупредить вас даже без флагов, таких как -Wall, но эй, может быть, у вас есть макросы странной задницы или что-то, что запутывает его.

В качестве альтернативы, вы имеете в виду, что вы передаете его (в отличие от передачи в качестве аргумента). Это может быть легко объяснено тем, что C не выполняет int как возвращаемое значение, если отсутствует декларация функции. Поэтому в этом случае убедитесь, что вы получили объявление.