ASM实践中的写作C(如果/然后)
目录
此文为加密收费内容添加我微信支付后可看:
ASM实践中的写作C(如果/然后)
在这个挑战中,我将使用英特尔和AT&T语法查看64位ELF可执行文件(如果/然后)的ASM指令。在尽我所能弄清楚每个指令的作用后,我将编写一个C程序,以反映我认为ASM指令中正在发生的事情。这些挑战纯粹是为了实践,将帮助您了解逆向工程以及C和ASM的基础知识。
挑战
下面您将看到C程序的ASM说明(如果/然后),挑战是在查看下面的ASM说明后编写C程序。左侧是英特尔语法,右侧是AT&T语法。
|
|
|
|
笔记
这些是我检查上述代码时记下的一些笔记,从第14行(主)开始。
在上述说明中,我可以看到主值(10,20)内有2个值设置为固定值。每个值的大小看起来是4个字节,由于我可以看到正在设置的值,我知道这2个值既是整数,也不是指针。
您还可以在上述说明中看到,对printf的调用使用PLT(程序链接表),该表在使用函数名称后由@PLT后缀表示。对printf的调用在64位编程ABI中设置如下(如第31-34行和第40-43行所示)。
如帖子顶部的ASM说明所示,LC0和LC1标签列在主标签之前,其值如下所示,以供参考。
根据提供给printf的参数,ASM指令可能会使用更多的寄存器进行整数/指针或作为参数传递的浮点/双值。
解决方案
在解析了上述代码中主指令后,我编写了以下C程序来重建ASM指令。
接下来是编译代码,看看它是否有效,然后在二进制文件上运行objdump,看看我们的拆卸离我们开始的指令有多近。
太棒了!它没有出错,所以让我们用objdump再次检查我们的准确性,如下所示。
如您所见,这些说明与我们一开始的情况并不相同,但您可以看到它们离我们很近……我会称之为成功,我希望你也学到了很多。