【发布时间】:2016-08-08 07:31:56
【问题描述】:
我正在使用长度为 0x1000 的 recvfrom 系统调用。如果我使用 .bss 的缓冲区,则没有问题; recvfrom 等待客户端数据。
buffer: resb 4096
但是如果我使用指向堆栈的指针作为缓冲区,在地址处移动一个 qword,它不适合 4096 字节并且 recvfrom 不会等待!
我的理解是堆栈没有初始化为 0 的 4096 字节并假设数据在。
此外,如果我将发送到 recvfrom 的长度减少到 0x10,即,由于 qword 适合,recvfrom 等待客户端输入。
我需要将堆栈初始化为 0 向下 4096 字节吗?
感谢您的关注。
代码:
mov rdi, [server_fd]
xor rsi, rsi
xor rdx, rdx
mov rax, SYS_ACCEPT
syscall
mov [clients_fd], rax ;store the clients_fd
mov rdi, rax ; mov client socket fd to rdi
mov rsi, rsp ; use stack as buffer
mov qword [rsi], 0
mov rdx, BUFFER_SIZE; 0x1000
xor rcx, rcx
xor r10, r10 ; flags
xor r9, r9
xor r8, r8
mov rax, SYS_RECVFROM
syscall
mov rdi, [clients_fd]; restore client_fd
mov rsi, rsp; buffer address
xor r10, r10
call _strlen; returns str len in rax
mov rdx, rax ; rax contains the string len
mov rax, SYS_SENDTO
syscall
call sys_close
xor rdi, rdi
call sys_exit
【问题讨论】:
-
请添加相关代码行
-
你在哪里分配堆栈空间?
-
对
strlen的调用将使用堆栈,可能会干扰您的数据。在处理过程中发生的任何中断也将使用一些堆栈空间。 -
确实,我忘了分配内存,我编辑了我最初的帖子并进行了更正
-
将答案发布为答案,而不是使问题成为非问题的编辑。请注意,x86-64 SysV ABI 中的红色区域确实使 rsp 以下的第一个 128B 免受异步修改,因此您可以在不修改
rsp的情况下使用它。 (@Bo:这是用户空间代码。出于安全原因,中断不使用用户空间堆栈。但是,是的,用strlen同步破坏它是不好的。没有任何信号处理程序,可能没有任何东西异步破坏红色区域之外,但即使是调试器之类的东西也可能这样做。)