在程序届有一句名言:如果你能读懂汇编,一切程序对你来说就是开源。所以要抵达黑客层次,不熟练的掌握反汇编分析技巧那是不可能的。本节我们看看一些反汇编的工具和相关技巧,后续我们再看看一些高级方法该怎么用。
常用的反汇编工具一般需要执行三个步骤,1,加载要反汇编的二进制文件;2,从二进制文件中找到所有机器指令;3,将指令转换为汇编语句;通常第2步是一个难点,由于机器指令与通常的二进制数值无异,因此很容易把不是指令的数值认为是机器指令。为了尽可能降低步骤2的错误,反汇编算法常采用两种模式,分别是线性反汇编和递归反汇编。
线性反汇编其实就是从头走到尾,将所有二进制数值都认为是机器指令,然后将其转换为汇编语句,我们常用的Objdum就是如此。这当然会产生问题,很显然不可能所有二进制数值都是机器指令,因此这种做法容易将原本是数据的数值看做是指令。由此会带来两种错误,一种是将数值转换成无效机器指令,一种更糟糕,数值正好对应了某条机器指令,于是给后面的分析带来巨大的干扰,如下图所示:
左边是正确的反汇编,其中前4字节是数据,如果将前4字节