汇编程序中的这一行是什么意思(从c编译)?

逆向工程 部件 C
2021-06-27 00:51:09

我在 C 中有代码:

int a() {

     char string[100];
}

当我编译这个时,我得到了汇编代码:

a:
    push    rbp
    mov rbp, rsp
    sub rsp, 112
    mov rax, QWORD PTR fs:40  <----
    mov QWORD PTR [rbp-8], rax <----
    xor eax, eax
    nop
    mov rdx, QWORD PTR [rbp-8]
    xor rdx, QWORD PTR fs:40
    je  .L2
    call    __stack_chk_fail

什么使我检查的行?"fs:40" 是什么?(总是当我在 c 中创建数组时)以及 rbp-12 中的内容?没有什么 ?

1个回答

我将首先查看上一个主题,在堆栈溢出时为汇编程序提供良好的参考从它的声音来看,您可能没有太多的汇编经验,这没关系。汇编程序只是让 cpu 了解您想要它做什么的一种方式。

在解释事情之前,您必须了解寄存器使用的约定以及它们的含义。例如,堆栈的基指针保存在函数入口处(push rbp),因此可以在函数结束时恢复。在你的 c 代码中你有 int a()

函数的开头定义了一个没有参数和返回结果的新堆栈帧。我们将返回一个变量,按照惯例,它将在 A 寄存器(通常是 RAX)中返回。

一旦 RBP 被保留,当前堆栈指针 (RSP) 被设置为基指针 RBP,并且从那里开始操作。将堆栈视为一种预先分配用于特殊计算用途的内存结构。

随着函数的进展和需要,指令将相对于 RBP 来回反弹以引用变量(局部、全局等)。

根据操作系统和芯片,FS 可能指的是线程本地存储块,也可能指的是 cpu 上的内存段。它取决于您的操作系统和架构。:40 是段或块的偏移量。

通常,这取决于您的操作系统,当您看到诸如 rbp-8 之类的内容时,或者任何意味着获取 RBP 的当前值并从中减去 8 的内容。然而,在某些实现中,根据标量的放置位置,它可能意味着将许多字节段(字)作为 RBP 的偏移量并使用该有效地址。

这就是我现在所拥有的。我会从另一个主题开始,然后从那里开始。

或者只是在调试器中运行它并在它通过每个步骤时查看寄存器的值。