关于汇编的 3 个问题 - 代码的含义,Linux 中的反编译,高级视角,

逆向工程 部件 反编译 linux 二进制
2021-07-04 16:46:07

遵循此处的问题(关于汇编的 3 个问题 - 语法、含义和高级代码(例如 C++)中的等效项),我想知道 AT&T 语法中的相同 x86 代码:

xor $0x20, (%eax) 
and $0x20, %ah 
or $0x20, %dh 
dec (%edi) 
dec %si 
dec %sp 
dec %bp
  1. 最后两行代码(递减堆栈指针和基指针)的含义是什么?

  2. 从更高层次的角度来看,这几行代码在做什么?- 例如“接受一个输入并输出一个字符串”

  3. 什么是反编译汇编代码的 Linux 命令(随发行版提供)?- 到目前为止,我只找到了可下载的软件建议。

这不是作业问题 - 我是组装新手。示例代码不是来自实际代码 - 它是为了帮助我更好地理解和说明我的问题。

1个回答

什么是反编译汇编代码的 Linux 命令(随发行版提供)?

没有了。如果您查看GNU binutils集合中的工具提供的功能,您可以亲眼看到这一点

堆栈帧

在 System V i386 系统上%esp%ebp编译器使用它来管理运行时堆栈上的堆栈帧(编译器将源代码转换为程序集)。调用函数时,会在运行时堆栈上创建堆栈帧。

来自System V Application Binary Interface Intel386 Architecture Processor Supplement第 3 章“低级系统信息”第 9 节“函数调用序列”(第 37 页):

  • %esp

    堆栈指针保存当前堆栈帧的限制,即堆栈最底部的有效字的地址。在任何时候,堆栈指针都应指向字对齐区域。

  • %ebp

    帧指针可选地保存当前堆栈帧的基地址。因此,函数具有指向其帧两端的寄存器。传入参数驻留在前一帧中,作为从 的正偏移量引用%ebp,而局部变量驻留在当前帧中,作为从 的负偏移量引用%ebp函数必须为其调用者保留该寄存器的值

这是标准堆栈帧的图片(来自 System V Application Binary Interface Intel386 Architecture Processor Supplement,第 36 页): 标准堆栈帧

这是进程运行时堆栈的一部分的不同图表(来自 CSAPP 第 3 章“程序的机器级表示”: 多帧堆栈

运行时堆栈是进程虚拟内存中较高的区域。作为参考,这里是虚拟内存图(来自 TLPI,第 6 章“进程”): 虚拟内存中进程的布局

现在回答你的问题:

最后两行代码(递减堆栈指针和基指针)的含义是什么?

您提供的代码不是来自被调用函数,因此不会为此代码创建堆栈帧。换句话说,没有函数调用意味着没有堆栈帧创建。当执行并创建其进程映像时,此代码将从可执行 ELF 二进制文件的.text部分映射text虚拟内存中段。这意味着在您提供的代码上下文中,语句dec %spdec %bp无关紧要,因为没有函数调用和要管理的堆栈帧。

从更高层次的角度来看,这几行代码在做什么?- 例如“接受一个输入并输出一个字符串”

这里没有太多事情发生。xor $0x20, (%eax)是一个例子间接寻址,其中在值%eax被视为存储器地址和任何是在该地址是xor“编辑用32整数值dec (%edi)在值结果%edi被当作存储器地址,不管是在该地址从中减去 1。其他语句只是对 CPU 寄存器中的值执行的算术运算。我不确定这个计算序列将如何用高级语言表示。

结论

您可以为自己做的最好的事情是学习如何创建一些基本的功能性汇编代码,并gdb使用调试器(如使用stepiinfo registers命令)逐步执行代码这将使您能够亲眼看到每个语句的结果。它还将加快学习过程并加深您对汇编和虚拟内存的理解。