Недавно я написал немного кода сборки, который запрашивает пароль, и если пользователь вводит правильный пароль, который хранится внутри, он выводит «Правильно!». Иначе он печатает «Неправильно!».Код сборки автоматически запускает команду терминала
Вот код:
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
В чем причина этого поведения? Это как-то связано с ассемблером, или как мой компьютер читает код?
EDIT:
И, когда я запускаю код с 12345
, терминал запрашивает команды в два раза, когда программа закрывается, как будто кто-то просто нажмите на кнопку ввода без ввода команды.