我正在用Stack进行一些实验,下面的内容让我陷入困境。
可以看出,Linux有
[stack]
映射
132KiB
尺寸。万一
ulimit -s unlimited
如果我们调整
rsp
因此。所以我决定
ulimit-s无限制
并运行以下程序:
PAGE_SIZE equ 0x1000
;mmap staff
PROT_READ equ 0x01
PROT_WRITE equ 0x02
MAP_ANONYMOUS equ 0x20
MAP_PRIVATE equ 0x02
MAP_FIXED equ 0x10
;syscall numbers
SYS_mmap equ 0x09
SYS_exit equ 0x3c
section .text
global _start
_start:
; page alignment
and rsp, -0x1000
; call mmap 0x101 pages below the rsp with fixed mapping
mov rax, SYS_mmap
lea rdi, [rsp - 0x101 * PAGE_SIZE]
mov rsi, PAGE_SIZE
mov rdx, PROT_READ | PROT_WRITE
mov r10, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED
mov r8, -1
mov r9, 0
syscall
sub rsp, 0x80 * PAGE_SIZE
mov qword [rsp], -1 ; SEGV
mov rax, SYS_exit
mov rdi, 0
syscall
即使调整了
相对标准偏差
不管怎样,它都会出错。我不太明白。我在地址手动创建了一个固定映射
rsp - 0x101 * PAGE_SIZE
101页以下
相对标准偏差
.
我的期望是它不会干扰扩展堆栈(
rsp - 0x80
在我的例子中)直到我们找到固定的地图
RSP-0x101*页面尺寸
.
顺便说一句,如果我移除
MAP_FIXED
从映射来看,它是不执行的,并且不会发生segfault(如预期)。这是Strace输出:
mmap(0x7ffe4e0fe000, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x1526e3f3a000
但是
地图固定
工作是否:
mmap(0x7ffd8979c000, 4096, PROT_READ|PROT_WRITE,
MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffd8979c000
upd:如果
lea rdi, [rsp - 0x101 * PAGE_SIZE]
替换为
lea rdi, [rsp - 0x200 * PAGE_SIZE]
.