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而失败。