0

我正在尝试使用 NASM 向 Linux 中的终端编写一些基本的输入/输出代码。我想允许用户输入数据,但我的问题是如果用户输入的数据多于缓冲区长度,我会遇到缓冲区溢出。我正在尝试检查输入的数据是否大于缓冲区长度,如果是,则要求用户再次“输入数据:”。

这是我当前的代码:

SECTION .bss
        BUFFLENGTH equ 8 ;The max length of our Buffer
        Buff: resb BUFFLENGTH ;The buffer itself 
SECTION .data
 Prompt: db "Enter Data: ",10
 PromptLen: equ $-Prompt
SECTION .text 



    global _start
_start:

DisplayPrompt:
       mov eax, 4
       mov ebx, 1
       mov ecx, Prompt 
       mov edx, PromptLen
       int 80h
Read:
       mov eax, 3 ;Specify sys_read call
       mov ebx, 0; Specify File Descriptor 0 : STDIN (Default to keyboard input)
       mov ecx, Buff; pass offset of the buffer to read to
       mov edx, BUFFLENGTH ; Tell sys_read to read BUFFLEN 
       int 80h ;make kernel call
       mov esi, eax
       cmp byte[ecx+esi], BUFFLENGTH ;compare the returned bufferSize to BUFFLENGTH
       jnbe DisplayPrompt ;Jump If Not Below or Equal To BUFFLENGTH


Write:
       mov edx, eax ;grab the size of the buffer that was used (charachter length)
       mov eax, 4 ;specify sys_write
       mov ebx, 1 ; specify File Descriptor 1: STDOUT 
       mov ecx, Buff ;pass the offset of the Buffer 
       int 80h ;make kernel call

Exit:
       mov eax, 1 ; Code for Exit syscall
       mov ebx, 0 ; Exit code { = 0; Program ran OK }
       int 80h ; make kernel call

我相信我的错误在于我如何比较数据,这里:

 mov esi, eax
       cmp byte[ecx+esi], BUFFLENGTH ;compare the returned bufferSize to BUFFLENGTH
       jnbe DisplayPrompt ;Jump If Not Below or Equal To BUFFLENGTH

任何帮助,将不胜感激。谢谢。

4

1 回答 1

0

您在这里所说的“缓冲区溢出”不是缓冲区溢出的常见定义。如果我理解正确,您在这种情况下考虑的“缓冲区溢出”是“数据溢出到终端而不是限制用户输入的数据不超过缓冲区长度”。但实际上,用户不能输入超过缓冲区长度的数据。发生的事情是您的 read() 从标准输入读取 8 个字节,而剩余的字节“仍然”在标准输入中,当您的程序退出时 bash 会从其中读取,并且“\n”处的“\n”使其尝试执行“溢出字节”就像你打电话给他们一样。没有理由改变它,因为它根本不是安全问题。用户不能以这种方式以程序所有者的身份执行命令。如果你真的想摆脱这个,你可以使用 malloc() 来分配一个“足够大”的缓冲区。这样,无论用户输入多少,缓冲区都会足够大(取决于您拥有多少 RAM 等),您将不会再看到那些“溢出字节”。

于 2012-07-05T20:03:33.443 回答