最近,我写了一些汇编代码,询问密码,如果用户输入内部存储的正确密码,则打印出“正确!”。否则,它打印出“不正确!”。
以下是代码:
section .text
global _start
_start:
mov edx, len_whatis
mov ecx, whatis
mov ebx, 1
mov eax, 4
int 80h ; outputs: "What is the password?"
mov edx, 5 ; expect 5 bytes of input(so 4 numbers)
mov ecx, pass
mov ebx, 0
mov eax, 3
int 80h ; accepts intput and stores in pass
mov eax, [pass] ; move the pass variable into eax
sub eax, '0' ; change the ascii number in eax to a numerical number
mov ebx, [thepass] ; move the thepass variable into ebx
sub ebx, '0' ; change the ascii number in ebx to a numerical number
cmp eax, ebx ; compare the 2 numbers
je correct ; if they are equal, jump to correct
jmp incorrect ; if not, jump to incorrect
correct:
mov edx, len_corr
mov ecx, corr
mov ebx, 1
mov eax, 4
int 80h ; outputs: "Correct!"
mov ebx, 0
mov eax, 1
int 80h ; exits with status 0
incorrect:
mov edx, len_incor
mov ecx, incor
mov ebx, 1
mov eax, 4
int 80h ; outputs: "Incorrect!"
mov eax, 1
int 80h ; exits with status: 1
section .data
whatis db "What is the password?", 0xA
len_whatis equ $ - whatis
thepass db "12345"
corr db "Correct!", 0xA
len_corr equ $ - corr
incor db "Incorrect!", 0xA
len_incor equ $ - incor
section .bss
pass resb 5
组装: nasm -f elf password.s
链接: ld -m elf_i386 -s -o password password.o
(如果你确实尝试汇编链接并运行它,你可能会注意到它错误地检查了密码 - 忽略这个。它是“非主题”)
然后,我进行了测试:
./password
123456
,比代码预期多一个字节6
导致此行为的原因是什么?它与汇编程序有关,或者我的计算机如何读取代码?
修改
并且,当我使用12345
运行代码时,终端会在程序关闭时提示输入两次命令,就像有人只是按下回车按钮而不输入命令一样。
答案 0 :(得分:2)
您只从标准输入中读取五个字节,因此当您键入123456↵
时,您的应用程序最终会读取12345
并将6↵
留在缓冲区中。这会被传递给shell。
如果要读取整行,请使用更大的缓冲区。