我有一些关于堆栈保护和SSP保护的问题。第一个问题是关于堆栈警卫和它的三种类型的金丝雀,如果我是正确的-终止符,随机和随机异或。
提前感谢您的回答和时间。
发布于 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的函数中生成的。下面是它的代码的一些部分
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编译时,可以使用以下代码获取金丝雀:
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;
}https://stackoverflow.com/questions/28020213
复制相似问题