- 论坛徽章:
- 0
|
程序一
#include
#include
int overflow(char *buf)
{
char output[8];
strcpy(output,buf);
printf("buf的地址是:%p\n",buf);
printf("output内容为:%s\n",output);
return 0;
}
int main()
{
char buf[26];
for(int j=0;j<26;j++)
{
buf[j]=97+j%10;
}
overflow(buf);
return 0;
}
程序二
#include
#include
int overflow(char *buf)
{
char output[8];
strcpy(output,buf);
printf("buf的地址是:%p\n",buf);
printf("output内容为:%s\n",output);
return 0;
}
int main()
{
char buf[26];
for(int j=0;j<26;j++)
{
buf[j]=97+j/10;
}
overflow(buf);
return 0;
}
执行后程序一和程序二的溢出出错的地址分别为0x66656463和0x62626262
能不能给解释一下下面这段话的意思
现在根据这两个地址来确定溢出点:第二步中由于是10个字符一循环的字符串,而其最末尾的溢出地址为0x63,而我们起始循环字符为0x61(十进制97),因此推算溢出点位置的尾数为0x63-0x61=2;第三步中,我们是逢10变换字符的,所得的出错地址落在0x62(十进制98)区间内,即在0x62-0x61=1段内。因此我们推算溢出点位置在第10×1+2=12字符处。
谢谢 |
|