0

そこで、ユーザーにエントリの入力を求めるプログラムがあります。これは、値「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
4

1 に答える 1

1

アドレス[esp+410h+var_410]はローカル変数です。

「オフセット」のある行は、ほとんどの場合、文字列のアドレスを使用して値をロードします

おそらくvar_400は、読み取るテキストのバッファーです。

問題は、バッファオーバーフローです。いつものように、getsに非常に大きな行を入力するとどうなるかを調べます。

于 2012-11-06T21:14:56.647 に答える