そこで、ユーザーにエントリの入力を求めるプログラムがあります。これは、値「zoidberg」と比較されます。zoidbergでない場合は、エントリが正しくないことをユーザーに通知します。私はそれを書きませんでしたが、私はそれを与えられ、エクスプロイトを見つけて修正するように言われました。
まず、2つのことを確認(または間違っている場合は拒否)したいと思います。私は暑い時間に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