脆弱性の悪用に関する考察

このトピックについて引き続き議論することを楽しみにしていたので、脆弱性に関する歴史、理論、実践について少しお話ししましょう。 セキュリティ上の欠陥には多くの費用がかかる可能性があること、ソフトウェアを最新の状態に保つ必要があること、多くの更新がセキュリティのバグによって引き起こされることは誰もが知っています。 しかし、今日は、これらのエラーがどのように検出され、悪用されるかについて少し説明します🙂しかし、その前に、より良い概要を得るために、いくつかの詳細を明確にします。

始める前に

まず、私が悪用することを学んだ最初の脆弱性、既知の脆弱性に焦点を当てることをお伝えしたいと思います バッファオーバーフロー、この脆弱性では、メモリ検証の欠如を利用して楽しいことを行います🙂しかし、それについてもう少し明確にしましょう。

これは現実のシナリオにはなりません

最初に彼らが見たプログラムを壊すように教える余裕はありません🙂彼らのコンピューターにとって危険であるため、次に私の通常の言葉の割り当てよりも多くの時間がかかるためです。

私たちは80年代への旅行に行きます

私がラップトップでできることをお見せしますが、それは今日簡単な方法でできるという意味ではありません🙂これらの概念の多くはすでに何度も悪用されているため、新しい保護方法とそれらを回避する新しい方法が出現しています😛しかし、それは私たちを同じ場所に戻します、それをすべて伝えることができるスペースはありません🙂

お使いのプロセッサでは動作しない可能性があります

非常に簡単な例を使用しますが、これは詳細が非常に多く、私と同じように出てくるのと同じように、試してみると目的の効果が得られない可能性があることを最初から明確にしたいと思います。 🙂しかし、このスペースではそれを説明できないことを想像できます。特に、この紹介ではすでに300語以上を使用しているので、私たちはまっすぐに私たちの要点に到達します。

とは何ですか バッファオーバーフロー

これに答えるには、まずこの組み合わせの前半を理解する必要があります。

バッファー

すべてがコンピュータのメモリに関するものであるため、何らかの種類の情報コンテナが必要であることは論理的です。 私たちが話すとき 入力 outputs、私たちは直接の概念に到達します バッファ。 短くするために、 バッファ これは、定義されたサイズのメモリスペースであり、そこに大量の情報を格納します。単純です🙂

名前が示すように、バッファが処理できるよりも多くの情報でいっぱいになると、オーバーフローが発生します。 しかし、なぜこれが重要なのでしょうか。

スタック

スタックとも呼ばれ、次のことができる抽象的なデータタイプです。 スタック 情報、彼らの主な特徴は彼らが順序を持っているということです LIFO(ラストインファーストアウト)。 プレートのスタックについて少し考えてみましょう。プレートをXNUMXつずつ上に置き、次に上からXNUMXつずつ取り出します。これにより、最後に置いたプレート(一番上にあるプレート)が最初のプレートになります。明らかに、一度にXNUMXつのプレートしか取り出せず、次の順序で取り出すことにした場合は、Pを取り出します。

これらのXNUMXつの概念がわかったので、それらを整理する必要があります。 実行する各プログラムには独自のものがあるため、スタックは重要です 実行スタック。 しかし、このスタックには 特定の特徴成長する。 これについて知っておく必要があるのは、プログラムの実行中に関数が呼び出されると、スタックがメモリ内の番号Xから番号(Xn)に移動することだけです。 しかし、継続するためには、もうXNUMXつの概念を理解する必要があります。

ポインタ

これは、多くのプログラマーがCの世界で始めたときに夢中にさせる概念です。実際、Cプログラミングの大きな力は、ポインターの使用に一部起因しています。 簡単にするために、ポインタ メモリアドレスを指します。 これは複雑に聞こえますが、それほど複雑ではありません。私たち全員がマシンにRAMを持っていますよね? まあ、これは次のように定義することができます ブロックの連続配置、これらの場所は通常、0進数で表されます(9から0まで、次にAからFまで、たとえば0x0、1x0、6x0、0xA、0xF、10x0)。 ここに奇妙なメモとして、10xXNUMX NO は10に等しい😛15進数に変換すると、XNUMXと言うのと同じになります。これも最初は複数の混乱を招きますが、話を始めましょう。

Registros

プロセッサは、多くの registros、物理メモリからプロセッサに場所を送信するように機能します。64ビットを使用するアーキテクチャの場合、レジスタの数が多く、ここで説明するのは困難ですが、理解するために、レジスタはポインタのようなものであり、とりわけ物事、メモリスペース(場所)。

今練習

これまで処理する情報が多かったことは知っていますが、実際には非常に簡単な方法で説明しようとするやや複雑な問題です。バッファを使用する小さなプログラムを見て、オーバーフローについて理解するためにそれを壊します。明らかにこれはそうではありません。これは実際のプログラムであり、今日使用されている多くの対策を「回避」して、以前にどのように行われたかを示します🙂そしてこれらの原則のいくつかはより複雑なことを学ぶために必要であるためです😉

GDB

間違いなくCプログラマーによって最も使用されている素晴らしいプログラムのXNUMXつです。その多くの長所の中に、これまで話してきたすべてのこと、レジスター、スタック、バッファーなどを見ることができるという事実があります。🙂見てみましょう。この例で使用するプログラム。

retinput.c

自分の。 クリストファーディアスリベロス

これはかなり単純なプログラムです。ライブラリを使用します stdio.h 情報を取得して端末に表示できるようにします。 と呼ばれる関数を見ることができます return_input これは、 バッファ 呼ばれます 配列、長さ30 バイト (charデータタイプは1バイト長です)。

関数 gets(array); コンソールと機能で情報を要求する printf() 配列の内容を返し、画面に表示します。

Cで書かれたすべてのプログラムは関数で始まります main()、これはreturn_inputの呼び出しのみを担当します。次に、プログラムをコンパイルします。

自分の。 クリストファーディアスリベロス

私がやったことを少し見てみましょう。 オプション -ggdb gdbが適切にデバッグできるようにするには、gdbの情報を使用してプログラムをコンパイルする必要があることをgccに通知します。 -fno-stack-protector これは明らかに使用すべきではないオプションですが、使用する予定です。そうしないと、スタックにバッファオーバーフローが発生する可能性があるためです。 最後に、私は結果をテストしました。 ./a.out コンパイルしたものを実行するだけで、情報を要求して返します。 実行中🙂

警告

ここに別の注意。 警告が見えますか? 明らかに、コードを操作したりコンパイルしたりするときに考慮に入れるべきものです。これは少し明白であり、今日機能を備えているプログラムはほとんどありません。 gets() コード内。 Gentooの利点のXNUMXつは、各プログラムをコンパイルすることで、何が間違っているのかがわかることです。「理想的な」プログラムには警告がないはずですが、非常に大きく、追跡が難しいため、これらの警告が表示される大きなプログラムがいくつもあることに驚かれることでしょう。同時に多くの警告がある場合、危険な機能。 続ければ

プログラムのデバッグ

自分の。 クリストファーディアスリベロス

さて、この部分は少し混乱するかもしれませんが、私はすでにかなり書いているので、すべてを説明する余裕がないので、私が速すぎるのを見て申し訳ありません🙂

コードの武装解除

まず、コンパイルされたマシン言語プログラムを見てみましょう。

自分の。 クリストファーディアスリベロス

これは私たちの主な機能のコードです アセンブリ、これは私たちのプロセッサが理解していることです。左側の行はメモリ内の物理アドレスです。 <+ n> それはとして知られています オフセット、基本的に、関数の先頭(メイン)からそのステートメント(として知られている)までの距離 オペコード)。 次に、命令のタイプ(push / mov / callq…)とXNUMXつ以上のレジスターを確認します。 要約すると、それはソース/出発地と目的地が続く指示であると言うことができます。 <return_input> XNUMX番目の関数を参照します。見てみましょう。

Return_input

自分の。 クリストファーディアスリベロス

これはもう少し複雑ですが、いくつか確認してほしいのですが、というタグがあります <gets@plt> そして最後に呼び出されたopcode retq 関数の終了を示します。 関数にXNUMXつ、いくつかのブレークポイントを配置します gets と別の retq.

自分の。 クリストファーディアスリベロス

ラン

次に、プログラムを実行して、アクションがどのように開始されるかを確認します。

自分の。 クリストファーディアスリベロス

私たちがいる場所のopcodeを示す小さな矢印が表示されていることがわかります。方向を考慮してもらいたいのですが、 0x000055555555469b、これはへの呼び出し後のアドレスです return_input 機能している main 、これは重要です。これは、受信が終了したときにプログラムが戻る場所であるためです。 入力、関数に入りましょう。 次に、関数に入る前にメモリをチェックします gets.

自分の。 クリストファーディアスリベロス

main関数を元に戻しました。ご覧のとおり、参照していたコードを強調表示しました。 エンディアネス XNUMXつのセグメントに分かれているので、方向性を考慮してほしい 0x7fffffffdbf0 (コマンドーの後の左から最初のもの x/20x $rsp)これはgetsの結果を確認するために使用する必要がある場所なので、続けましょう。

プログラムを破る

自分の。 クリストファーディアスリベロス

私はそれらを強調しました 0x44444444それらは私たちのDの表現であるため🙂今、私たちは追加を開始しました 入力 ご覧のとおり、目的のアドレスからXNUMX行しか離れていないので、前の手順で強調表示したアドレスの直前まで入力します。

リターンパスの変更

関数の戻りを示すコードのこのセクションを入力できたので、少し前にあったものに続くopcodeの場所に移動する代わりに、アドレスを変更するとどうなるかを見てみましょう🙂、どう思いますかに戻ると return_input? しかし、これには、必要なアドレスをバイナリで書き込む必要があります。これを関数で実行します。 printf bashから🙂

自分の。 クリストファーディアスリベロス

今、私たちは情報をXNUMX回受け取りました😀確かにプログラムはそのために作られていませんでしたが、コードを壊して、それが行うはずのないことを繰り返すようにすることができました。

反射

この単純な変更は、 エクスプロイト 非常に基本的な🙂彼はなんとかプログラムを破り、私たちが彼にしたいことをすることができました。

これは、表示および追加するもののほぼ無限のリストの最初のステップにすぎません。単に注文を繰り返すだけでなく、さらに多くのものを追加する方法がありますが、今回は、関連するすべてのものをたくさん書きました。 シェルコーディング それは記事、私が言う完全な本以上のものを書く主題です。 私が好きだったであろうトピックについてもう少し掘り下げることができなかったならば申し訳ありませんが、確かにチャンスがあるでしょう🙂ここに来てくれてありがとう。


記事の内容は、次の原則に準拠しています。 編集倫理。 エラーを報告するには、 ここで.

14コメント、あなたのコメントを残してください

コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   2p2

    より直接的になります。 書く量を減らし、重要なことに集中する

    1.    クリスADR

      こんにちは、コメントありがとうございます。

      実を言うと、私はアイデアのかなりの部分を切り取っていますが、それでも、プログラミングの知識がない人がアイデアを得ることができるように、最小限に抑えているように見えました。

      よろしく

      1.    匿名の

        問題は、プログラミングの知識がない人は、最初は複雑すぎるため何もわからないということですが、プログラミングの方法を知っている人は、より直接的であることを高く評価しています。

        私はあなたがすべての人に到達することはできないと思います、あなたは選択しなければなりません、そしてこの場合あなたは多くをカバーしたいと思って罪を犯しました。

        ちなみに、建設的な批判としてお伝えしますが、私はこれらのトピックが大好きで、記事を書き続けていただきたいと思います。おめでとうございます!

    2.    匿名の

      私は同じと思います。

      1.    クリスADR

        両方ありがとうございました!! これらの記事を読んでいる高度なプログラミングレベルの人々の数が少ないというのが真実である場合、ターゲットオーディエンスに到達する方法を理解することは確かに困難です(少なくともコメントに基づいて推測できます)

        私は確かに、幅広い知識ベースを理解する必要がある何かを単純化したいという罪を犯しました。 私はブログを始めたばかりなので、読者が私の言っていることを知って理解している正確なポイントをまだ発見していないことをご理解いただければ幸いです。 そうすれば、真実を伝えるのがずっと簡単になります🙂

        書き方と内容の分離は想像以上に複雑なので、フォーマットを非個人化せずに値する場合は短くしようと思います。少なくともそれらは完全にリンクされていますが、最終的には行を追加できると思います。コンテンツをカットする代わりに。

        よろしく

  2.   マリオ

    このテーマについてどこでもっと知ることができますか? おすすめの本はありますか?

    1.    クリスADR

      Chris Anley、John Heasman、Felix Linder、GerardoRicharteによるTheShellcoder's Handbookから得た例ですが、64ビットの翻訳を行うには、アーキテクチャについて学ぶ必要がありました。Intel開発者マニュアルの第2巻と第3巻はそのためのかなり信頼できる情報源。 'info gdb'コマンドに付属しているGDBドキュメントを読むこともお勧めします。AssemblyとCを学ぶには、Assemblyの本が少し古いため、別のタイプで埋めるギャップがあることを除いて、非常に優れた本がたくさんあります。ドキュメンテーション。

      シェルコード自体は、さまざまな理由で最近では効果がなくなっていますが、新しい手法を学ぶことは依然として興味深いことです。

      それが少し役立つことを願っています🙂ご挨拶

  3.   フランツ

    良い記事、古いブログdesdelinuxが生まれ変わりました=)
    リモートシェルがそれほど効果的ではないと言うとき、それは攻撃を軽減するために設計された対策を意味し、彼らはそれを攻撃的なセキュリティと呼びます。
    挨拶し、それを維持します

    1.    クリスADR

      フランツさん、ありがとうございました🙂とても親切な言葉です。実際、今日のシェルコーディングは、ここにあるものよりもはるかに複雑であることを意味しました。 ASLR(ランダムメモリロケーションジェネレータ)、スタックプロテクター、プログラムに挿入できるopcodeの数を制限するさまざまな対策と対策があり、これはほんの始まりに過ぎません。

      よろしく、

  4.   フリーソフト

    こんにちは、トピックを拡張する別の部分を行いますか? それは面白い

    1.    クリスADR

      こんにちは、確かに主題は非常に興味深いですが、私たちが取る複雑さのレベルは非常に高くなり、おそらく他を理解するためのさまざまな前提条件を説明するために多数の投稿が含まれます。 私はおそらくそれについて書きますが、それは以下の投稿ではないでしょう、私はこれを続ける前にいくつかのトピックを書きたいと思います。

      挨拶、そして共有してくれてありがとう

  5.   サボテン

    とても良いチェ! あなたは素晴らしい投稿を投稿しています! XNUMXつの質問ですが、私は「ペンテストによるセキュリティの確保」という本を読むことからこのITセキュリティのことを始めています。 この本はお勧めですか? 私がこれらの問題について質問し始めることをどのように提案しますか?

    1.    クリスADR

      こんにちはサボテン、それは脆弱性などについての全宇宙です、実を言うと、それはあなたの注意を引くものとあなたが持っているニーズに大きく依存します、ITマネージャーはペンテスターと同じことを知る必要はありません、または、脆弱性研究者、または法医学アナリストである災害復旧チームは、非常に異なる一連のスキルを持っています。 明らかに、それぞれに異なるレベルの技術的知識が必要です。好きなものを正確に見つけて、本や記事などを食べ始めることをお勧めします。そして最も重要なことは、古くなっていても、読んだものすべてを練習することです。 、それは最終的に違いを生むでしょう。
      よろしく、

  6.   エイツェン

    ねえ。
    このトピックについて説明していただき、また、追加情報として「The Shellcoder'sHandbook」があることをコメントしていただきありがとうございます。 私はすでに保留中の読書を持っています😉