0

状況 - サードパーティのスタックを使用しています。私はサードパーティのソースコードを持っています。このコードはかなりぎこちなく、バッファ オーバーランに関連する多くの問題があります。

私の解決策 - この問題を追跡するために、sprintf や memcpy などの既存の関数をオーバーライドして、バッファ オーバーランがあるかどうかを確認しています。

malloc と sprintf をオーバーライドするためにこれまでに行ったことを次に示します。

#define memcpy my_memcpy
void * my_memcpy(void *s1, const void *s2, size_t n)
    {
      void *(*libc_memcpy)(void*,const void*,size_t) = dlsym(RTLD_NEXT, "memcpy");

      return libc_memcpy(s1,s2,n);
    }

次に、sprintf を使用しました -

#define sprintf  mysprintf

int mysprintf(char *str, const char *format, ...)
{
  va_list args;
  va_start(args, format);
  vsprintf(str,format, args);
  va_end(args);
  return 0;

}

私の問題 - バッファ - 宛先の容量が少なく、次に何を書き込んでいるのか、オーバーライドされた関数に出力させたい。

char buff[5]; のようなスタックに割り当てられたメモリで機能するソリューションが必要です。および char *buff = (char *) malloc(5);

たとえば、文字列サイズが 6 バイトの buff で memcpy を実行すると、オーバーライドされた memcpy がエラーをスローするはずです。同様に、sprintf を実行すると、オーバーライドされた sprintf がエラーをスローするはずです。主な問題は sprintf です。sprintf ではなく snprintf を使用したい。すべてのコードを調べて snprintf に変更するのは困難です。したがって、ここでやりたいことは、自分のバージョンで sprintf をオーバーライドし、内部的に snprintf を呼び出して、引数のサイズに基づいて 'n' を計算することです。また、nがバッファサイズよりも小さいかどうかを比較します。ボトルネックは、渡されたポインターに基づいてバッファーのサイズを見つける方法です。

4

1 に答える 1

1

まあ、あなたができる最善の方法は、malloc の独自のコピーを介して割り当てられたすべてのブロックの必要なサイズを別の場所で追跡し、memcpy と sprintf のコピーを使用して、ポインターがその特別な割り当て関数からのものであるかどうかをテストすることです。サイズが合えば。

このようなシステムを構築するには、基本的に 2 つの方法があります。

  • あなたのmallocは必要なサイズに追加し、署名2 * sizeof(int)を最初のintに入れ、必要なサイズのintを2番目に置き、その直後にポインターを返します。次に、署名である memcpy および sprintf コントロールを使用して、 で使用可能な長さを取得します。制限: シグネチャがメモリ内の間違った場所にあり、誤検知を引き起こす可能性があります。とにかく、特別に割り当てられていないポインターでこれを行うと、配列の外部にアクセスできるため、未定義の動作が呼び出されます。しかし、実装は簡単です*(((int *) p) - 2)*(((int *) p) - 1)
  • 割り当てられたポインターとそのサイズを格納するデータ構造 (一種のハッシュ) を構築します。次に、memcpy と sprintf は、そのデータ構造体でポインターを探します。ここで未定義の動作はありませんが、C で正しいデータ構造を実装する必要があります

とにかく、両方のソリューションには共通の欠陥があります。直接割り当てられたメモリのバッファ オーバーランのみをテストします。char の 2D 配列を割り当て、最初以外の要素で sprintf を実行しているときにバッファ オーバーランが発生した場合、それを検出しません。2番目の解決策は、ポインターが割り当てられたブロックの開始から終了の範囲内にあるかどうかをテストする場合ですが、より高価になります。また、スタックに割り当てられたメモリも静的バッファも制御できません。

于 2015-09-28T08:20:20.840 に答える