web-dev-qa-db-ja.com

実行可能なシェルコードはどのように挿入されますか?

実行可能ファイルにシェルコード(ペイロード)はどのように追加されますか?それが近いソースであると仮定します。

ハッカーはどのようにしてそれがどこにあるかのアドレスを取得するのですか?彼らはリターンアドレスを上書きするときにこれを必要とします...

上記が明確になった後、ASLRがこれを防ぐのにどのように役立つかの例をいただければ幸いです。

この質問はネイティブコードに関するものです。

1
user5623335

Aleph Oneによる Smashing the Stack For Fun And Profit を読むことをお勧めします。

ハッカーはどのようにしてそれがどこにあるかのアドレスを取得するのですか?

デバッガーとプログラムの逆アセンブリを使用して、アセンブリー命令を調べます。参考記事にあるように、 Stack Pointer で特に興味深い点は次のとおりです。

CPUには、値をスタックにプッシュし、スタックからポップバックするための特別な命令があります。各プッシュは、スタックポインターの現在の場所に値を格納し、スタックポインターを減らします。 popは、スタックポインターが指す値を取得してから、スタックポインターを増やします(スタックに値を追加するとスタックポインターが減り、値を削除すると値が増えるということに混同しないでください)。

レイアウトのランダム化が有効でない場合、スタックポインターは予測可能です。つまり、ハッカーはバッファーをオーバーフローする方法やシェルコードを挿入する場所を知ることができます。実際、質問のASLRの部分に答えるために、それがどのように役立つかを示す例が オーバーフローバグのスタックポインターを見つける方法 にあります。 )

実行可能ファイルにシェルコード(ペイロード)はどのように追加されますか?

信頼できない入力から。その一例は コマンドラインパラメータ です。他のエクスプロイトと組み合わせることができます。

2

ASLRが無効になっていると想定すると、攻撃者は逆アセンブラを開いて、シェルコードが格納されているアドレスを探すことができます。これは、ユーザー入力の直後にブレークポイントを設定し、ペイロードを見つけるためにスタックを印刷することで簡単に実行できます。 gdbでは次を実行できます:x/100xg $rspまたは32ビット:x/100xw $esp

すべてのガベージでペイロードを見つけることに問題がある場合は、最初にAを送信し、それを16進値(0x41)で検索してみてください。

ASLRが有効になっている場合は、スタックを含むすべてのメモリ領域(コードセグメントを除く)のベースアドレスをランダム化することにより、かなりの保護層を追加します。そのため、ペイロードが格納されているアドレスにジャンプすることはできません。 。

ASLRによってプログラムが悪用されることはありませんが、スタックベースアドレスをリークしてペイロードへのオフセットを計算したり、libcベースアドレスをリークしてROPを実行したりすることもできます。

1
L00P3R