Memory 确认程序集中的某些内存位置

Memory 确认程序集中的某些内存位置,memory,assembly,memory-address,Memory,Assembly,Memory Address,所以我有一个程序,我要求用户输入一个条目,它将其与值“zoidberg”进行比较。如果它不是zoidberg,那么它会告诉用户条目不正确。我没有写它,但我得到了它,并告诉我找到漏洞并修复它 首先,我想确认(或否认,如果他们错了)两件事。我现在还没有做过asm编程,所以我不确定这个假设是否正确 我的假设: 用户条目所在的内存地址:[esp+410h+var_410] 存储zoidberg项的内存地址为:[esp+410h+var_40C] 我真的不知道那是一个临时地点还是它的最终地点。我很困惑 此

所以我有一个程序,我要求用户输入一个条目,它将其与值“zoidberg”进行比较。如果它不是zoidberg,那么它会告诉用户条目不正确。我没有写它,但我得到了它,并告诉我找到漏洞并修复它

首先,我想确认(或否认,如果他们错了)两件事。我现在还没有做过asm编程,所以我不确定这个假设是否正确

我的假设:

用户条目所在的内存地址:[esp+410h+var_410]

存储zoidberg项的内存地址为:[esp+410h+var_40C]

我真的不知道那是一个临时地点还是它的最终地点。我很困惑

此外,测试调用会将eax与自身进行比较,这可能是需要修复的漏洞吗

; Attributes: bp-based frame

public main
main proc near

var_410= dword ptr -410h
var_40C= dword ptr -40Ch
var_400= dword ptr -400h

push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF0h
sub     esp, 410h       ; char *
mov     [esp+410h+var_410], offset anEntry ; "enter an entry to continue:"
call    _puts
lea     eax, [esp+410h+var_400]
mov     [esp+410h+var_410], eax
call    _gets
mov     [esp+410h+var_40C], offset aZoidberg ; "zoidberg"
lea     eax, [esp+410h+var_400]
mov     [esp+410h+var_410], eax
call    _strcmp
test    eax, eax
jnz     short loc_804846E

mov     [esp+410h+var_410], offset aNeedAnEntry?Wh ; "need an entry? why not zoidberg?"
call    _puts
jmp     short loc_804847A


loc_804846E:            ; "your entry is bad, and you should feel"...
mov     [esp+410h+var_410], offset aYourEntryIsBa
call    _puts


loc_804847A:
mov     eax, 0
leave
retn
main endp

地址[esp+410h+var_410]是局部变量

带有“offset”的行主要使用字符串的地址加载其值

var_400可能是文本读取的缓冲区


问题是缓冲区溢出,与往常一样,如果在gets中输入一个非常大的行,则会发生什么情况。

我以前见过缓冲区溢出,尤其是在密码验证中。在我看到的一个例子中,如果提供了一个大于变量边界的值,那么它将被验证,即使它是不正确的。这就是你的建议吗?我唯一感到奇怪的是,我输入了一个超过四行字符的字符(在我的终端中),但它仍然是不正确的。也许这个变量只是存储了非常大的值?