【问题标题】:Recvfrom : using stack as buffer (len:4096)Recvfrom : 使用堆栈作为缓冲区 (len:4096)
【发布时间】: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 同步破坏它是不好的。没有任何信号处理程序,可能没有任何东西异步破坏红色区域之外,但即使是调试器之类的东西也可能这样做。)

标签: assembly nasm


【解决方案1】:

谢谢大家,就像@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 消息。 谢谢大家的帮助!

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2010-11-29
    相关资源
    最近更新 更多