Почему код ассемблера не вызывает ошибку сегментации?

Написан простейший код:
section .data
des     dq       0xffffffffffffffff
section .text
global _start
_start:
mov     qword   [des], 4
mov rax, 1
mov rbx, 0
int 0x80

Первая команда (mov qword [des], 4), по идее, должна записать 4 в память по адресу 0xffffffffffffffff, что должно, как мне кажется, вызвать ошибку сегментации, но в итоге программа удачно завершается. Почему так происходит? Правильно ли разыменовывается переменная?([des]).

[root@arch exploits]# ./a.out
[root@arch exploits]#
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
@galaxy
Я уже подзабыл интеловский синтаксис ассемблера, но mov qword [des] и mov qword des - одно и то же. Операнды в x86/x64 могут быть типа immediate, register и memory (думаю, понятно, о чем речь). Разыменовать можно только операнды типа register и immediate, поэтому был бы сегфолт на:
mov qword [0xffffffffffffffff], 4

или

mov rax, offset des ; вроде такой синтаксис
mov qword [rax], 4
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev
software engineer
IMHO подразумевается 32-битный адрес, поэтому из des берется только первые 4 байта и 4 заносится по адресу 0xffffffff
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы