paxtest 程序包括一些有趣的测试,其中显然测试 strcpy 和 memcpy 是否可以覆盖堆栈上的返回指针:
(来自 rettofunc1.c)
void doit( void )
{
char buf[4];
if (strlen((const char *)overflow) > sizeof(overflow[0])) {
strcpy( buf, (const char *)overflow );
} else {
fprintf( stderr, "paxtest: return address contains a NULL byte.\n" );
exit(1);
}
}
和(来自 rettofunc2.c)
void doit( void )
{
char buf[4];
memcpy( buf, overflow, sizeof( overflow ) );
}
我的问题是为什么我的系统(标准 Slackware 14.0,未打补丁)容易受到 strcpy 而不是 memcpy 的影响?为什么使用哪个函数写入堆栈很重要?
还应该注意的是,这是为 32 位编译的,对于 64 位,返回地址包含一个 NULL 字节,并且它也因 strcpy 而失败。