ASM(at& t system V 32bit XOR)

时间:2011-06-08 20:39:24

标签: assembly xor

我试图制作一个简单的小密码程序(以进一步扩展我的知识),我只是无法让它工作。问题是,即使我输入正确的密码,它也不会跳转到标签“好”。

我验证密码的方法是将用户提交的密码与内置密码进行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

1 个答案:

答案 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