5

これは課題ですが、基本的な理解に問題があります。

脆弱なコード:

int choc(char *arg)
{
  char buf[400];
  snprintf(buf, sizeof buf, arg);
  return 0;
}

arg は、戻りアドレスを実行したいコードのアドレスで上書きするフォーマット文字列である必要があることを理解しています。しかし、フォーマット文字列の作成に問題があります。

したがって、フォーマット文字列に必要なものは次のとおりです。

  1. 上書きする必要がある return 命令のアドレス
  2. %x のリスト
  3. リターンアドレスに書く値。これは、実行したいコードのアドレスになります。

戻りアドレスを取得するには、gdb の 'ret' 命令のアドレスを確認するだけですよね? %x の目的は何ですか? また、実行したいコードのアドレスをフォーマット文字列にエンコードするにはどうすればよいですか?

私が行ったテスト: gdb を使用して、自分の buf のアドレスが 0xbffffba0 であることを発見しました。「\xa0\xfb\xff\xbf_%x.%x.%n」になるように引数を生成しました。これはアドレス 0xbffffba0 のバフの先頭に何らかの値を書き込むべきではありませんか? ただし、セグメンテーション違反が発生します。私は何を間違っていますか?

どんな助けでも大歓迎です!

4

4 に答える 4

2

"\xa0\xfb\xff\xbf"buf のアドレスではなく、スタック上の戻りアドレスの場所 (上書きしたい値) にする必要があります。gdb を使用してその値を見つける必要があります。

次に、 %n がスタックからその値を読み取り、指定したアドレスに書き込むように、フォーマット文字列に十分な %x を入れる必要があります。また、%n が実際に正しい値を書き込むように、正しいフィールド サイズを使用する必要があります。

于 2012-04-11T20:53:03.267 に答える
1

悪用しようとしている脆弱性は、フォーマット文字列の脆弱性と呼ばれます。このトピックをさらに調査するには、このリンクまたは「ハッキング: 搾取の芸術」という本をお勧めします。

于 2012-04-11T20:07:22.910 に答える
0

通常、デバッガーから値を読み取るだけでは十分ではありません。一部のプラットフォームには、特定のオブジェクトのアドレスがプログラムの呼び出しごとに異なるアドレス空間のランダム化セキュリティ機能があります。代わりに、戻りアドレスがスタックのどこに格納されているか (呼び出しに関連して) を見つけて、そこにsnprintf上書きする必要があります。これは非常に CPU 固有です。どのプラットフォーム向けに開発していますか?

returnデバッガーを使用して、アセンブリ レベルでその関数のコードをステップ実行し、コマンドが検出される直前にスタックを調べます。スタックとリターン アドレスが、本来あるべき姿と同じであることを確認してください。これにより、問題がどこにあるかの手がかりが得られるはずです。returnまた、対象の場所が実際にリターン アドレスであることを確認するために、直前にデバッガーを使用してスタックを手動で変更することもできます。

于 2012-04-11T20:13:09.680 に答える
-2

答えはノーです。「ret」命令のアドレスだけが必要なわけではありません。実際に必要なのは、「ret」命令がロードするメモリ内の場所です。この図を見てください:

http://post.queensu.ca/~trd/377/tut5/stack.html

「差出人住所」を上書きしようとしています。

このポインターを表示する短いプログラムを作成してみます (後ほど)。

更新:悪い知らせがあります。私にも解りません。私は書いた:

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

void bar()
{
    printf("Bar function\n");
}

void foo()
{
    void (**p)(void);
    asm volatile("movl %%ebp, %0\n\t" : "=r"(p) : : "%0");
    p += 1;
    *p = bar;
}

int main()
{
    foo();
    return 0;
}

の文を印刷せずにセグメンテーション違反が発生しbar()ます。私はそれがうまくいくことを期待しています...だから今、私はあなたと同じように混乱しています. bar()私のコードで実行されない理由を誰か説明できますか?

于 2012-04-11T20:50:46.427 に答える