题目详情

基于 Windows32 位系统分析下列代码,回答相关问题 。

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;

}

【问题 1】(3 分)

main 函数内的三个本地变量所在的内存区域称为什么?它的两个最基本操作是什么?

【问题 2】(3分)

画出buf,check,buf2 三个变量在内存的布局图。

中级信息安全工程师,历年真题,《信息安全工程师》案例分析真题汇编

【问题 3】(2分)

应该给程序提供什么样的命令行参数值(通过argv变量传递)才能使程序执行流程进入判断语句 If(check=65)....然后调用challenge(  )函数。

【问题4】(4分)

上述代码所存在的漏洞名字是什么,针对本例代码,请简要说明如何修正上述代码以修补次漏洞。

正确答案及解析

正确答案
解析

问题1解析:

一个程序在内存中分为程序段、数据段和堆栈三部分。程序段里放着程序的机器码和只读数据;数据段放程序中的静态数据;动态数据则通过堆栈来存放,也就是说,变量存在的内存区域是堆栈;堆栈的特性是后进先出 (LIFO) ,即先进入堆栈的对象最后出来,最后进入堆栈的对象最先出来。堆栈两个最重要的操作是 PUSH和POP将对象放入堆栈顶端(最外边,内存高端);POP 操作实现一个逆向过程,把顶端的对象取出来。

问题2解析:

首先根据3个变量定义的先后顺序,buf2先压入堆栈(在最底下),然后是check,最后是buf(最上面);空间大小根据C语言语法即可确定。buf2是16个字节,check是整型变量占用4个字节,buf是字符数组,有8个字符,每个字符占一个字节,共占用8个字节。所以buf、check、buf2三个变量在内存的布局图如下所示:

中级信息安全工程师,历年真题,《信息安全工程师》案例分析真题汇编

问题3解析:

该代码按正常流程走下来,因check的值为1,不满足check==65,所以会执行else语句,所以这道题的关键在于通过什么样的方式来改变check的值,使其等于65,满足条件然后调用Challenge()函数。

再来分析strcpy() 函数这个函数,该用来复制字符串,其原型为:char *strcpy(char *dest, const char *src);

【参数】dest 为目标字符串指针,src 为源字符串指针。

注意:src 和 dest 所指的内存区域不能重叠,且 dest 必须有足够的空间放置 src 所包含的字符串(包含结束符NULL)。

【返回值】成功执行后返回目标数组指针 dest。

strcpy() 把src所指的由NULL结束的字符串复制到dest 所指的数组中,返回指向 dest 字符串的起始地址。

注意:如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出。

主函数在执行时会接收用户输入信息放入指针数组argv中,而指针数组存放的信息又会通过strcpy复制到buf数组里面,buf数组的长度为8个字符,一旦用户输入数据长度大于8个字符就会溢出,溢出部分就会覆盖其他变量的值,从上面堆栈中的数据存储方式可以看出,buf数组一旦溢出,溢出部分就会覆盖check的值;根据题目意思,只要令溢出部分的值为65即可令check=65,从而满足条件。所以可以先任意输入8个字符堆满buf数组,再输入时就是溢出部分,可以输入大写字母A,因check为整形数据,所以将字符赋给整形变量时,会按其ASCII码值进行处理,即A的ASICC值为65,从而可以把check值变成65满足条件。

问题4解析:

前面分析strcpy() 函数,当其参数 dest 所指的内存空间不够大,可能会造成缓冲溢出。

而strncpy()用来复制字符串的前n个字符,其原型为: char * strncpy(char *dest, const char *src, size_t n);

【参数说明】dest 为目标字符串指针,src 为源字符串指针。 strncpy()会将字符串src前n个字符拷贝到字符串dest。

在编写程序时通常用strncpy()函数来取代strcpy()函数防止缓冲区溢出。

包含此试题的试卷

你可能感兴趣的试题

单选题

一台主机的IP地址为202.123.25.36,掩码为255.255.254.0。如果该主机需要在该网络进行直接广播,那么它应该使用的目的地址为( )

  • A.202.123.25.0
  • B.202.123.25.255
  • C.202.123.24.0
  • D.202.123.24.255
查看答案
单选题

在计算机系统的日常维护工作中,应当注意硬盘工作时不能__(2)__。另外,需要防范病毒,而__(3)__是不会被病毒感觉的。

  • A.电子邮件
  • B.硬盘
  • C.U盘
  • D.ROM
查看答案
单选题

有 4 个 IP 地址:201.117.15.254、201.117.17.01、201.117.24.5 和 201.117.29.3,如果子网掩码为 255.255.248.0,则这 4 个地址分别属于3个子网;其中属于同一个子网的是()

  • A.201.117.15.254 和 201.117.17.01
  • B.201.117.17.01 和 201.117.24.5
  • C.201.117.15.254 和 201.117.29.3
  • D.201.117.24.5 和 201.117.29.3
查看答案
单选题

在异步通信中,每个字符包含1位起始位、7位数据位、1位奇偶位和1位终止位,每秒钟传送200个字符,采用4相位调制,则码元速率为()。

  • A.50波特
  • B.500波特
  • C.550波特
  • D.1000波特
查看答案
单选题

在 Windows 中,运行( )命令得到下图所示结果。以下关于该结果的叙述中,错误的是( )。

Pinging 59.74.111.8 with 32 bytes of data:

Reply from 59.74.111.8: bytes=32 time=3ms TTL=60

Reply from 59.74.111.8: bytes=32 time=5ms TTL=60

Reply from 59.74.111.8: bytes=32 time=3ms TTL=60

Reply from 59.74.111.8: bytes=32 time=5ms TTL=60

Ping statistics for 59.74.111.8:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

Minimum = 3ms, Maximum = 5ms, Average = 4ms

  • A.该命令使得本地主机向目标主机发送了 4 个数据包
  • B.本地主机成功收到了目标主机返回的 4 个数据包
  • C.本地主机与目标主机连接正常
  • D.该命令用于查看目标主机的 IP 地址
查看答案

相关题库更多 +