6

悪用される小さな C プログラムがあります。また、実行される攻撃の背後にあるロジックも理解しました。しかし、私が試している限り、それは私にとってはうまくいきません。

#include <stdio.h>
#include <stdlib.h>

#define SECRET1 0x44
#define SECRET2 0x55

int main(int argc, char *argv[]) {
  char user_input[100];
  int *secret;
  int int_input;
  int a, b, c, d; /* other variables, not used here.*/

  /* The secret value is stored on the heap */
  secret = (int *) malloc(2*sizeof(int));

  /* getting the secret */
  secret[0] = SECRET1; secret[1] = SECRET2;

  printf("Please enter a decimal integer\n");
  scanf("%d", &int_input);  /* getting an input from user */
  printf("Please enter a string\n");
  scanf("%s", user_input); /* getting a string from user */

  printf(user_input);
  printf("\n");

  /* Verify whether your attack is successful */
  printf("The original secrets: 0x%x -- 0x%x\n", SECRET1, SECRET2);
  printf("The new secrets:      0x%x -- 0x%x\n", secret[0], secret[1]);
  return 0;
}

書式文字列 "printf(user_input);" を使用して、secret[0] のアドレスと値を出力するだけです。

「\x6e\xaf\xff\xff%x%x%x%x%s」のようなものを与えてみました。しかし、それは機能していません。任意の提案をいただければ幸いです。どうもありがとう。

4

1 に答える 1

9

これはクラスの演習のように見えるので、いくつかの指針を示しますが、実際の解決策は示しません。

信頼できない入力を提供することにより、このプログラムを悪用しようとしています。ここには 2 つの明らかなバグがあります。1つはscanf()using%sです。バッファをオーバーフローさせてスタックを上書きできるからです。もう 1 つは、フォーマット文字列の脆弱性です。スタックを上書きしても、関数が返されるまではおそらく何もできません。「攻撃が成功したかどうかを確認する」セクションに基づいて、おそらくその前に脆弱性を悪用したいので、フォーマット文字列の脆弱性であると推測しています.

検証セクションに基づいて、 が指すメモリを上書きすることが期待されますsecretprintfメモリ内の制御された場所に書き込む唯一の方法は%n、指定されたポインターを書き込むフォーマット指定子を使用することです。

ここでのコツは、適切なポインタが見つかるまでスタックをたどる方法を見つけることです。便利なことに、スタック上のポインターの直前にユーザー制御の整数があります。そのため、簡単に見つけられるパターン (16 進数の 65535 など) で数字を入力し、多くのs をffff含む書式文字列を使用して、スタックにあるものを確認します。%xそれが見つかったら、スタック上の次のものはポインターになるはずです。

うーん。これを試してみたところ、それほど単純ではないことがわかりました。スタック フレームの正確なレイアウトは、実際には宣言の順序とは関係ありません。私にとっては、システムによって異なります。代わりに%lx、最初によく知られた文字列と一緒に多くの s を使用し、実際のポインターを出力する行を追加して、それがいつ見つかったかを知る必要がありました。%lx次に、対応するを に置き換えて、%nそのポインターを介して書き込みます。20 程度の s を試して、そのポインターを上書きするまで、%lxそれぞれを 1 つずつ置き換えるのが最も簡単な場合があります。%n

とにかく、それがあなたを始めるのに十分であることを願っています. ご不明な点がございましたら、お知らせください。

于 2012-11-16T05:10:04.937 に答える