gpt4 book ai didi

gcc - Stack Guard 和 Stack Smashing Protection - 金丝雀、内存

转载 作者:行者123 更新时间:2023-12-04 12:47:22 26 4
gpt4 key购买 nike

我有几个关于 Stack Guard 和 SSP 保护的问题。第一个问题是关于 Stack Guard 及其三种类型的金丝雀,如果我没记错的话——终结者、随机和随机异或。

  • 我想知道,如何在 x86 Linux 系统上禁用 Stack Guard?在我读到的某个地方,可以使用此命令,同时使用 gcc ' -disable-stackguard-randomization ' 进行编译,这与用于 enable ' -enable-stackguard-randomization _0x1 的命令相同 -enable-stackguard-randomization _6t91如果需要,我的 gcc 版本是 4.8.2。
  • 关于堆栈保护的下一个问题,当我能够启用/禁用它时,我该如何设置,我想使用哪种类型的金丝雀?我读到的,默认情况下使用终结者金丝雀,对于随机我必须使用' -enable-stackguard-randomization '进行编译,但是随机异或怎么样? (或使用 null 0x00000000)
  • 现在关于 SSP(ProPolice),我知道,对于随机金丝雀,我必须使用“ fstack-protector-all ”进行编译,但是终止符怎么样,默认情况下与 Stack Guard 中的一样吗?
  • 最后一个,如果你们中的任何人,可以告诉我,我在哪里可以找到内存中的随机金丝雀。例如,我有这个场景 - 编译的 C 程序,比如' gcc -g example.c -o example -fstack-protector-all ',所以使用随机金丝雀。比方说,每次执行后,我都能获得金丝雀的地址。所以期待,我有: Canary = 0x1ae3f900 。从不同的论文中,我得到了一些信息,金丝雀位于 .bss 段。所以我使用 readelf 获取 .bss 段的地址:' readelf -a ./example | grep bss '。是 080456c9。在 gdb 中我设置了一些断点,以获取金丝雀的地址,但是当我检查 .bss 地址 x/20x 0x080456c9 时,我看到的只有 0x00000000 个地址,但是
    金丝雀无处可去。另外,我检查了 __stack_chk_fail 是否不存在,但结果相同,我在那里看不到它。我从 PLT/GOT 得到 stack_chk_fail 的地址。

  • 提前感谢您的回答和时间。

    最佳答案

    堆栈粉碎保护 (SSP) 是对 StackGuard 的改进。 SSP 最初是在 gcc 4.1 中实现的。

    I'd like to know, how to disabled Stack Guard on x86 Linux system?



    使用 -fno-stack-protector禁用用户态 SSP。
    --disable-stackguard-randomization--enable-stackguard-randomization是 glibc 源代码的构建选项。

    when I will able to enable/disable it, how can I set, which type of canaries I want to use?



    据我所知,这在 gcc 中是不可配置的。从 glibc 2.10 开始,堆栈金丝雀是在一个名为 _dl_setup_stack_chk_guard 的函数中生成的。 .这是 its code的部分内容:
      if (dl_random == NULL)
    {
    ret.bytes[sizeof (ret) - 1] = 255;
    ret.bytes[sizeof (ret) - 2] = '\n';
    }
    else
    {
    memcpy (ret.bytes, dl_random, sizeof (ret));
    ret.num &= ~(uintptr_t) 0xff;
    }
    dl_random保存 AT_RANDOM 的辅助向量条目的地址,这是一个由内核在创建进程时初始化的 16 字节随机值。如果您在未初始化的内核或模拟器上运行 AT_RANDOM ,支票 dl_random == NULL将是真的,并且使用的金丝雀是终止符值,其中第一个和第二个最重要的字节初始化为 255 和 \n , 分别。所有其他字节都为零。通常 AT_RANDOM由内核初始化,因此 AT_RANDOM 的最低 7 个有效字节被复制。 Canary 的最后一个字节设置为零。

    因此,如果您想使用特定方法生成金丝雀,您可以更改此代码并构建您自己的 glibc。

    作为替代方法,@PeterCordes 在评论中建议将您的金丝雀值写入内存位置 %%fs:0x28 (见下面的代码)在 main 的顶部函数并在从 main 返回之前恢复运行时生成的金丝雀.

    Now about SSP(ProPolice), I know, for random canary I have to compiled with 'fstack-protector-all', but how about terminator, is it same as in Stack Guard, by default?


    -fstack-protector 的所有变体选项使用 SSP。这些不会影响金丝雀的生成方式。

    Last one, if anyone of you, can tell me, where I can find random canary in memory.



    金丝雀在进程启动的早期动态生成;您不能使用 readelf得到金丝雀。根据 this文章中,你可以使用下面的代码来获取i386编译时的canary:
    int read_canary()
    {
    int val = 0;
    __asm__("movl %%gs:0x14, %0;"
    : "=r"(val)
    :
    :);
    return val;
    }

    对于 x86_64:
    long read_canary()
    {
    long val = 0;
    __asm__("movq %%fs:0x28, %0;"
    : "=r"(val)
    :
    :);
    return val;
    }

    关于gcc - Stack Guard 和 Stack Smashing Protection - 金丝雀、内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020213/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com