0.0813

五煦查题

快速找到你需要的那道考题与答案

中国大学计算机系统基础(四):编程与调试实践_3答案(mooc完整答案)

45 min read

中国大学计算机系统基础(四):编程与调试实践_3答案(mooc完整答案)

第一周 实验与开发环境的中国整答安装和使用

第一周测验

1、在安装Linux系统时,大学必须创建的计算机系践答供Linux系统使用的磁盘分区是( )
A、交换(swap)分区
B、统基home分区
C、础编程调根分区
D、试实boot分区

2、案m案下列任务的中国整答执行中不需要root管理员权限的是( )
A、安装和删除系统软件包
B、大学运行reboot命令重启系统
C、计算机系践答使用gcc工具从C源文件编译系统软件程序
D、统基使用mkdir命令在根目录中创建新的础编程调子目录

3、下列选项中,试实不属于objdump程序的案m案功能的是( )
A、反汇编二进制程序中的中国整答机器指令
B、显示输出二进制程序中的符号表、源程序语句等调试信息
C、跟踪、调试二进制程序的运行
D、显示输出二进制程序中指定节的内容

4、使用gdb工具跟踪一个从C源文件编译生成并包含调试信息的可执行程序时,si命令的功能是( )
A、执行一条C语句;如是过程调用语句,则停止在目标过程中的第一条C语句
B、执行一条C语句;如是过程调用语句,则停止在目标过程返回后的第一条C语句
C、执行一条机器指令,如是过程调用指令,则停止在目标过程中的第一条机器指令
D、执行一条机器指令,如是过程调用指令,则停止在目标过程返回后的第一条机器指令

5、使用gdb工具跟踪一个从C源文件编译生成并包含调试信息的可执行程序时,s命令的功能是( )
A、执行一条C语句;如是过程调用语句,则停止在目标过程中的第一条C语句
B、执行一条C语句;如是过程调用语句,则停止在目标过程返回后的第一条C语句
C、执行一条机器指令,如是过程调用指令,则停止在目标过程中的第一条机器指令
D、执行一条机器指令,如是过程调用指令,则停止在目标过程返回后的第一条机器指令

6、计算机系统采用层次化结构,从最上面的应用层到最下面的硬件层,其层次化构成为( )
A、高级语言虚拟机-操作系统虚拟机-汇编语言虚拟机-机器语言机器
B、高级语言虚拟机-汇编语言虚拟机-机器语言机器-操作系统虚拟机
C、高级语言虚拟机-汇编语言虚拟机-操作系统虚拟机-机器语言机器
D、操作系统虚拟机-高级语言虚拟机-汇编语言虚拟机-机器语言机器

7、以下有关程序编写和执行方面的叙述中,错误的是( )
A、可用高级语言和低级语言编写出功能等价的程序
B、高级语言和汇编语言源程序都不能在机器上直接执行
C、编译程序员必须了解机器结构和指令系统
D、汇编语言是一种与机器结构无关的编程语言

8、在gcc命令行上单独使用下列哪个选项,可将一个C源程序文件转换为对应的汇编源程序文件? ( )
A、-c
B、-o
C、-S
D、-E

9、一个C源程序文件p1.c的内容如下: extern int s; int foo( int n ) { return n*s; } 另一C源程序文件p2.c的内容如下: int foo( int ); int main() { return foo(-1); } 执行命令”gcc -o test p1.c p2.c“后将产生下列哪个结果? ( )
A、编译生成名为”test“的可执行程序
B、编译生成名为”test.s“的汇编源程序文件
C、启动test程序开始跟踪和调试
D、输出错误信息

10、下列选项中,不能作为gdb调试工具的break命令的断点目标的是 ( )
A、C源程序文件中的行号
B、C源程序文件中的函数/过程名
C、可执行程序的代码段中的地址
D、C源程序文件中的变量名

11、假定一个C源程序文件test.c的内容如下: #include <stdio.h> int main() { printf("Hello, world!") return 0; } 现运行命令”gcc -o test test.c 2> output.txt“,则文件output.txt中的内容是( )
A、gcc编译生成的test可执行程序的内容
B、gcc编译生成的test.o模块文件的内容
C、test可执行程序运行时的输出
D、gcc编译过程中的输出

12、假设tect.c是一个c语言源程序,现依次执行命令"gcc -O0 -m32 -g test.c -o test"和“objdump -S test>test.txt”。下列选项中,不属于test.txt中的内容的是( )
A、test.c的源代码
B、test.c的源代码对应的机器指令
C、机器指令反汇编后的汇编指令
D、机器指令存储的内存地址

第二周 C语言编程实践

第二周测验

1、假定两种浮点数表示格式的位数都是32位,但格式1的阶码长、尾数短,而格式2的阶码短、尾数长,其他所有规定都相同。则它们可表示的数的精度和范围为( )
A、两者可表示的数的范围和精度均相同
B、格式1可表示的数的范围更小,但精度更高
C、格式2可表示的数的范围更小,但精度更高
D、格式1可表示的数的范围更大,且精度更高

2、假定某数采用IEEE 754单精度浮点数格式表示为4510 0000H,则该数的值是( )
A、
B、
C、
D、

3、假设x和y是某C语言程序中的两个char型变量,x=0x5F和y=0xA0,根据C语言中的按位运算和逻辑运算的定义,x^y、x&y、x|y、~x|~y的结果是( )
A、0xFF,0x0F,0xFF,0xFF
B、0xFF,0x00,0xFF,0xFF
C、0xFF,0x00,0x0F,0xFF
D、0xFF,0x00,0xFF,0x0F

4、对于一个n(n≥8)位的变量x,请根据C语言中按位运算的定义,给出C语言表达式使得x的最高有效字节不变,其余各位全变为0 ——( )
A、(x>>(n-8))<<(n-8)
B、x & 0xFF
C、((x^ ~0xFF) >>8 )<< 8
D、x | 0xFF

5、对于一个n(n≥8)位的变量x,根据C语言中按位运算的定义,表达式((x^ ~0xFF) >>8 )<< 8的功能是( )
A、x的最高有效字节不变,其余各位全变为0
B、x的最低有效字节不变,其余各位全变为0
C、x的最低有效字节全变为0,其余各位取反
D、x的最低有效字节全变1,其余各位不变

6、若f为某IEEE754单精度浮点数的机器表示,f的真值为a,则以下代码实现的功能是( ) unsigned int float_neg(unsigned int f) { unsigned exp=f>>23&0xFF; unsigned frac=f&0x7FFFFF; if (exp==0xFF)&&(frac!=0) return f; else return f ^ 0x80000000; }
A、令f的真值为2a
B、令f的真值为|a|
C、令f的真值为-a
D、令f的真值为0.5a

7、以下哪一种情况能很好地发挥cache的作用? —— ( )
A、程序中不含有过多的I/O操作
B、程序的大小不超过实际的内存容量
C、程序具有较好的访问局部性
D、程序的指令间相关度不高

8、在存储器分层体系结构中,存储器从容量最大到最小的排列顺序是( )
A、主存-辅存-cache-寄存器
B、辅存-cache-主存-寄存器
C、辅存-主存-cache-寄存器
D、辅存-主存-寄存器-cache

9、在主存和CPU之间增加cache的目的是( )
A、增加内存容量
B、提高内存可靠性
C、加快信息访问速度
D、增加内存容量,同时加快访问速度

10、以下关于IA-32/Linux异常处理和中断处理的叙述中,错误的是( )
A、Linux需要针对IA-32的256个中断设置IDT对应表项的内容,即进行IDT的初始化
B、Linux对大多数异常的处理方式是发送相应信号给用户进程以尽快结束异常处理过程
C、Linux中异常处理的C函数名由do_前缀和处理程序名组成,与相应信号处理程序名相同
D、Linux中对中断的处理不采用发送信号给用户进程的方式,而是对相应中断进行具体处理

11、以下关于IA-32/Linux信号机制的叙述中,错误的是( )
A、Linux总是采用向发生异常的进程发送信号的机制实现异常处理
B、向进程发送信号的机制实现异常处理,可以尽快完成在内核态的异常处理过程
C、用户可以自定义信号处理函数,并将其注册为某个信号的处理函数
D、采用信号处理机制,是为了尽量避免嵌套执行异常或中断

第三周 程序调试与实践:数据的存储与运算

第三周测验

1、考虑以下C语言代码: short si= -8192; unsigned short usi=si; 执行上述程序段后,usi的值是( )
A、-8192
B、8192
C、57343
D、57344

2、8位补码定点整数1001 0101右移一位后的值为( )
A、0100 1010
B、0100 1011
C、1000 1010
D、1100 1010

3、某计算机字长8位,有一个8位加法器。已知带符号整数x=-69,y=-38,在该加法器中完成x–y的运算,则该加法器的两个输入端信息和输入的低位进位信息分别为( )
A、1011 1011、1101 1010、0
B、1011 1011、1101 1010、1
C、1011 1011、0010 0101、1
D、1011 1011、0010 0110、1

4、某8位计算机中,假定带符号整数变量x和y的机器数表示为:[x]补=F5H,[y]补=7EH,则x–y的值及其相应的溢出标志OF分别是( )
A、77、0
B、119、0
C、77、1
D、119、1

5、若两个float型变量(用IEEE 754单精度浮点格式表示)x和y的机器数分别表示为x=40E8 0000H,y=C204 0000H,则在计算x+y时,第一步对阶操作的结果[ΔE]补为( )
A、0000 0111
B、0000 0011
C、1111 1011
D、1111 1101

6、执行如下C程序段后,变量c的值为( ) int a = 90; int b = 80; float c = a / b;
A、0
B、1
C、1.125
D、不确定

7、8位补码定点整数1001 0101左移一位后的值为( )
A、1010 1010
B、0010 1010
C、0010 1011
D、溢出

8、假定某计算机字长为32位,采用字节编址,以小端方式存储数据,在该机器中执行一个C语言程序,其中部分程序段如下: unsigned int x=0x12345678; 假定给变量x分配的地址为100,则102号单元中存放的信息用十六进制表示的结果是( )
A、0x12
B、0x34
C、0x56
D、0x78

9、在采用IA-32和Linux的机器中执行如下程序段: float a = 0.125; float b = (1 << 25); float c = a + b; 则c的结果值为( )
A、16777216.0
B、16777216.125
C、33554432.0
D、33554432.125

10、考虑以下C语言代码: unsigned int ui = 0x80808080; short s = ui; 执行上述程序段后,s的十进制数值是( )
A、32640
B、-32640
C、2056
D、-2056

11、给定一个int类型变量a和一个double类型变量b,则表达式”a - b“的值恒等于下列哪个表达式的值?( )
A、a - (int) b
B、(double) a - b
C、(float) a - b
D、a - (float) b

12、已知某C语言程序中数组R定义如下: struct record{ char id; int num ; } ; struct record R[4]={ { 1,0x11},{ 2,0x22},{ 3,0x33},{ 4,0x44}}; 执行该程序时,给数组R分配的存储空间为( )
A、8个字节
B、20个字节
C、32个字节
D、60个字节

13、C语言代码段P如下: int m; unsigned n=0; scanf("%d",&m); if (m<=n-1) printf("ture"); else printf("flase"); 执行上述代码段,输出的结果是( )
A、总是ture
B、总是flase
C、输出值随机变化
D、m为负数时,输出ture;m为正数时,输出flase

14、C语言程序P如下: #include "stdio.h" void main() { int x,y,z; scanf("%d %d",&x,&y ); z=x+y; printf("z=%d\n",z); } 在IA-32+Linux+gcc环境中用gdb工具调试执行该程序,当前的断点在“printf("z=%d\n",z);”语句处(该C语句尚未执行),在可执行目标文件的反汇编代码中查找到变量x和y的地址分别是-0x18(%ebp) 和-0x14(%ebp)。当前的调试信息如下: (gdb) i r ebp ebp 0xffffd2b8 (gdb) x/8xb 0xffffd2a0 0xffffd2a0: 0xec 0xff 0xff 0xff 0x03 0x00 0x00 0x00 则输入的x和y分别是()
A、-20、3
B、3、-20
C、4294967276、3
D、0xffffffec、0x03

15、C语言程序P如下所示: #include "stdio.h" float sum(float a[],int n) { int i; float sum=0; for (i=0;i<n;i++) sum+=a[i]; return sum; } void main() { float a[3]; int n=3,x; scanf("%f %f %f",&a[0],&a[1],&a[2]); x=sum(a,n); printf("x=%d\n",x); } 在IA-32+Linux+gcc环境中执行程序P,输出的结果未必等于输入数据的求和结果。其原因是()
A、输入数据不能用float型精确表示
B、输入数据中存在阶差大于等于25的两个数
C、数据之和存在小数部分
D、数据之和大于2147483647

第四周 程序调试实践:程序的机器级表示

第四周测验

1、一条机器指令通常由多个字段构成。下列选项中不显式包含在机器指令中的是( )
A、操作码
B、寻址方式
C、下条指令地址
D、寄存器编号

2、某C语言程序中将数组变量b声明为“int b[10][5];” 有一条for语句如下: for (i=0; i<10, i++) for (j=0; j<5; j++) sum += b[i][j]; 假设执行到“sum += b[i][j];”时,sum的值在EAX中,b[i][0]所在的地址在EDX中,j在ESI中,则“sum += b[i][j];”所对应的指令(AT&T格式)可以是( )
A、addl 0(%edx, %esi, 4), %eax
B、addl 0(%esi, %edx, 4), %eax
C、addl 0(%edx, %esi, 2), %eax
D、addl 0(%esi, %edx, 2), %eax

3、设 R[ax]=FFE8H,R[bx]=7FE6H,执行指令“subw %bx, %ax”后寄存器内容和各标志变化为( )
A、R[ax]=8002H,OF=0,SF=1,CF=0,ZF=0
B、R[bx]=8002H,OF=0,SF=1,CF=1,ZF=0
C、R[ax]=8002H,OF=1,SF=1,CF=0,ZF=0
D、R[bx]=8002H,OF=1,SF=1,CF=1,ZF=0

4、设R[eax]=0000B160H,R[ebx]=00FF0110H,执行指令“imulw %bx”后寄存器内容变化为( )
A、R[eax]=00007600H,R[dx]=00BCH
B、R[eax]=00007600H,R[dx]=FFACH
C、R[eax]=FFAC7600H,其余不变
D、R[eax]=00BC7600,其余不变

5、设R[eax]=FF000008H,R[ecx]=00001000H,执行“testl %eax, %ecx”后寄存器和标志变化为( )
A、R[ecx]=00000000H,OF=CF=SF=0,ZF=1
B、R[eax]=00000000H,OF=CF=SF=0,ZF=1
C、R[ecx]=00000000H,标志不变
D、寄存器内容不变,OF=CF=SF=0,ZF=1

6、假定IA-32中全局数组a的声明为char *a[8],a的首地址为0x80498c0,i 在ECX中,现要将a[i]取到EAX相应宽度的寄存器中,则所用的汇编指令是( )
A、mov 0x80498c0( , %ecx), %ah
B、mov (0x80498c0, %ecx), %ah
C、mov 0x80498c0( , %ecx, 4), %eax
D、mov (0x80498c0, %ecx, 4), %eax

7、假定局部数组a的声明为int a[4]={ 0, -1, 300, 20},a的首地址为R[ebp]-16,则将a的首地址取到EDX的汇编指令是( )
A、movl -16(%ebp ), %edx
B、movl -16(%ebp, 4), %edx
C、leal -16(%ebp), %edx
D、leal -16(%ebp, 4), %edx

8、某C语言程序中有以下两个变量声明: double a[10]; double *ptr=&a[0]; 则表达式”ptr+i“的值为( )
A、&a[0]+i
B、&a[0]+2*i
C、&a[0]+4*i
D、&a[0]+8*i

9、假定静态short型二维数组b和指针数组pb的声明如下: static short b[2][4]={ { 2, 9, -1, 5}, { 3, 1, -6, 2}}; static short *pb[2]={ b[0], b[1]}; 若b和pb的首地址分别为0x8049820、0x8049830,i在ECX中,则“*pb[i]送EAX”所对应的汇编指令序列是( )
A、movl 0x8049820( , %ecx, 2), %edx movl (%edx), %eax
B、movl 0x8049820( , %ecx, 2), %edx leal (%edx), %eax
C、movl 0x8049830( , %ecx, 4), %edx movl (%edx), %eax
D、movl 0x8049830( , %ecx, 4), %edx leal (%edx), %eax

10、过程A调用过程B,过程B进一步调用过程C。过程B在其栈帧中定义了一个非静态数组用作缓冲区,并将该数组的首地址作为参数传递给过程C。 假设过程C按数组成员的存储顺序,向该数组循环写入数据并最终发生了地址溢出——即写入操作所访问的内存地址超出了数组的存储地址范围,则该写入操作在触发内存访问异常前,不可能破坏下列哪项? ( )
A、A调用B时记录的返回地址
B、A为调用B而准备的实参
C、B定义的除数组缓冲区以外的其它非静态局部变量
D、B为调用C而准备的实参

11、已知地址0x80484d0处的指令反汇编显示为 “80484d0: e8 91 ff ff ff call 8048466“。该call指令采用相对寻址方式,“e8”是操作码,后面4个字节是偏移量。IA-32是小端方式处理器,在IA-32+Linux+gcc的环境中,执行该call指令后的调试信息如下: (gdb) i r eip eip ① (gdb) x/1xw $esp 0xffffd290: ② 则①和②处的内容分别是 ( )
A、0x08048466、0x080484d0
B、0x080484d5、0x08048466
C、0x08048466、0x080484d5
D、0x080484d0、0x08048466

12、若过程A调用过程B,B是一个递归函数。若已经第3次递归调用B(即已经执行过3次“call B”指令),在IA-32+Linux+gcc的环境中,当前的调试信息如下 : (gdb) i r esp ebp esp 0xffffd28c ebp 0xffffd28c (gdb) x/1xw $esp 0xffffd28c: 0xffffd2a8 则此时第2次递归调用B时的栈空间开销为 ( )
A、28字节
B、24字节
C、18字节
D、4字节

13、函数sum()的反汇编代码如下: int sum(int a[],int n) { int i,sum=0; 8048406: 55 push %ebp 8048407: 89 e5 mov %esp,%ebp 8048409: 83 ec 10 sub $0x10,%esp 804840c: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) for (i=0;i<n;i++) 8048413: c7 45 f8 00 00 00 00 movl $0x0,-0x8(%ebp) 804841a: eb 18 jmp 8048434 <sum+0x2e> sum+=a[i]; 804841c: 8b 45 f8 mov -0x8(%ebp),%eax 804841f: 8d 14 85 00 00 00 00 lea 0x0(,%eax,4),%edx 8048426: 8b 45 08 mov 0x8(%ebp),%eax 8048429: 01 d0 add %edx,%eax 804842b: 8b 00 mov (%eax),%eax 804842d: 01 45 fc add %eax,-0x4(%ebp) for (i=0;i<n;i++) 8048430: 83 45 f8 01 addl $0x1,-0x8(%ebp) 8048434: 8b 45 f8 mov -0x8(%ebp),%eax 8048437: 3b 45 0c cmp 0xc(%ebp),%eax 804843a: 7c e0 jl 804841c <sum+0x16> return sum; 804843c: 8b 45 fc mov -0x4(%ebp),%eax } 804843f: c9 leave 8048440: c3 ret 执行函数sum( )过程中,需要执行的指令条数至少是( )
A、10
B、12
C、19
D、22

14、在IA-32+Linux+gcc环境,编译下述C语言代码段的乘法运算时,适合的指令是( ) int x=3,y=4,z; z=x*y;
A、带符号整数乘法指令
B、无符号整数乘法指令
C、整数加法指令
D、移位指令

15、C语言程序P如下: int sum(int x,int y) { int z; z=x+y; return z; } void main() { int x=-20,y=3,z; z=sum(x,y); printf("z=%d\n",z); } 在IA-32+Linux+gcc环境中用gdb工具调试执行该程序,当前的断点在“return z;”语句处,当前的调试信息如下: (gdb) i r ebp esp ebp 0xffffd290 0xffffd290 esp 0xffffd280 0xffffd280。 为查看调用函数sum()时的参数x和y的内容,可以采用的命令是( )
A、x/2xw $ebp+8
B、x/8xw $esp
C、x/5xw $esp
D、x/4xw 0xffffd290

16、若函数sum( )的某次调用对应的C语句为“x=sum(a,n);”,其对应的机器级指令如下: pushl -0x20(%ebp) lea -0x18(%ebp),%eax push %eax call 8048466 <sum> add $0x8,%esp mov %eax,-0x1c(%ebp) 在sum( )的函数说明中,对应参数a的变量定义可以是( )
A、int a[ ];
B、int *a;
C、int a;
D、int &a;

第五周 程序调试实践:二进制程序逆向工程

第五周测验

1、实验阶段0中,用于与输入拆解字符串进行比较的程序内置字符串的起始内存地址是什么?(地址形式是前缀0x后跟8个十六进制数字——共10个字符,注意其中的英文字符全部采取小写形式,例如0x080489ab)

2、实验阶段0中,根据字符串比较函数返回值及其测试结果进行控制分支跳转的指令所在的起始内存地址是什么?(地址形式是前缀0x后跟8个十六进制数字——共10个字符,注意其中的英文字符全部采取小写形式,例如0x080489ab)

3、实验阶段0的拆解字符串是什么?(注意必须准确输入拆解字符串,不能多输、少输、错输且大小写必须一致——详见实验说明文档)

4、实验阶段1中,用于初始化程序内置浮点数的整数值是多少?(整数值表示形式是前缀0x后跟8个十六进制数字——共10个字符,注意其中的英文字符全部采取小写形式,例如0x1234abcd)

5、实验阶段1中,当程序执行调用sscanf函数的call指令之后(且在开始执行sscanf函数的第一条指令之前),phase_1过程的栈帧的大小是多少?(从栈帧中保存的EBP寄存器旧值开始算起——详见前导理论课程中相关内容。栈帧大小的整数值表示形式是前缀0x后跟8个十六进制数字——共10个字符,注意其中的英文字符全部采取小写形式,例如0x0000001a)

6、实验阶段1的拆解字符串是什么?(注意必须准确输入拆解字符串,不能多输、少输、错输且大小写必须一致——详见实验说明文档)

7、实验阶段2中,从拆解字符串中读入的数字序列在栈帧中的存储首地址相对于栈帧基址(即寄存器EBP的值)的偏移量是多少?(偏移量表示为32位补码,具体形式是前缀0x后跟8个十六进制数字——共10个字符,注意其中的英文字符全部采取小写形式,例如0xffffffab)

8、实验阶段2的拆解字符串是什么?(注意必须准确输入拆解字符串,不能多输、少输、错输且大小写必须一致——详见实验说明文档)

9、实验阶段3中,用于基于输入数字进行控制分支跳转(对应C语言的switch语句)的跳转表的起始内存地址是什么?

10、实验阶段3的拆解字符串是什么?(注意必须准确输入拆解字符串,不能多输、少输、错输且大小写必须一致——详见实验说明文档)

第六周 程序调试实践:缓冲区溢出攻击

第六周测验

1、实验Level 0中,getbuf过程中的字符缓冲区数组buf在栈帧中的存放首地址相对于栈帧基址(即寄存器EBP的值)的偏移量是多少?(偏移量表示为32位补码,具体形式是前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0xffffffab)

2、实验Level 0中,为完成缓冲区溢出攻击的目标,至少应对攻击字符串中相对于起始字符(对应0偏移)多少偏移量开始的4个字节进行合理设置?(偏移量具体形式是前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x0000001a)

3、(接上题)实验Level 0中,为完成缓冲区溢出攻击的目标,应将攻击字符串中自上题偏移量开始的4个字节依次设为什么值?(每个字节的值须表示为前缀0x后跟2个十六进制数字,注意其中的数字a-f应采取小写形式,相邻字节之间以单个空格分隔,例如0x1a 0x2b 0x3c 0x4d)

4、实验Level 1中,假设getbuf过程刚执行完call指令前一条的push指令时,ESP寄存器的值是0x55683a38,则刚执行完getbuf过程最后一条ret指令时,ESP寄存器的值是什么?(寄存器值须表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x1234abcd)

5、实验Level 1中,如果将攻击字符串中偏移量0x3a开始的4个字节依次设置为0xed、0x93、0x04、0x08,并假设getbuf过程在调用Gets过程前EBP寄存器的值是0x55683280,则执行fizz过程中第一条“mov 0x8(%ebp),%edx”指令时,0x8(%ebp)对应的地址值是什么?(地址应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x1234abcd)

6、实验Level 1中,如果将攻击字符串中偏移量0x3a开始的4个字节依次设置为0xf3、0x93、0x04、0x08,则攻击字符串中偏移量0x36开始的4个字节应依次设置为什么值,即可完成本级别缓冲区溢出攻击的目标?(每个字节的值须表示为前缀0x后跟2个十六进制数字,注意其中的数字a-f应采取小写形式,相邻字节之间以单个空格分隔,例如0x1a 0x2b 0x3c 0x4d)

7、实验Level 2中,假设实施攻击的机器指令代码自攻击字符串的起始开始存放,则攻击字符串中偏移量0x3a开始的4个字节应依次设置为什么值?(每个字节的值须表示为前缀0x后跟2个十六进制数字,注意其中的数字a-f应采取小写形式,相邻字节之间以单个空格分隔,例如0x1a 0x2b 0x3c 0x4d)

8、实验Level 2中,全局变量global_value在程序运行时的起始存储地址是什么?(地址须表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x1234abcd)

9、实验Level 3中,rumble过程的输入参数是某一字符串的存储地址,该字符串的各字节内容(ASCII编码)依次应是什么?(注意:最后字节应是标识C语言字符串结束的特殊字符;每个字节应表示为前缀0x后跟2个十六进制数字,注意其中的数字a-f应采取小写形式,相邻字节之间以单个空格分隔,例如0x1a 0x2b 0x3c 0x4d 0x5e 0x6f ...)

10、实验Level 3中,假设攻击代码在栈中自地址0x55683270开始存储了上述用于rumble过程调用的字符串的内容,进而(在若干必要指令之后)使用push指令自栈地址0x55683224开始存储了4个字节的rumble过程的首条指令地址,紧接着使用ret指令跳至rumble过程执行,则自栈地址0x5568322c开始的4个字节的内容依次应是什么?(每个字节的值须表示为前缀0x后跟2个十六进制数字,注意其中的数字a-f应采取小写形式,相邻字节之间以单个空格分隔,例如0x1a 0x2b 0x3c 0x4d)

第七周 程序调试实践:程序的链接

第七周测验

1、程序模块phase1.o的.text节中,对输出字符串的引用位于自什么偏移量开始的4个字节?(偏移量应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x0000000e)

2、在程序模块phase1.o的.data节中,输出字符串的内容自什么偏移量开始存放?(偏移量应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x000000a9)

3、实验Phase 1中,输出字符串的内容自二进制可重定位目标文件phase1.o的什么偏移量开始存放?(偏移量应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x000012ab)

4、程序模块phase1.o中包含的原始未经修改的输出字符串的前8个字符的ASCII编码依次是什么?(每个字符的ASCII编码应表示为前缀0x后跟2个十六进制数字,注意编码中的数字a-f应采取小写形式,相邻编码之间以单个空格分隔,例如0x1a 0x2b 0x3c 0x4d 0x5e 0x6f 0x20 0x20)

5、程序模块phase2.o的.text节中,对字符串输出函数puts的引用位于自什么偏移量开始的4个字节?(偏移量应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x0000001a)

6、实验Phase 2中,do_phase过程中第一条nop指令(机器码0x90)存储于二进制可重定位目标文件phase2.o的什么偏移量位置?(偏移量应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x0000001a)

7、程序模块phase2.o中,假设在.text节中do_phase过程的“mov %esp,%ebp”指令(机器码为“89 e5”)后,紧接着加入调用目标输出函数的机器码形如“e8 ?? ?? ?? ??”的call指令(注意每对“??”代表一个字节的十六进制表示——实际上在call指令之前还应加入参数压栈等多条指令,此处仅为假设以方便确定偏移量),则此处表示为“??”的4个字节的值依次是什么?(每个字节的值应表示为前缀0x后跟2个十六进制数字,注意其中的数字a-f应采取小写形式,相邻字节之间以单个空格分隔,例如0x1a 0x2b 0x3c 0x4d)

8、程序模块phase3.o的do_phase过程中使用的COOKIE字符串的内容是什么?(提示:COOKIE字符串由互不相同的大写英文字符组成,与慕课号字符串等长)

9、程序模块phase3.o的.text节中,对do_phase过程中switch语句所对应的跳转表的引用位于自什么偏移量开始的4个字节?(偏移量应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x0000001a)

10、为输出慕课号中的字符'U',应对二进制可重定位目标文件phase3.o的自什么偏移量开始的4个字节进行相应修改?(注意:按实验要求,该修改不能针对.text节及其重定位节中的内容。偏移量应表示为前缀0x后跟8个十六进制数字——共10个字符,注意其中的数字a-f应采取小写形式,例如0x000012ab)

第八周 程序性能分析与优化

第八周测验

1、使用perf工具的哪个命令可以即时查看整个系统中各个程序的综合profiling统计
A、perf top
B、perf record
C、perf report
D、perf stat

2、若想了解程序中哪些指令耗费了较多的时间,最合适的工具是
A、perf
B、strace
C、ltrace
D、gprof

3、strace/ltrace实现子进程的递归追踪的命令行选项是
A、-T
B、-p
C、-f
D、-q

4、strace/ltrace实现打印调用时间的命令行选项是
A、-T
B、-p
C、-f
D、-q

5、glibc中的memcpy在复制大内存时的速度显著快于手工实现的若干版本,是因为
A、使用了CPU提供的SIMD指令
B、编译器针对glibc作了特殊的优化
C、使用了动态链接,无需静态链接代码
D、运行时进行了内存对齐

6、movzbl (%esi, %ecx, 1), %eax 指令的行为是
A、将地址是%esi + %ecx的内存零扩展后赋值给%eax寄存器
B、将地址是%esi + %ecx * 2的内存符号扩展后赋值给%eax寄存器
C、将地址是%esi + %ecx的内存符号扩展后赋值给%eax寄存器
D、将地址是%resi + %ecx * 2的内存符号扩展后赋值给%eax寄存器

7、考虑在x86/Linux平台上的应用程序,以下指令执行时可能陷入操作系统内核执行的有
A、movl $1, (%eax)
B、addl $1, %eax
C、cld
D、mfence

8、考虑在x86/Linux平台上的应用程序解引用一个int32_t *,其地址不是4的倍数,这是一个不对齐的内存访问。以下说法正确的是
A、解引用将会导致硬件异常,陷入操作系统内核
B、解引用可能取出错误的数据
C、不会引发性能问题,因硬件已屏蔽不对齐内存访问的实现细节
D、可能会引发性能问题

9、性能优化的基本原则是
A、不要过早做不成熟的优化
B、不要优化
C、性能分析工具是无用的
D、不需要关注系统的workloads

10、编译优化和性能调优的关系,以下说法正确的是
A、不需要编译优化
B、不需要性能调优
C、性能调优和编译优化总是互斥的,二者选其一进行
D、性能调优时需充分考虑编译器已进行的优化

期末考试

期末考试试卷

1、假设C程序中一函数调用语句为“test( a, &b, &c );”,并且变量a、b、c的值分别存储在地址-0x18(%ebp) 、-0x1c(%ebp) 、-0x20(%ebp)开始的存储单元中。该函数调用时,参数入栈过程所对应的机器级指令序列是:()
A、mov -0x20(%ebp), %eax push %eax mov -0x1c(%ebp), %eax push %eax pushl -0x18(%ebp)
B、lea -0x20(%ebp), %eax push %eax lea -0x1c(%ebp), %eax push %eax pushl -0x18(%ebp)
C、pushl -0x18(%ebp) lea -0x1c(%ebp), %eax push %eax lea -0x20(%ebp), %eax push %eax
D、lea -0x18(%ebp), %eax push %eax pushl -0x1c(%ebp) pushl -0x20(%ebp)

2、下列指令中,执行后不会改变esp寄存器内容的是:()
A、jmp *%eax
B、leave
C、push %ebp
D、call 0x8048604

3、C语言程序段如下所示: unsigned int ui1 = 246288; short si = ui1; unsigned int ui2 = si; 假设变量ui1、si、ui2分别被分配在-0x18(%ebp) 、-0x14(%ebp) 、-0x10(%ebp)地址单元。在IA-32+Linux+GCC的环境中,执行上述程序段后,相应的调试信息如下: (gdb) x/4xb $ebp-0x10 0xffffd2ac: ① ② ③ ④ 则①、②、③、④处的内容分别是:()
A、0xff、0xff、0xc2、0x10
B、0x10、0xc2、0xff、0xff
C、0x00、0x00、0xc2、0x10
D、0x10、0xc2、0x00、0x00

4、已知某程序部分代码及其反汇编后的机器级代码如下: void add (int x, int y, int *z ) { ...... *z = x + y; 8048469:8b 55 08 mov 0x8(%ebp),%edx 804846c:8b 45 0c mov 0xc(%ebp),%eax 804846f:01 c2 add %eax,%edx 8048471:8b 45 10 mov 0x10(%ebp),%eax 8048474:89 10 mov %edx,(%eax) ...... } 在IA-32+Linux+GCC的环境中,调试执行上述程序,当前调试信息如下: (gdb) i r eip eip 0x804846f (gdb) x/2xw $ebp+0x8 0xffffd294: 0xffffffe3 0x0000002a (gdb) si 0x08048471 4 *z = x + y; (gdb) i r edx edx ? 则当前edx寄存器和OF、SF、ZF、CF条件码寄存器的内容分别是:()
A、0x0000000d、0、0、0、0
B、0x0000000d、1、0、0、0
C、0x0000000d、0、0、0、1
D、0x0000000d、1、0、0、1

5、某C语言程序如下: #include <stdio.h> void main() { float f ; int x; scanf( "%f", &f ); if ( f == 134217728.0 ) //134217728=0x8000000 printf( "true\n" ); else printf( "false\n" ); } 执行上述程序时,输入下列选项的数据后,其输出结果为true的是()
A、134217740
B、134217724
C、134217720
D、134217766

6、某C语言程序部分代码及其反汇编后的机器级代码如下: 0804915c <main>: int a[4] = { -10, 804800, -201216, 1006 }; void main() { int n = 4, x; 804915c: 55 push %ebp 804915d: 89 e5 mov %esp,%ebp 804915f: 83 ec 10 sub $0x10,%esp 8049162: c7 45 fc 04 00 00 00 movl $0x4,-0x4(%ebp) x = sum( a, n ); 8049169: ff 75 fc pushl -0x4(%ebp) 804916c: 68 2c c0 04 08 push $0x804c02c 8049171: e8 dc ff ff ff call 8049152 <sum> 8049176: 83 c4 08 add $0x8,%esp 8049179: 89 45 f8 mov %eax,-0x8(%ebp) ...... } 在IA-32+Linux+GCC的环境中调试执行上述程序。假设当前执行如下调试命令: (gdb) x/1xw 0x804c02c+7 则该命令的输出是:()
A、0x47c0ffff
B、0xee0300ee
C、0xfffcee00
D、0xfcee0000

7、一C源程序文件中包含如下函数: char test( char point ) { switch( point ) { case 'a': return ...; case 'b': return ...; case 'c': return ...; ...更多跳转分支... } } 在IA-32+Linux+GCC平台上,假设GCC使用跳转表在机器级表示与实现该switch语句控制结构,进一步对相应可执行程序使用objdump进行反汇编,得到test函数的机器级指令序列如下(指令左侧为指令所在起始地址): 8048c52 <test>: 8048c52: push %ebp 8048c53: mov %esp,%ebp 8048c55: sub $0x4,%esp 8048c58: mov 0x8(%ebp),%eax 8048c5b: mov %al,-0x4(%ebp) 8048c5e: movsbl -0x4(%ebp),%eax 8048c62: sub $0x61,%eax 8048c65: cmp $0xa,%eax 8048c68: ja 8048c9d 8048c6a: mov 0x8049b40(,%eax,4),%eax 8048c71: jmp *%eax 8048c73: mov $0x64,%eax 8048c78: jmp 8048ca2 8048c7a: mov $0x5a,%eax 8048c7f: jmp 8048ca2 8048c81: mov $0x50,%eax 8048c86: jmp 8048ca2 ...更多机器指令... 8048ca2: leave 8048ca3: ret 已知字符'A'的ASCII编码是0x61。该switch语句对应的跳转表中最少应包含多少个表项?()
A、8
B、10
C、11
D、16

8、(接上题)当参数point的值为‘g’(ASCII编码为0x67)时,对应的switch语句跳转表中的表项在程序虚地址空间中的存储位置起始于下列哪个地址?()
A、0x8048c9d
B、0x8048ca2
C、0x8049b46
D、0x8049b58

9、(接上题)下列关于0x8048c71处指令的说法中正确的是:()
A、该指令完成了一次相对跳转(即其操作数给出了跳转目标地址相对于当前PC值的偏移量)
B、该指令对应的二进制机器指令目标代码中包含了跳转目标地址的小端表示
C、该指令以eax寄存器中的值作为存储器地址,进一步将位于该地址的存储器单元中保存的值作为跳转的目标地址
D、以上都不是

10、(接上题)从上列机器指令可知,程序虚地址空间中自地址0x8049b60处开始的四个字节的内容,在程序的ELF可执行文件中存放于下列哪个节中?()
A、代码(.text)节
B、只读数据(.rodata)节
C、数据(.data)节
D、符号表(.symtab)节

11、针对如下在IA-32+Linux+GCC平台上编译运行的C语言程序: struct Record { char name[7]; short grade; int id; ...其他结构成员... }; char init_name[] = "AaBbCcDdEeFfGg"; // 字符串中没有空格 void init( struct Record rec_list[], int rec_num ) { char *p1, *p2; for ( struct Record *pr = rec_list; pr < rec_list + rec_num; pr ++ ) { pr->grade = -1; ...其他程序语句(不修改pr->grade的值)... for ( p1 = init_name, p2 = pr->name; *p1; p1++, p2++ ) *p2 = *p1; } } 假设init过程在寄存器edx中保存了局部变量pr的值,则下列哪条指令可实现“pr->id = -1”?()
A、movl $0xffffffff, (%edx)
B、movl $0xffffffff, 9(%edx)
C、movl $0xffffffff, 10(%edx)
D、movl $0xffffffff, 12(%edx)

12、(接上题)假设将某一Record结构数组及其中包含的结构元素数量做为参数输入init过程中,则init过程执行完成后,该数组中包含的任一Record结构中的grade成员变量的值是:()
A、18021
B、17764
C、25925
D、-1

13、(接上题)对上列源程序编译后得到的可重定位目标文件(使用objdump)进行反汇编,得到程序的机器级指令序列如下(指令左侧为指令在代码节中的偏移量,注意偏移量0x11、0x17、0x1a、0x4d、0x68处的部分指令内容被有意隐去了): 00000000 <init>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 ec 10 sub $0x10,%esp 6: 8b 45 08 mov 0x8(%ebp),%eax 9: 89 45 f4 mov %eax,-0xc(%ebp) c: eb 43 jmp 51 <init+0x51> e: 8b 45 f4 mov -0xc(%ebp),%eax 11: 66 c7 ** ** ** ** movw $0xffff,慕课答案大全

(%eax) 17: 慕课答案大全

慕课答案大全

1a: 慕课答案大全

慕课答案大全

21: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) 28: 8b 45 f4 mov -0xc(%ebp),%eax 2b: 89 45 f8 mov %eax,-0x8(%ebp) 2e: eb 13 jmp 43 <init+0x43> 30: 8b 45 fc mov -0x4(%ebp),%eax 33: 0f b6 10 movzbl (%eax),%edx 36: 8b 45 f8 mov -0x8(%ebp),%eax 39: 88 10 mov %dl,(%eax) 3b: 83 45 fc 01 addl $0x1,-0x4(%ebp) 3f: 83 45 f8 01 addl $0x1,-0x8(%ebp) 43: 8b 45 fc mov -0x4(%ebp),%eax 46: 0f b6 00 movzbl (%eax),%eax 49: 84 c0 test %al,%al 4b: 75 e3 jne 30 <init+0x30> 4d: 83 45 f4 慕课答案大全

addl $慕课答案大全

,-0xc(%ebp) 51: 8b 55 0c mov 0xc(%ebp),%edx 54: 89 d0 mov %edx,%eax 56: c1 e0 02 shl $0x2,%eax 59: 01 d0 add %edx,%eax 5b: c1 e0 02 shl $0x2,%eax 5e: 89 c2 mov %eax,%edx 60: 8b 45 08 mov 0x8(%ebp),%eax 63: 01 d0 add %edx,%eax 65: 39 45 f4 cmp %eax,-0xc(%ebp) 68: 72 ?? jb 慕课答案大全

<init+慕课答案大全

> 6a: 90 nop 6b: c9 leave 6c: c3 ret 从中可知init过程的局部变量p2在该过程的栈帧中的存储地址是:()
A、-0x4(%ebp)
B、-0x8(%ebp)
C、-0xc(%ebp)
D、-0x10(%ebp)

14、(接上题)上列init过程的某一条指令中包含了需要在链接过程中被重定位的引用,该引用的起始偏移量是:()
A、0x13
B、0x24
C、0x21
D、0x50

15、(接上题)对照上列机器指令和C源程序,可推断偏移量0x4d处指令中的立即数操作数的值是:()
A、0x12
B、0x14
C、0x18
D、0x1c

16、(接上题)偏移量0x69处的字节值(标记为"??")应是:()
A、0x43
B、0xa4
C、0xd2
D、0xe3

17、针对如下三个实现矩阵求和的不同函数: int a[N][N]; int sumA( int a[N][N] ) { int i, j; int sum = 0; for ( i = 0; i < N; i++ ) for ( j = 0; j < N; j++ ) sum += a[i][j]; return sum; } int sumB( int a[N][N] ) { int i, j; int sum = 0; for ( j = 0; j < N; j++ ) for ( i = 0; i < N; i++ ) sum += a[i][j]; return sum; } int sumC( int a[N][N] ) { int i, j; int sum = 0; for ( j = 0; j < N; j+=2 ) for ( i = 0; i < N; i+=2 ) sum += ( a[i][j] + a[i+1][j] + a[i][j+1] + a[i+1][j+1] ); return sum; } 当N足够大的时候,三个函数的运行时间t1、t2、t3符合下列哪种情况?()
A、t1 > t2 > t3
B、t3 > t2 > t1
C、t3 > t1 > t2
D、t2 > t3 > t1

18、假定某数采用IEEE 754单精度浮点数格式表示为BFE00000H,则该数的值以十进制表示为:()
A、1.75
B、1.01
C、-1.75
D、–1.01

19、在C语言中,如要给一个较大的的数组赋值,以下方式性能较好的是:()
A、for ( int i = 0; i < N; i++ ) for ( int j = 0; j < N; j++ ) mat[j][i] = val;
B、for ( int i = 0; i < N; i++ ) for ( int j = N - 1; j >= 0; j-- ) mat[i][j] = val;
C、for ( int i = N - 1; i >= 0; i-- ) for ( int j = N - 1; j >= 0; j-- ) mat[j][i] = val;
D、for ( int i = N - 1; i >= 0; i-- ) for ( int j = N - 1; j >= 0; j-- ) mat[j][i] = val;

20、以下关于性能问题的陈述,正确的是:()
A、编译优化能解决性能问题
B、不需要做性能优化
C、避免在不理解性能瓶颈时做出盲目的优化
D、当出现性能问题时,应当利用CPU提供的高效指令进行优化