我使用recvfrom系统调用,长度为0x1000。如果我使用.bss的缓冲区就没有问题; recvfrom等待客户数据。
buffer: resb 4096
但是如果我使用指向堆栈的指针作为缓冲区,在地址处移动一个qword,它就不适合4096个字节而且recvfrom不会等待!
据我所知,对于4096字节,堆栈没有初始化为0,并假设数据在。
此外,如果我将发送到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
答案 0 :(得分:2)
谢谢大家,就像@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
昨天我发现了错误捕获和标准错误消息显示。 谢谢大家的帮助!