web-dev-qa-db-ja.com

スタックバッファオーバーフローの混乱

私は、従来のNOPスレッド技術を使用して、スタックバッファオーバーフローをより深く掘り下げ、ボルトで固定しようとしています。

いくつかの記事を読んでビデオを見ると、これらの2つの写真で示されている混乱が生じました(ここで何かを誤解しない限り、これらは互いに矛盾しています)。

enter image description here

これはウィキペディアの「Buffer_Overflow」からの写真です。基本的には、シェルコードが入力の最初に来て、その後にNOPが続くことを示しています。次に、別のNOPセクションに相対的にジャンプし、シェルコードのメモリアドレスの場所にジャンプします。

私が理解していないのはこれです:基本的にreturn addressを上書きすることを目的としています。つまり、シェルコードの場所を指します-しかし、これは私が画像に表示しているものではありません。最終的にシェルコードにつながるNOPエリアへの「相対ジャンプ」ですが、戻りアドレスについてはどうでしょうか。スキップされているようです。

次の写真はこれです(スライドショーで撮ったもの):

enter image description here

スライドショーでは、黒い領域がNOP領域を表し、最終的にはシェルコードにつながると言われていますその後のみ戻りアドレスが表示されますか?それで、私のシェルコードがNOPで始まり、その後にシェルコードが続く場合、どのようにしてどこでいつ正確に戻りアドレスに到達するのですか(つまりshould NOPs >>> Shellcodeを指します)?

(言葉が多すぎるため)過度に不器用で複雑な質問をしないようにしました。質問が明確であることを願っています。

3
Franko

攻撃者が対処しなければならない2つの「不明」があります。

最初に、攻撃者はおそらくスタック上のバ​​ッファをオーバーフローしており、RAMでバッファに続くバイトの中に、現在の関数の後に実行がジャンプする「戻りアドレス」を格納するバイトがあります攻撃者は、これらのバイトを別のアドレスで上書きして、CPUを攻撃者が作成したコードにジャンプさせたいと考えています。最初の未知数は、「バッファ(オーバーフローしている)と戻りアドレススロットの間の距離はどれくらいですか?」攻撃者が提供したデータのどの時点で「リターンアドレス置換」を設定する必要があるかを知るために、攻撃者はそれを推測する必要があります。

2番目の未知数は、彼のシェルコードの実際のアドレスです。スタック上の従来のバッファーオーバーフローでは、シェルコードはオーバーフローをトリガーするデータの一部です。つまり、バッファー内にあります。戻りアドレスはabsoluteなので、攻撃者が攻撃対象の関数のコードを知るだけでは不十分です。攻撃者は、その時点でのスタックの深さを知る必要もあります。これは、以前のアプリケーションの動作に依存します。

NOPスライド 、またはNOPスレッドは、不明なsecondの精度の問題に対処するための簡単な手法です。攻撃者が何らかのジッターを使用してシェルコードのアドレスを推測する場合、攻撃者は自分のシェルの前に多数のnopオペコード(または同様に無害なオペコード)を配置しますコード;したがって、CPUがスレッド内のどこかにジャンプして、最終的にシェルコードに到達するようにすれば十分です。

最初の不明な点については、このツールはNOPスレッドではなく、別の種類のスレッドです。簡単に言えば、完全なオーバーフローは次のようになります。

90 90 90 90 90... 90 shellcode addr addr addr... addr

ここで、shellcodeは実際のペイロード、90nopオペコードの16進コード、addrは攻撃者によるRAM内のバッファー開始アドレスの推測です。オーバーフローが発生すると、addr値の1つが戻りアドレススロットを上書きし、アドレスaddrでCPUをジャンプさせます。 addrのどれがトリックを実行するかは、上記の「最初の未知」です。通常、「最初の未知数」はそれほど知られていないわけではありません。これは、リバースエンジニアリング(逆アセンブリ)を通じて知られる関数自体のローカル変数のレイアウトにのみ依存するためです。

攻撃者は、アドレスaddrのバイトが90の1つになると推測しているため、実行はそこでジャンプします。 CPUは後続のすべてのnopオペコードを実行してからシェルコードに到達するため、どれがそれほど重要ではありません。

あなたが示す写真は確かにかなり混乱しています。それらは、何らかの理由で攻撃者がシェルコードをすぐにNOPスレッドの後に置くことができないが、どこかにあるより複雑なケースに関連しているようですNOPスレッドの前で、スレッドの最後に適切なジャンプを配置する必要があります(ジャンプオペコードでは相対アドレッシングを使用しているため、ジャンプを簡単に正しく行うことができます)。

13
Tom Leek