停止BufferOverflow - NASM输入

时间:2012-05-28 07:23:13

标签: linux assembly input nasm buffer-overflow

我正在尝试使用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

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

1 个答案:

答案 0 :(得分:0)

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