首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆栈保护和堆栈粉碎保护-金丝雀,内存

堆栈保护和堆栈粉碎保护-金丝雀,内存
EN

Stack Overflow用户
提问于 2015-01-18 20:47:46
回答 1查看 4K关注 0票数 8

我有一些关于堆栈保护和SSP保护的问题。第一个问题是关于堆栈警卫和它的三种类型的金丝雀,如果我是正确的-终止符,随机和随机异或。

  1. 我想知道,如何在x86 Linux系统上禁用堆栈保护?在我读过的某个地方,使用这个命令是可能的,而使用gcc '-disable-stackguard-randomization',编译时,它与enable '-enable-stackguard-randomization',的命令相同,两者都不起作用。如果需要的话,我的gcc版本是4.8.2。
  2. 关于堆栈守卫的下一个问题,当我能够启用/禁用它时,我如何设置,我想使用哪种类型的金丝雀?我所读到的,终结者金丝雀在默认情况下是使用的,对于随机的,我必须用'-enable-stackguard-randomization',编译,但是随机异或呢?(或空0x00000000)
  3. 现在关于SSP(ProPolice),我知道,对于随机金丝雀,我必须用ProPolice编译,但是终止符呢?默认情况下,它和堆栈保护一样吗?
  4. 最后一个,如果你们中有人能告诉我,我可以在记忆中找到随机的金丝雀。例如,我有这个场景编译的C程序,比如'gcc -g example.c -o示例-fstack-protector-all',所以是随机金丝雀。比如说,每次行刑后我都能找到金丝雀的地址。因此,我有:Canary = 0x1ae3f900。从一份不同的文件中,我得到了一些信息,金丝雀位于.bss部门。因此,我使用read亲自获得.bss段的地址:'readelf -a ./Exple.grep bss‘。是080456c9。在gdb中,我设置了一些断点,以获取金丝雀的地址,但是当我检查.bss地址x/20x0x080456c9时,我看到的只有0x00000000个地址,但是金丝雀没有地址。此外,我检查了__stack_chk_fail's,如果它不在那里,但是同样的结果,我在那里看不到它。我从PLT/GOT得到stack_chk_fail的地址。

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

EN

回答 1

Stack Overflow用户

发布于 2019-08-18 19:34:16

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

我想知道,如何在x86 Linux系统上禁用堆栈保护?

使用-fno-stack-protector禁用userland。

--disable-stackguard-randomization--enable-stackguard-randomization是glibc源代码的构建选项。

当我能够启用/禁用它时,我如何设置,我想使用哪种类型的金丝雀?

据我所知,这在gcc中是无法配置的。从glibc 2.10开始,堆栈金丝雀是在一个名为_dl_setup_stack_chk_guard的函数中生成的。下面是它的代码的一些部分

代码语言:javascript
复制
  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是由内核初始化的,因此至少复制了7个重要的AT_RANDOM字节。金丝雀的最后一个字节设置为零。

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

作为另一种方法,@PeterCordes在注释中建议将您的金丝雀值写入位于%%fs:0x28函数顶部的内存位置main (请参阅下面的代码),并在从main返回之前恢复运行时生成的金丝雀。

现在关于SSP(ProPolice),我知道,对于随机金丝雀,我必须用‘’编译,但是终止符呢?默认情况下,它和堆栈保护一样吗?

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

最后一个,如果你们中有人能告诉我,我可以在记忆中找到随机的金丝雀。

金丝雀是在进程启动的早期动态生成的;您不能使用readelf来获取金丝雀。根据文章,在为i386编译时,可以使用以下代码获取金丝雀:

代码语言:javascript
复制
int read_canary()
{
  int val = 0;
  __asm__("movl %%gs:0x14, %0;"
          : "=r"(val)
          :
          :);
  return val;
}

对于x86_64:

代码语言:javascript
复制
long read_canary()
{
  long val = 0;
  __asm__("movq %%fs:0x28, %0;"
          : "=r"(val)
          :
          :);
  return val;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28020213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档