首先本文的思考是来自于刚刚解决了一个奇怪的bug,其中解决的思路是值得借鉴的。由于是技术上的思考,考虑了一下还是记录在这里。
究竟是什么bug?
在使用clang开启ASan编译一个要fuzz的软件时,编译是没问题的,可以编译出binary通过。但是在使用该 binary来复现crash时,ASan的log中没有符号信息。具体的来说,看log吧:
Direct leak of 112 byte(s) in 1 object(s) allocated from:
#0 0x4b91d8 (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/bin/magick+0x4b91d8)
#1 0x7ffff500703c (/usr/lib/x86_64-linux-gnu/libomp.so.5+0x1803c)
#2 0x7ffff500713a (/usr/lib/x86_64-linux-gnu/libomp.so.5+0x1813a)
#3 0x7ffff5027454 (/usr/lib/x86_64-linux-gnu/libomp.so.5+0x38454)
#4 0x7ffff501cf4e (/usr/lib/x86_64-linux-gnu/libomp.so.5+0x2df4e)
#5 0x7ffff6f761fc (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/lib/libMagickCore-7.Q16HDRI.so.6+0x5f91fc)
#6 0x7ffff74b521e (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/lib/libMagickCore-7.Q16HDRI.so.6+0xb3821e)
#7 0x7ffff6cffabc (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/lib/libMagickCore-7.Q16HDRI.so.6+0x382abc)
#8 0x7ffff6d03e2c (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/lib/libMagickCore-7.Q16HDRI.so.6+0x386e2c)
#9 0x7ffff63c68cf (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/lib/libMagickWand-7.Q16HDRI.so.6+0x18d8cf)
#10 0x7ffff64f6e57 (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/lib/libMagickWand-7.Q16HDRI.so.6+0x2bde57)
#11 0x4eadb7 (/root/Fuzz/fuzz-imageMagick/ImageMagick/bin-afl-clang-docker/bin/magick+0x4eadb7)
#12 0x7ffff4a2f82f (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
SUMMARY: AddressSanitizer: 528 byte(s) leaked in 2 allocation(s).
上面的第#12处,是编译好的binary,magick。我们可以看到是在magick+0x4eadb7出了问题。但是由于我们不知道这个0x4eadb7对应的是源码中的第几行,导致我们不知道这个bug究竟是在源码中哪个函数中由于什么原因导致的。丢到IDA中看一看肯定没问题,但是和直接看源码肯定还是有很大差别的。报给官方直接丢一个binary也是很不负责的。废话说太多了,那么这个问题可能是什么原因导致的呢?如何快速解决这个bug?
- google找一下有木有人遇到同样的错误,没有(也可能是我搜索的关键字不太好)
- 别人在做的时候是如何做的?(使用afl开ASan来重新编译binary测试)
- 你们的环境步骤都一致吗?(一致,clang版本有差别,更换了3.8和3.9的版本还是一样的问题)
- 再次这个问题的本质再细化一点是什么?(ASan的log中没有符号)
- ASan熟悉吗?符号记录的原理是什么?(重新看ASan给的官方教程,发现是依赖llvm-symbolizer)
llvm-symbolizer在我的环境中没有,重新增加一个符号链接解决了。
参考:https://github.com/google/sanitizers/issues/1043
那你有啥思考呢?
一直以来,谨记遇到问题,需要关注这个问题的本质是什么。有人说,有时你能够准确的把你的问题写下来(本质上就是能够准确的描述出这个问题是什么),你就已经解决这个问题一大半了。现在想想,确实如此。这个问题耗费了一天的时间才解决,实在是太菜了,再一次印证了:看问题要看得更本质。