如何在从 mmap 获取的地址上使用值?
How to use value on address acquired from mmap?
有这个nasm:
%define O_RDONLY 0
%define PROT_READ 0x1
%define MAP_PRIVATE 0x2
section .data
fname: db 'test.txt', 0
section .text
global _start
print:
; ---- THIS PART ADDED
mov r15, [rdi]
add r15, 1 ; have tried `inc byte[rdi]` - did not work either
mov [rdi], r15
; ---- END OF ADDED PART
; else is according to book (so correct)
push rdi
call str_len
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall
ret
str_len:
xor rax, rax
.loop:
cmp byte [rdi+rax], 0
je .end
inc rax
jmp .loop
.end:
ret
_start:
;call open
mov rax, 2
mov rdi, fname
mov rsi, O_RDONLY
mov rdx, 0
syscall
;mmap
mov r8, rax
mov rax, 9
mov rdi, 0
mov rsi, 4094
mov rdx, PROT_READ
mov r10, MAP_PRIVATE
mov r9, 0
syscall
mov rdi, rax ;returned address
call print
mov rax, 60
xor rdi, rdi
syscall
文件 test.txt
开头仅包含一个字符 - 5
.
我从 mmap
在 rax
中询问的区域获得了地址,然后我 mov
e 到 rdi
。
我只是想增加值(在那个地址 - 现在在 rdi
):
mov r15, [rdi]
add r15, 1 ; have tried `inc byte[rdi]` - did not work either
mov [rdi], r15
push rdi
所以我临时 mov
e r15
上的值,递增它(add
它 1),然后尝试 mov
e 它回到地址该地区(地址仍在 rdi
中)。但是 segfault
.
这是为什么?为什么我不能使用地址上的值(从 mmap 获取的区域),其中包含 5
- 一个字节(rdi
指向),并在算术中使用它?
如果是在data segment
声明的地址就没有问题了(我试过了)。但地址来自 mmap
,那么它有何不同,如何解决?
写入只读内存段错误(mov [rdi], r15
qword 存储,或 inc byte [rdi]
字节 RMW)。
如果你想既能写又能读,你需要 PROT_READ | PROT_WRITE
。
(请注意,写入 MAP_PRIVATE 映射会触发写时复制,留下一个不再受文件支持的私有页面,就像您完成 read
进入MAP_ANONYMOUS页。)
有这个nasm:
%define O_RDONLY 0
%define PROT_READ 0x1
%define MAP_PRIVATE 0x2
section .data
fname: db 'test.txt', 0
section .text
global _start
print:
; ---- THIS PART ADDED
mov r15, [rdi]
add r15, 1 ; have tried `inc byte[rdi]` - did not work either
mov [rdi], r15
; ---- END OF ADDED PART
; else is according to book (so correct)
push rdi
call str_len
pop rsi
mov rdx, rax
mov rax, 1
mov rdi, 1
syscall
ret
str_len:
xor rax, rax
.loop:
cmp byte [rdi+rax], 0
je .end
inc rax
jmp .loop
.end:
ret
_start:
;call open
mov rax, 2
mov rdi, fname
mov rsi, O_RDONLY
mov rdx, 0
syscall
;mmap
mov r8, rax
mov rax, 9
mov rdi, 0
mov rsi, 4094
mov rdx, PROT_READ
mov r10, MAP_PRIVATE
mov r9, 0
syscall
mov rdi, rax ;returned address
call print
mov rax, 60
xor rdi, rdi
syscall
文件 test.txt
开头仅包含一个字符 - 5
.
我从 mmap
在 rax
中询问的区域获得了地址,然后我 mov
e 到 rdi
。
我只是想增加值(在那个地址 - 现在在 rdi
):
mov r15, [rdi]
add r15, 1 ; have tried `inc byte[rdi]` - did not work either
mov [rdi], r15
push rdi
所以我临时 mov
e r15
上的值,递增它(add
它 1),然后尝试 mov
e 它回到地址该地区(地址仍在 rdi
中)。但是 segfault
.
这是为什么?为什么我不能使用地址上的值(从 mmap 获取的区域),其中包含 5
- 一个字节(rdi
指向),并在算术中使用它?
如果是在data segment
声明的地址就没有问题了(我试过了)。但地址来自 mmap
,那么它有何不同,如何解决?
写入只读内存段错误(mov [rdi], r15
qword 存储,或 inc byte [rdi]
字节 RMW)。
如果你想既能写又能读,你需要 PROT_READ | PROT_WRITE
。
(请注意,写入 MAP_PRIVATE 映射会触发写时复制,留下一个不再受文件支持的私有页面,就像您完成 read
进入MAP_ANONYMOUS页。)