2015-01-01 3 views
2

Недавно я написал немного кода сборки, который запрашивает пароль, и если пользователь вводит правильный пароль, который хранится внутри, он выводит «Правильно!». Иначе он печатает «Неправильно!».Код сборки автоматически запускает команду терминала

Вот код:

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

(Если вы действительно пытались собрать ссылку и запустить это, вы можете заметить, что он неверно проверяет пароль - игнорирует это. Это «вне темы»)

Затем я провел тест:

  1. Я побежал код с ./password
  2. Когда я был запрошен пароль, я напечатал в 123456, еще один байт, чем код ожидает
  3. После того как я ударил введите и код выйдет, терминал немедленно попытается выполнить команду 6

В чем причина этого поведения? Это как-то связано с ассемблером, или как мой компьютер читает код?

EDIT:

И, когда я запускаю код с 12345, терминал запрашивает команды в два раза, когда программа закрывается, как будто кто-то просто нажмите на кнопку ввода без ввода команды.

ответ

2

Вы только читаете пять байтов со стандартного ввода, поэтому, когда вы вводите 123456↵, ваше приложение заканчивается чтением 12345 и оставляет 6↵ в буфере. Это передается оболочке.

Если вы хотите прочитать всю строку, используйте больший буфер.

Смежные вопросы