Assembly 为什么这个汇编程序不能正常工作?
我试图生成一个简单的x86汇编代码,它从用户那里获取输入,然后将其与内存中的硬编码密码进行匹配,并相应地向用户打印一条正确/不正确的消息 这是我的密码:Assembly 为什么这个汇编程序不能正常工作?,assembly,x86,Assembly,X86,我试图生成一个简单的x86汇编代码,它从用户那里获取输入,然后将其与内存中的硬编码密码进行匹配,并相应地向用户打印一条正确/不正确的消息 这是我的密码: %macro write_string 2 mov eax, 4 mov ebx, 1 mov ecx, %1 mov edx, %2 int 80h %endmacro %macro read_string 2 mov eax, 3 mov ebx, 0
%macro write_string 2
mov eax, 4
mov ebx, 1
mov ecx, %1
mov edx, %2
int 80h
%endmacro
%macro read_string 2
mov eax, 3
mov ebx, 0
mov ecx, %1
mov edx, %2
int 80h
%endmacro
section .text
global _start
_start:
write_string msg, lenMsg
read_string string, 32
mov [readBytes], eax
mov ecx, 0
l1:
mov eax, string
add eax, ecx
mov byte al, [eax]
mov eax, pwd
add eax, ecx
mov byte bl, [eax]
cmp bl, al
jne incorrect
inc ecx
cmp ecx, [readBytes]
jne l1
correct:
write_string txt1, txt1Len
jmp exit
incorrect:
write_string txt2, txt2Len
exit:
write_string lineBreak, 1
mov eax,1
int 0x80
section .bss
readBytes: resb 1
section .data
msg db 'Password: '
lenMsg equ $ - msg
string times 100 db 0
pwd db 'secretPass1'
txt1 db 'Correct', 0xa
txt1Len equ $ - txt1
txt2 db 'Incorrect', 0xa
txt2Len equ $ - txt2
lineBreak db 0xa
程序可以编译,但当我运行它并键入输入时,它总是打印不正确的消息,即使我使用了正确的密码
你能告诉我我做错了什么吗
我还有一个问题,这两者的区别是什么:
section .bss
string: resb 100
以及:
用于分配未初始化的数据
谢谢
同样,将地址加载到pwd会覆盖AL寄存器中已加载的字符。
您可以通过使用不同的寄存器遍历pwd来解决此问题,也可以通过使用不同的寻址模式来更正它并简化代码:
mov [readBytes], eax
xor ecx, ecx
Verify:
mov dl, [string + ecx]
mov bl, [pwd + ecx]
cmp dl, bl
jne incorrect
inc ecx
cmp ecx, eax ; No need to compare with a memory based variable
jb Verify
还有其他问题:
在.bss中,您为readBytes变量保留了1个字节,该变量实际上是一个dword,因此需要4个字节的存储空间。因为您在.bss中只使用了一个变量,所以现在不会注意到错误,而是等到您必须编写一个包含更多变量的程序
您的密码验证循环在所有输入的字符上运行,忽略了这样一个事实,即如果输入比存储的密码长或短(包括空),则比较字符是无效的
mov [readBytes], eax
cmp eax, 11 ; Length of the hardcode password 'secretPass1'
jne incorrect
xor ecx, ecx
Verify:
resb 100.bss与乘以100 db 0.data之间的差值
由汇编程序执行100 db 0的次数。它会在可执行文件中实际放入这么多零字节。保证内存将包含100个零字节。
当程序启动时,操作系统“执行”resb 100。很多时候,这个内存也会包含零字节,但我们的想法是,你不应该指望这是真的。你能告诉我我做错了什么吗?您甚至还没有告诉我们运行时出现了什么问题。读取字符串后readBytes的值是多少?@Michael我相信这是用户输入的字符串的长度。关键是,如果您所有的假设都是正确的,您不会有任何问题。但是,由于确实存在问题,您应该验证所有内容,readBytes和string的内容将是一个很好的开始。mov byte al,[eax]将寄存器al设置为输入字节。然而,mov eax,pwd随后覆盖al,因为al是eax的低8位。
mov [readBytes], eax
xor ecx, ecx
Verify:
mov dl, [string + ecx]
mov bl, [pwd + ecx]
cmp dl, bl
jne incorrect
inc ecx
cmp ecx, eax ; No need to compare with a memory based variable
jb Verify
mov [readBytes], eax
cmp eax, 11 ; Length of the hardcode password 'secretPass1'
jne incorrect
xor ecx, ecx
Verify: