我刚刚浏览了Randall Hyde的《组装艺术》一书。

所以现在为了读懂组装/逆向工程,我开始了《逆向工程入门》一书。问题是,当我编写C样本并按照作者的说法生成汇编代码时,我在GCC中获得的汇编不同于一个作者提供的汇编。 (我将gcc -S -O3用于那些据说在书本中得到优化的书。)

我该怎么办才能获得像书本这样的结果,或者如果不是像作者那样得到结果,那我该如何获得最大收益?从这本可爱的书中出来?

评论

可能是因为您的GCC版本与他的版本不同。您可以使用相同版本的GCC和反汇编程序,然后重试吗?

好..idk他使用的是什么版本...现在我发现我的问题主要是那些.cfi前置后缀。了解了如何禁用它们。

嗨,欢迎来到RE.SE。当您不向我们展示时,提出建议会有点困难。如何编辑问题以包括作者给出的示例以及通过GCC编译获得的示例?也很高兴知道您使用的是哪个GCC版本(即使可能没有关于作者使用的信息)。如果您是我,我还将签出-fno-stack-protector(或者通常签出gcc -dumpspecs输出以查看您的GCC可能在使用哪些与安全性相关的默认标志)。最后但并非最不重要的尝试-O2 ...

...-最新GCC版本上的-O2可能更接近旧GCC版本上的-O3。原因很简单,在逐步优化级别之前,有几个优化需要一定时间才能成熟。就库代码(glibc或C运行时)而言,您可能还希望将-D_FORTIFY_SOURCE = n传递给gcc驱动程序。另外,请查看优化级别背后的各个选项。该特定文档实际上也可能提供了一种在GCC版本之间进行比较的好方法...

#1 楼


我该怎么做才能得到像书一样的结果?

只需使用相同版本的编译器,并为与Author相同的体系结构编译代码。通常,会明确说明使用哪个编译器版本来获取特定程序集。例如:

因此,使用了几种不同的编译器版本,如果要获得相同的结果,则必须使用的描述的版本。每个列表。

或获得像作者一样的结果不是重点

绝对不是重点。关键是您在阅读本书时会尽可能多地学习。
我什至会说,获得不同的结果可能会比本书中的结果更好。这样做的原因有很多:

您将学习GCC编译器的较新版本如何处理相同的C代码,例如什么是新的优化方法。
您将看到不同的程序集执行与上一个任务相同的任务-当您发现大的差异时,您可能会想考虑或搜索有关此任务的更多信息,这样您就可以更好地记住它。
它鼓励您理解生成的程序集,因此您可以将其与作者提供的程序集进行比较-比仅复制您已经提交的内容要更具创造性和生产力。


我如何才能获得最大的收益是从这本可爱的书中摘出来的吗?

我会说,通过实践如果您不练习刚刚学到的东西,就会很快忘记它。您甚至可以省略其中编写的某些程序,而自己进行实验(如作者建议的那样)-只需编写一些代码,然后尝试反汇编查找其片段。

#2 楼

您只需要gccdebug之类的编译器或静态分析来了解代码的作用