ASM (at & t system V 32bit XOR) - PullRequest
       50

ASM (at & t system V 32bit XOR)

0 голосов
/ 09 июня 2011

Я пытался создать простую маленькую программу для паролей (для дальнейшего расширения моих знаний), и я просто не могу заставить ее работать. проблема в том, что если я ввожу правильный пароль, он не перейдет на ярлык «хорошо».

Мой способ проверки пароля состоит в том, чтобы переписать встроенный пароль с введенным пользователем, и если он возвращает 0, это означает, что они совпадают. (потому что все xor'd само по себе равно 0)

так что моя ошибка, скорее всего, в командах cmpl и je или в самом моем xoring. любая помощь была бы хороша, я просто не могу найти свою ошибку.

.section .data

hmm:
.ascii "Enter the password\n\0"

password:
.ascii "abgirl"

success:
.ascii "Password is right\n\0"

bad:
.ascii "password is wrong\n\0"

.section .bss

.equ buffer_size, 500

.lcomm buffer_data, buffer_size

.section .text

.global _start

_start:

pushl $hmm
call printf                      #print $hmm

movl $0, %ebx
movl $buffer_data, %ecx
movl $buffer_size, %edx
movl $3, %eax
int $0x80                        #get user input

movl $password, %eax
xorl $buffer_data, %eax          #xor the passwords (value stored in eax)

cmpl $0, %eax                    #compare
je good                          #jump if equal

pushl $bad
call printf                      #print bad pass if not equal
jmp end                          #jump to exit

good:
pushl $success
call printf                      #print $success

end:
movl $0, %ebx
movl $1, %eax
int $0x80                        #cleanup and exit

1 Ответ

1 голос
/ 09 июня 2011

Ваша проблема в сравнении.

movl $password, %eax
xorl $buffer_data, %eax

Знаки доллара означают, что вы работаете с адресами переменных, а не с содержимым. Поскольку пароль и буфер находятся в разных местах, сравнение всегда будет ложным. То, что вы хотите, это сравнить символ в каждой позиции пароля и буфера. Для этого вам нужно знать, как долго пароль.

password:
.ascii "abgirl\0"
.set password_len, . - password

Обратите внимание, что я также добавил нулевой байт к вашему паролю, чтобы сравнение не удавалось, если входной пароль длиннее. Теперь вам нужно изменить сравнение для проверки каждого байта.

    movl $password, %ebx
    movl $buffer_data, %edx
    movl $password_len, %ecx
0:
    movb (%ebx), %al
    xorb (%edx), %al
    jnz bad
    inc %ebx
    inc %edx       # Go to next byte
    dec %ecx
    jnz 0b
    jmp good
...