我试图制作一个简单的小密码程序(以进一步扩展我的知识),我只是无法让它工作。问题是,即使我输入正确的密码,它也不会跳转到标签“好”。
我验证密码的方法是将用户提交的密码与内置密码进行xor,如果返回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
答案 0 :(得分:1)
你的问题是比较。
movl $password, %eax
xorl $buffer_data, %eax
美元符号表示您正在处理变量的地址,而不是内容。由于密码和缓冲区位于不同的位置,因此比较将始终为false。你想要的是比较密码和缓冲区的每个位置的字符。为此,您需要知道密码的长度。
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