返回函数,strcpy()和memcpy()之间的区别

时间:2013-05-24 08:03:32

标签: c linux memcpy exploit strcpy

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

0 个答案:

没有答案