Как это кодируется? RIP-относительный или абсолютный?
Если это абсолютное значение, используется режим адресации расширенного-disp32 (потому что 32-bit displacements in addressing modes are always sign extended, даже если нет зарегистрированных регистров).
Если это RIP-родственник, тогда ваш дизассемблер должен показывать правильный конечный адрес, рассчитанный из RIP + rel32.
Либо ваш дизассемблер, либо PIN-код отображают его неправильно, так как если он действительно расшифровывается на 64-битный, ваш дизассемблер должен показывать вам это.
И да, как RIP-относительная, так и абсолютная адресация возможны в x86-64.
x86-32 имел два избыточных способа кодирования [disp32]
режимы адресации без регистров. x86-64 переводит более короткий, как RIP-относительный, и оставляет более длинным как абсолютную адресацию [sign-extended-disp32]
.
Я использую синтаксис NASM для примера. Вы можете использовать default rel
использовать RIP-родственницы по умолчанию, и вы можете переназначить на индивидуальной основе случая, как это:
MOV RAX, [abs FS:_start] ; _start just as something that assembles
MOV RAX, [rel FS:_start] ; RIP-rel for thread-local is usually not useful!
64 48 8b 04 25 b5 00 40 00 mov rax,QWORD PTR fs:0x4000b5
64 48 8b 05 e7 fe ff ff mov rax,QWORD PTR fs:[rip+0xfffffffffffffee7] # 4000b5 <_start>
Является ли этот адрес возможный адрес?
Да, используются адреса в верхней половине канонического диапазона. например less /proc/self/maps
показывает, что Linux отображает vsyscall
страницу экспортирующихся в высокое адресном пространство:
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Canonical адрес означает, что биты [63:48]
являются копиями бит 47. то есть адрес, что вы получите от знака удлинителей низких 48 бит , Неканонические адреса всегда будут сбой на текущем оборудовании, поэтому, если вы хотите реализовать что-то вроде тегов с указанными избыточными битами, вам все равно придется повторить расширение знака до разыменования.
Обратите внимание, что qword ptr
говорит вам размер операнда, а не что-нибудь о том, как кодируются режим адресации.
Я уверен, что в течение прошлого года возник вопрос о том, были ли 32-битные абсолютные адреса ноль или знак расширенными, но это, вероятно, не является точным дубликатом. Кажется, я вспомнил, что Шут ответил на это. –