0

这个HLA程序是要求用户输入一定数量的密码,让用户输入两次进行验证(MISMATCH不匹配)。一切正常,但如果我输入两个密码,例如 qwerty 和 foo,它只会打印出来:

Verification:
foo
foo

我无法围绕这个逻辑绞尽脑汁,因为 dword pass1 应该允许打印出所有不同的密码,有什么想法吗?

#include ("stdlib.hhf");
static
strname: string;
strname2: string;
mismatch: string := "MISMATCH";
num: int32 := 0;
pass1: dword;

procedure Password;
begin Password;
    if( str.eq(strname, strname2)) then
    stdout.put("Passwords match!!!", nl, nl);
    mov(strname,[ecx+ebx]);
    else
    stdout.put("NO MATCH!!!", nl, nl);
    mov(mismatch,[ecx+ebx]);
    endif;
end Password;

begin week3;
xor (eax,eax);
stdout.put("How many passwords are you entering? ", nl);
stdin.geti32();
mov(eax,num);

shl(2,num);
mem.alloc(num);
mov(eax,pass1);

stralloc(64);
mov(eax,strname);
stralloc(64);
mov(eax,strname2);

mov(pass1,ecx);
for(mov(0,ebx);ebx<num;add(4,ebx)) do
    stdout.put("Enter password (64 CHARACTERS MAX): ", nl);
    stdin.flushInput();
    stdin.gets(strname);
    mov(eax,[ecx+ebx]);
    stdout.put("Enter again: ", nl);
    stdin.flushInput();
    stdin.gets(strname2);
    mov(eax,[ecx+ebx]);
    Password();
    endfor;

stdout.put("Verification: ", nl);
for(mov(0,ebx);ebx<num;add(4,ebx)) do
    stdout.put((type string [ecx+ebx]), nl);
    endfor;

strfree(strname);
strfree(strname2);
mem.free(pass1);
end week3;
4

1 回答 1

0

环境

  • HLA (High Level Assembler - HLABE back end, POLINK linker) 版本 2.16 build 4413 (prototype)
  • 视窗 10

笔记

  • 主要问题是在密码过程中,内存中的相同位置 strname 总是添加到 pass1 变量中。
if( str.eq(strname, strname2)) then
    stdout.put("Passwords match!!!", nl, nl);
    mov(strname,[ecx+ebx]);
else
  • 该代码在验证期间打印相同的密码,因为该代码保存了相同的位置,并且该位置仅包含一个字符串。打印的密码将始终是存储在该位置的最后一个字符串。
  • 下面的示例通过分配另一个 64 位字符串、将已验证的密码复制到其中并将该新位置保存在为密码分配的内存中来纠正此问题。

例子

  • 警告:不适合部署的密码管理
program main;
#include ("stdlib.hhf");

static
    Original:   string;
    Matching:   string;
    MisMatch:   string := "MISMATCH";
    NumberOfPasswords: int32 := 0;
    PasswordLocations: dword;

begin main;
    stdout.put("How many passwords are you entering? ", nl);
    stdin.get(NumberOfPasswords);
    mov(NumberOfPasswords, EDX);

    shl(2, EDX);
    mem.alloc(EDX);
    mov(EAX, PasswordLocations);
    mov(EAX, ECX);

    stralloc(64);
    mov(EAX, Original);
    stralloc(64);
    mov(EAX, Matching);

    for(mov(0, ESI); ESI < NumberOfPasswords; inc(ESI)) do
        stdout.put("Enter password (64 CHARACTERS MAX): ", nl);
        stdin.flushInput();
        stdin.gets(Original);

        stdout.put("Enter again: ", nl);
        stdin.flushInput();
        stdin.gets(Matching);

        if( str.eq(Original, Matching)) then
            stdout.put("Passwords match!!!", nl, nl);
            stralloc(64);
            str.cpy(Original, EAX);
            mov(EAX, [ECX + ESI*4]);
        else
            stdout.put("NO MATCH!!!", nl, nl);
            mov(MisMatch, [ECX + ESI*4]);
        endif;
    endfor;

    stdout.put("Verification: ", nl);
    for(mov(0, ESI); ESI < NumberOfPasswords; inc(ESI)) do
        stdout.put((type string [ECX + ESI * 4]), nl);
    endfor;

    strfree(Original);
    strfree(Matching);
    mem.free(PasswordLocations);

end main;
于 2020-06-08T21:00:15.000 回答