web-dev-qa-db-ja.com

クラッシュ後のバッファオーバーフローには、悪用に十分なスペースがありません

だから私は、故意に脆弱なサーバーアプリケーション用のバッファオーバーフローを記述しようとしています。自分でこれを行う方法を学び、何らかの方向性を求めています。

サーバーのイミュニティデバッガーで監視しており、ECX、EBP、および重要なのはEIPレジスタを制御しています。攻撃マシンからバッファを送信するとプログラムがクラッシュしますが、後でリバースシェルを配置するための十分なスペースがなく、バッファの最初の部分に十分なスペースがあります。私はそれを理解するために数バイトしか持っておらず、この時点を過ぎると行き詰まります。命令セットをバッファの前の部分に配置し、それらの数バイトを使用してそこに戻ることは可能ですか?これを行う方法についてどこで確認できますか?

3
Hadoken

これにはさまざまな方法があります。 EIPを設定するためにコードの固定点を取得できますか? ASLR制限があるかどうかは教えてくれませんが、ある場合でも、参照するための固定位置を取得できますか?調べてください:

https://www.corelan.be/index.php/2009/07/23/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-2/

https://www.corelan.be/index.php/2009/09/21/exploit-writing-tutorial-part-6-bypassing-stack-cookies-safeseh-hw-dep-and-aslr/

彼らは素晴らしい読み物であり、あなたはそこでいくつかの答えを見つけるべきです。

1
RLFP

SEHのようなものではなく、バニラEIPの上書きについて話していると仮定すると、2つのオプションが利用できます。これらのどちらも私が「初心者」のテクニックであると見なすものではありません。アセンブリの知識が少し必要なので、役立つウェブサイトはいくつかあります。

1。 エッグハンターを採用します。エッグハンターでは、限られたバッファースペースに小さなシェルコードを貼り付け、シェルコードの前に8バイトのエッグ(n00bn00b)を付加します。エッグハンターはあなたのユニークなエッグをメモリから検索し、それに続くシェルコードにジャンプします。バッファ変数の例

buffer = "\x41" *100 + "n00bn00b" + shellcode + "\x90" * 50 + egghunter + offset + jmpback

上記の「オフセット」は、DLL内の単純なJMP ESPである可能性があり、「jmpback」は、nopslideのどこかにバッファにジャンプして戻るためのアセンブリ命令です。

少し混乱するように見えますが、実行フローは次のとおりです

  1. offset変数は、EIPの上書きがある場所に配置されます。この変数は、JMP ESP命令へのアドレスを保持するだけで、jmpback変数を指します。

  2. jmpback変数は、nopsledにジャンプするアセンブリ命令(つまり、\xeb\xc4)を保持します。

  3. Egghunterシェルコードが実行され、n00bn00b文字列の検索が開始されます。

  4. N00bn00b文字列が見つかると、実行するシェルコードにジャンプします。

Egghunterは、バッファスペースを増やすための優れた方法です。

2。バッファーに逆方向にジャンプする:2番目のオプションは、バッファースペースが利用できる場合、アセンブリー命令を発行してバッファーにさらにジャンプし、シェルコードを実行することです。これは、2つのオプションの方が簡単に聞こえますが、シェルコードの実行後にスタックを再調整しないように注意しなければ、スタックを破棄することができます。

ECXなどの別のレジスタを完全に上書きした場合は、JMP ECXだけでシェルコードを起動することもできます。

この回答では、悪用しようとしているマシンでDEPやASLRなどが有効になっていないと想定しています。

3
DKNUCKLES