阅读下列说明,回答问题1至问题4,将解答写在答题纸的对应栏内。 【说明】 基于Windows 32位系统分析下列代码,回答相关问题。 void Challenge(char*str) { char temp[9]={

admin2018-05-26  65

问题 阅读下列说明,回答问题1至问题4,将解答写在答题纸的对应栏内。
【说明】
    基于Windows 32位系统分析下列代码,回答相关问题。
    void Challenge(char*str)
    {
        char temp[9]={0};
        strncpy(temp,str,8);
        printf("temp=%s\n",temp);
        if(strcmp(temp,"Please!@")==0){
           printf("KEY:******");
        }
    }
    int main(int argc,char*argv[])
    {
        char buf2[16];
        int check=1;
        char buf[8];
        strcpy(buf2,"Give me Key!!");
        strcpy(buf,argv[1]);
        if(check==65)    {
            Challenge(buf);
        }
        else {
            printf("Check is not 65(%d)\n Program terminated!!\n",check);
        }
        return 0;
    }
应该给该程序提供什么样的命令行参数值(通过argv变量传递)才能使程序执行流程进入判断语句if(check==65)…然后调用Challenge()数。

选项

答案覆盖超过buf数组个字节,也就是输入参数形如:**** ****A。注意大小端。 前面8个任意的非零字符都可以,后跟一个大写的A字符,因为A字符的ASCII码值等于65。

解析 根据问题2各个变量在堆栈的布局情况,可以知道,通过往数组buf传入多于8个字符的字符串就可以覆盖到check变量的空间。因此传入类似字符串“**** ****A”就可以使程序执行流程进入判断语句if(check==65)…然后调用Challenge()函数。其中前面八个“*”刚好覆盖buf数组空间,“A”刚好存入check变量空间,而大写字母“A”的ACSII码就是65。
转载请注明原文地址:https://kaotiyun.com/show/2uTZ777K
0

相关试题推荐
随机试题
最新回复(0)