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 消息。
谢谢大家的帮助!
我正在使用长度为 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 消息。 谢谢大家的帮助!