【问题标题】:What does this mean in assembly [closed]这在装配中意味着什么[关闭]
【发布时间】:2021-06-02 16:04:21
【问题描述】:

这是一个示例c代码,在mac os中用gcc编译

这是代码

int main(int argc, char *argv[])
{
    char key[] = "key-123";
    if(argc == 2){
        printf("Checking key ... %s\n", argv[1]);
        if (strcmp(argv[1], key) == 0) {
            printf("Access Granted");
        } else {
            printf("Denied");
        }
    }
    else{
        printf("insert the key");
    }
    return 0;
}

【问题讨论】:

  • 图片最好不要发;人们不能从他们那里复制粘贴。请在您的问题中包含程序集 sn-p 作为文本。您可以使用问题下方的编辑按钮。

标签: macos assembly x86-64 disassembly objdump


【解决方案1】:

这是用于移动到%rax 的值。它计算为与%rip 的偏移量,这是已知的,因此反汇编程序可以向您显示该值。这里的主要微妙之处在于%rip 包含以下 指令的地址。所以你有%rip = 0x100003e7f,指令添加了0x181,所以你得到0x100003e7f + 0x181 = 0x100004000,这是你看到的值。 这是key 字符串的地址,将被接下来的 2 条指令移入堆栈

编辑:我不太确定这是如何生成的,所以我从 asm 中假设它正在加载密钥。但彼得提到它是在 MacOS 上。所以它是堆栈保护器金丝雀(似乎)。尽管评论是移至%rax的值,但这并没有改变

【讨论】:

  • 知道为什么 GCC for MacOS(可能实际上是 clang)只会从静态存储中加载指针,而不是直接加载实际的 ASCII 数据吗?为 Linux 编译(也禁用优化)godbolt.org/z/8os435j7T - 我们确实看到它还决定从.L__const.main.key 与实际的 GCC 复制使用mov rax, 0x33... ASCII 数据作为立即数。但即使使用 clang,我们也看不到通过 GOT 或任何其他方式获取非可变数据的额外间接级别,即使使用 -fPIC
  • 但无论如何,请注意它正在加载一个指向它想要的实际 ASCII 数据的指针。 0x100004000 不是初始化字符串的地址,而是指向它的指针的地址。
  • 不,这不是堆栈金丝雀/cookie 值。 GCC/clang -fstack-protector-strong 将为堆栈 cookie 使用线程本地存储,例如 mov %fs:40, %rax / mov %rax, -8(%rbp)。与key[] 的初始化程序完全分开,这就是它。我很确定 MacOS 使用 FS 作为 TLS 基址寄存器,就像 Linux(都使用 x86-64 System V ABI),所以godbolt.org/z/4f8K8afWs 很像你在 MacOS 上看到的。请注意,RAX 有一个额外的 deref,但堆栈保护器 cookie 只是一个被加载的值。
  • 确实有一个额外的 deref。这只是意味着它在将指针写入堆栈之前加载指针并对其进行延迟。我认为这不会告诉您任何事情,尤其是未优化的代码。你的 Godbolt 输出看起来与我在 macOS 上看到的不同,所以我也不认为这能告诉你什么。 clang -S 在 macOS 上生成的 asm 是 movq ___stack_chk_guard@GOTPCREL(%rip), %rax 用于第一条 mov 指令,所以我认为这是金丝雀。
  • 好的,这确实很有意义,尽管这不是我所期望的。在我之前评论的 Godbolt 链接中,key[] 的初始化程序在 溢出堆栈参数后被复制。这是有道理的:该语句的汇编不是序言的一部分。但在问题中,加载 + deref + store 发生在此之前。所以这是非常有力的证据,它不是初始化器。 (并且为堆栈 cookie 引入额外的间接比对字符串文字的内容更有意义。)
猜你喜欢
  • 2016-05-18
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2016-06-28
  • 2021-01-14
  • 1970-01-01
相关资源
最近更新 更多