1

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

4

0 回答 0