京峰二进制安全逆向高级
再编译逆向工程的结果能否得到一样的二进制代码
再编译逆向工程得到的源代码(已报名京峰底部评),能不能得到与原来相同的的二进进制代码呢?有多困难?之前逆向了某款路由,好奇之下做了一点实验,发现除非在编译器、编译选项、编码风格方面完全一样,同时知识水平和相关经验也非常重要。
编译器。一方面,相同版本的编译器可能应用了不同的版本的补丁;另一方面,构建编译器本身的选项也许也会对生成的目标有影响。某二进制使用GCC 4.8.3编译,通过strings命令发现其编译选项是“ -msoft-float -mllsc -mplt -mno-shared -g”。但使用自己构建的编译器(使用buildroot构建)时,使用相同编译选项编译得到目标文件,然后使用strings指令查看生效的编译选项变成“-msoft-float -mllsc -mplt -mno-shared -march=mips32r2 -mabi=32 -g”,编译器自动增加了新的选项。另外还发现,自己构建的编译器编译生成的目标在存储延时槽位置缺少nop指令。