我正在尝试使用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
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
这里所谓的“缓冲区溢出”不是缓冲区溢出的通用定义。如果我理解正确,在这种情况下你正在考虑的“缓冲区溢出”是“数据溢出到终端而不是限制用户不输入比缓冲区长更多的数据”。但实际上,用户无法输入比缓冲区长度更多的数据。发生的事情是你的read()从stdin中读取8个字节,其余的字节“仍然”在stdin中,bash在你的程序退出时读取,而“\ n”使得它尝试执行“spilling bytes”就像你打电话给他们。没有理由改变它,因为它根本不是安全问题。用户无法以该方式执行命令作为程序的所有者。 如果你真的想摆脱这个,你可以使用malloc()来分配一个'足够大'的缓冲区。这样,无论用户输入多少,缓冲区都足够大(取决于您拥有多少RAM等),您将不再看到那些“溢出字节”。