Почему этот адрес памяти% fs: 0x28 (fs ) имеет случайное значение?

Я написал fragment кода C, и я разобрал его, а также прочитал регистры, чтобы понять, как работает программа в сборке.

int test(char *this){ char sum_buf[6]; strncpy(sum_buf,this,32); return 0; } 

Часть моего кода, которую я изучал, является тестовой функцией. Когда я разбираю вывод, моя тестовая функция я получаю …

  0x00000000004005c0 : mov %fs:0x28,%rax => 0x00000000004005c9 : mov %rax,-0x8(%rbp) ... stuff .. 0x00000000004005f0 : xor %fs:0x28,%rdx 0x00000000004005f9 : je 0x400600  0x00000000004005fb : callq 0x4004a0  0x0000000000400600 : leaveq 0x0000000000400601 : retq 

То, что я хотел бы знать, это то, что mov %fs:0x28,%rax действительно делает?

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

В частности, происходит то, что FS:0x28 в Linux хранит специальное значение контрольной суммы стека, а код выполняет проверку безопасности стека. Например, если вы посмотрите дальше в своем коде, вы увидите, что значение в FS:0x28 сохраняется в стеке, а затем содержимое стека вызывается и выполняется XOR с исходным значением в FS:0x28 , Если два значения равны, это означает, что нулевой бит был установлен, потому что XOR двумя одинаковыми значениями приводит к нулевому значению, то мы переходим к test процедуре, иначе мы переходим к специальной функции, которая указывает что стек был каким-то образом поврежден, а значение часового, хранящееся в стеке, было изменено.

Если вы используете GCC, это можно отключить с помощью

 -fno-stack-protector 

Глядя на http://www.imada.sdu.dk/Courses/DM18/Litteratur/IntelnATT.htm , я думаю, что %fs:28 фактически является смещением 28 байтов от адреса в %fs . Поэтому я думаю, что он загружает полный размер регистра из местоположения %fs + 28 в% rax.