这个问题在这里已经有答案:
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”在外壳中运行。
2条答案
按热度按时间h5qlskok1#
如果您输入的字符超过9个,它们将留在终端驱动程序的输入缓冲区中。当程序退出时,外壳程序从终端读取,并尝试将该行的其余部分作为命令执行。
为了避免这种情况,您的程序应该循环读取,直到获得换行符。
xam8gpfp2#
你可以一个接一个地读这些字符,直到读到
0x0a
。类似于:您将不得不增加
msginput
的大小。重要提示:请注意,这不是实现此目的的有效方法(请参阅注解),此处仅作为上述答案的一个示例。