状況 - サードパーティのスタックを使用しています。私はサードパーティのソースコードを持っています。このコードはかなりぎこちなく、バッファ オーバーランに関連する多くの問題があります。
私の解決策 - この問題を追跡するために、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がバッファサイズよりも小さいかどうかを比較します。ボトルネックは、渡されたポインターに基づいてバッファーのサイズを見つける方法です。