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

时间:2016-08-08 07:31:56

标签: assembly nasm

我使用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

1 个答案:

答案 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

昨天我发现了错误捕获和标准错误消息显示。 谢谢大家的帮助!