Recvfrom:使用堆栈作为缓冲区(长度:4096)

Recvfrom : using stack as buffer (len:4096)

我正在使用长度为 0x1000 的 recvfrom 系统调用。如果我使用 .bss 的缓冲区,那没问题; recvfrom 等待客户端数据。

buffer: resb 4096

但是如果我使用指向堆栈的指针作为缓冲区,在该地址移动一个 qword,它不适合 4096 字节并且 recvfrom 不会等待!

据我了解,堆栈未针对 4096 字节初始化为 0,并假设数据在其中。

此外,如果我将发送到 recvfrom 的长度减少到 0x10,即因为 qword 适合,recvfrom 会等待客户端输入。

向下4096字节需要把栈初始化为0吗?

感谢您的关注。

代码:

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

谢谢大家,就像@Michael 指出的那样简单,这是解决方案:

I had to reserv 0x1000 bytes on the stack

代码:

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
sub rsp, BUFFER_SIZE
mov rsi, rsp
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

昨天我进行了错误捕获并显示了标准的 errno 消息。 谢谢大家的帮助!