NASM-如何解决终端的输入读取问题?[复制]

4dbbbstv  于 2022-10-23  发布在  Linux
关注(0)|答案(2)|浏览(123)

这个问题在这里已经有答案

Read STDIN using syscall READ in Linux: unconsumed input is sent to bash(2个答案)
昨天关门了。

section .data
yourinputis db "your input is =",0
len equ $ - yourinputis

section .bss
msginput    resb    10

section .text
global _start

_start:
    mov eax,3 ;read syscall
    mov ebx,2
    mov ecx,msginput
    mov edx,9 ; I don't know that is correct?
    int 80h

    mov eax,4 ;write syscall
    mov ebx,1
    mov ecx,yourinputis
    mov edx,len
    int 80h

    mov eax,4 ;write syscall
    mov ebx,1
    mov ecx,msginput
    mov edx,10
    int 80h

exit:
    mov eax,1 ;exit syscall
    xor ebx,ebx
    int 80h

这段代码运行得很好。但它是如此可怕的错误(对我来说:()。如果我输入的输入长度超过10->

$./mycode
012345678rm mycode
your input is 012345678$rm mycode
$

这件事正在发生。当然,“我的密码”现在并不存在。
我该怎么办?
编辑:输入的内容正确打印在屏幕上。但如果您输入一个长输入,它会在第9个字符之后移动到外壳并运行它。
在本例中,“012345678”后的“rm mycode”在外壳中运行。

h5qlskok

h5qlskok1#

如果您输入的字符超过9个,它们将留在终端驱动程序的输入缓冲区中。当程序退出时,外壳程序从终端读取,并尝试将该行的其余部分作为命令执行。
为了避免这种情况,您的程序应该循环读取,直到获得换行符。

xam8gpfp

xam8gpfp2#

你可以一个接一个地读这些字符,直到读到0x0a。类似于:

_read:
    mov esi, msginput

_loop:
    mov eax,3 ;read syscall
    mov ebx,0
    mov ecx, esi
    mov edx,1 ; I don't know that is correct?
    int 80h

    cmp byte[esi], 0x0a
    je end

    inc esi
    jmp _loop

end:
   ret

您将不得不增加msginput的大小。
重要提示:请注意,这不是实现此目的的有效方法(请参阅注解),此处仅作为上述答案的一个示例。

相关问题