在Assembly中确认一些内存位置

时间:2012-11-06 21:09:37

标签: memory assembly memory-address

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

首先,我想确认(或否认他们是错的)两件事。我还没有在一分钟内完成编程,所以我不确定这个假设是否正确。

我的假设:

用户条目所在的内存地址:[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

1 个答案:

答案 0 :(得分:1)

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

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

加载它们的值

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

问题是缓冲区溢出,像往常一样,弄清楚如果你在gets中输入一个非常大的行会发生什么。