1

main()関数を外部に公開するだけの LLVM libFuzzer を使用して、特定のコードをファジングしようとしています。ターゲット コードのソースにアクセスできますが、変更できません。

オブジェクト ファイルを直接インクルードしようとすると、mainによって提供される定義と競合します-fsanitize=fuzzermainオブジェクト ファイル内のシンボルの名前を変更することで、これを解決できるかもしれないと考えました。

objcopy --redefine-sym main=stub_main main.stub main.o

次に、ハーネス コードで次のように宣言します。

extern int stub_main(int argc, char **argv)

そして、リンク行に含めながら、stub_main()の代わりに呼び出します。ただし、これは機能していないようで、リンカーは への参照を見つけることができません。main()main.stubstub_main(int, char**)

main独自の を提供する別のコードからこの関数を呼び出すにはどうすればよいmain()ですか?

4

1 に答える 1

2

C++ の名前マングリングを考慮していません。記号 forstub_mainは、引数、関数の型、および戻り値の型に関する難読化された情報だけでなく、メインを含む文字列である可能性があります。私のプラットフォームでは__Z9stub_mainiPPcです。のシンボルmainはおそらくmainまたはmain_です。

プラットフォームでどのようにマングルし、定義が であるmainかを調べてから、これらの文字列を で置き換えることができます。stub_mainobjdump -d *.oobjcopy --redefine-sym

または、マトロが言ったように、関数を as として宣言してextern "C"、名前のマングリングが発生しないようにすることもできます。

于 2020-11-13T16:47:33.267 に答える