0

脆弱なコードの一部を「壊す」という課題がありました。スニペット:

int main(int argc, char **argv)
{

/*...*/

  while(i < argc-1)
  {
    switch(argv[i][0]-48)
    {
      case 1:
      SmashHeap(argc,argv);
    break;
/*...*/
      case 8:
      PrintfVulnerability(argv[++i]);
    break;
    default:
      printf("%s is not recognized by this program",argv[i++]);
/*...*/
    }
  i++;
  }
  return (1);
}

void PrintfVulnerability(char *F)
{
  printf(F);
}

結局、私はそれがとても驚くほど簡単で、成績が悪いのではないかと心配していることがわかりました...私の解決策:

  • 実行可能ファイルをホームディレクトリにコピーします... freecell.exeを使用しました
  • $ ./VulnerableCode 8 `freecell.exe`

ふふっ!! フリーセルをやっています。なぜこれが機能したのですか?

4

3 に答える 3

3

編集:ああ、私はあなたの編集を見ます。残念ながら、これらのバッククォートは多くのことを説明しています.bash(cygwinのデフォルトシェル)では、バッククォートはシェルコマンドとして文字列を実行するようにシェルに指示しています. したがって、コマンドはシェルにフリーセルを実行するように指示するだけです。引用符なしで freecell.exe を渡すだけで、実際に文字列がプログラムに渡されます。

ただし、以下の段落に投稿したリンクを参照してください。ケース 8 で実行できるエクスプロイトのアイデアが得られる可能性があります。

古い回答: あなたのコマンド ラインがどのようにして freecell.exe を起動させるのかわかりません (ところで、「freecell を実行します」 .exe" もコンソールに出力されますか?)。ただし、高レベルのケース 8 は、フォーマット文字列攻撃に対して脆弱です。これは、print が最初の引数がフォーマット文字列であると想定し、{引数があるかどうか、引数のタイプ} を指示するという事実を利用できます。 . これは、渡すバッファに応じて、さまざまなエクスプロイトで使用できます。繰り返しますが、あなたの場合、プロセスの開始にどのようにつながるかわかりません。

于 2009-09-28T13:18:20.467 に答える
0

cygwin またはその他の bash バリアントを使用していますか?

コマンドの先頭の $ は bash のように見えるので、私は尋ねます。コマンドは次のとおりです。

./VulnerableCode 8 [バックティック]freecell.exe[バックティック]

バッククォートを使用した bash 構文のように見えます。

その場合、説明は簡単です。bash はバッククォートの間のコマンドを別のコマンドとして実行し、結果の stdout テキストをコマンドに入れ、VulnerableCode コマンドに渡します。

あなたのコードは、テキスト「freecell.exe」をその出力だけで見ることはありません。したがって、これは与えられたコードの脆弱性ではなく、bash でコマンドをつなぎ合わせる方法にすぎません。

于 2009-09-28T13:40:45.177 に答える
0

Unix/Linux 環境では、バックティックを使用してバックティック内でコマンドを実行し、そのコマンドの出力を前のコマンドに提供します。したがって、ls [backtick]echo .[backtick]現在のディレクトリを ls します。

したがって、cygwin のコマンドは freecell.exe を実行し、freecell の出力を VulnerableCode に提供するために freecell が終了するのを待っていました。

于 2009-09-28T13:41:46.580 に答える