1

我正在尝试使用 LLVM libFuzzer 对一段特定的代码进行模糊测试,该代码仅在main()外部公开其功能。我可以访问目标代码的源代码,但无法更改它。

如果我尝试直接包含目标文件,它会与main. -fsanitize=fuzzer我想我可以通过重命名main目标文件中的符号来解决这个问题:

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

然后在我的线束代码中,我应该声明:

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

并调用stub_main()而不是main(),同时包括main.stub在链接线上。但是,这似乎不起作用,并且链接器找不到对stub_main(int, char**).

如何main从另一段也提供自己的代码中调用此函数main()

4

1 回答 1

2

您没有考虑 C++ 的名称 mangling。for 的符号stub_main可能是一个字符串,其中包含 main 以及一些关于参数、函数类型和返回类型的混淆信息。在我的平台上是__Z9stub_mainiPPc。的符号main可能只是mainmain_

您可以尝试使用 来查看平台中的定义main和处理方式,然后您可以将这些字符串替换为.stub_mainobjdump -d *.oobjcopy --redefine-sym

或者,正如 matoro 所说,您可以将函数声明为extern "C"不会发生名称修改。

于 2020-11-13T16:47:33.267 回答