書式文字列の脆弱性を悪用する方法

はじめに

以前の記事では、印刷機能、書式文字列、書式文字列の脆弱性について説明しました。 この記事では、書式文字列の脆弱性がどのように悪用されるかの概要を説明します。 この記事では、メモリから秘密を漏らすという簡単な課題を解決することから始めます。 次の記事では、より良い影響を与えるために、フォーマット文字列の脆弱性とバッファオーバーフローの脆弱性を連鎖させる別の例について説明します。

フォーマット文字列の脆弱性はどのように悪用されますか?

前の記事で述べたように、フォーマット文字列を使用して可能な攻撃のいくつかは次のとおりです。

  • 秘密のリーク
  • サービス拒否
  • メモリアドレスのリーク
  • メモリアドレスの上書き

この記事では、最初の二つの項目について説明しましょう。

スタックから秘密が漏れている

以下は、メモリからデータを読み取るために単純な書式文字列の脆弱性を悪用するアプローチを理解するために使用する脆弱性のあるプログラムです。

#include<stdio.h>

int main(int argc,char*argv){

char*secret=”[email protected]”;

printf(argv);

}

私たちが気づくことができるように、printf関数がユーザー入力を受け取り、それを印刷するので、プログラムはフォーマット文字列の脆弱性に脆弱です。 Printf関数には書式指定子が使用されていないため、プログラムが脆弱であることに注意してください。

gdbを使用してプログラムを実行し、main関数の逆アセンブルを確認し、printf呼び出しのアドレスにブレークポイントを設定しましょう。

/脆弱

gef dis disass main

関数mainのアセンブラコードのダンプ:

0x0000000000401136<+0>:endbr64

0x000000000040113a<+4>:プッシュrbp

0x00000000040113b<+5>:mov rbp,rsp

0x000000000040113e<+8>: sub rsp,0x20

0x0000000000401142 <+12>: mov DWORD PTR ,edi

0x0000000000401145 <+15>: mov QWORD PTR ,rsi

0x0000000000401149 <+19>: lea rax, # 0x402004

0x0000000000401150 <+26>: mov QWORD PTR ,rax

0x0000000000401154 <+30>: mov rax,QWORD (Read more…)

コメントを残す

メールアドレスが公開されることはありません。