漏洞挖掘的对象可以分为基于源码的漏洞挖掘和基于二进制文件的漏洞挖掘两种。前者一般针对开源软件和系统进行漏洞挖掘,如Linux开源系统及其平台下的开源软件,或是对源代码产品进行安全审计;后者一般针对闭源软件和系统进行漏洞挖掘,包括未公开的网络协议。
漏洞挖掘的方法可以分为静态分析、动态测试和动静态结合三种。静态分析是指在不运行程序的前提下,通过静态分析程序的控制流图、数据流图等内容或虚拟运行程序以发现潜在的漏洞;动态分析是指实际运行程序,通过动态跟踪程序的指令序列、污点数据传播过程等方法发现潜在的漏洞。静态分析方法对程序的理解具有较好的全局性,但存在误报率高、计算资源消耗较大造成无法继续分析等问题;动态测试方法误报率低,发现的漏洞大部分是真实可验证的,但也存在对程序的理解具有局部性和漏报率高的问题;动静态结合方法综合了前两者的优点,同时较好地缓解了它们存在的问题,是主流的漏洞挖掘方法,有代表性的如污点数据分析和混合符号执行等技术。