图3-41是一个函数的(不太好的)实现,这个函数从标准输入读入一行,将字符串复制到新分配的存储中,并返回一个指向结果的指针。
考虑下面这样的场景。调用过程get_line,返回地址等于0x400076,寄存器 %rbx等于0x0123456789ABCDEF。输入的字符串为“0123456789012345678901234”。程 序会因为段错误(segmentation fault)而中止。运行GDB,确定错误是在执行get_line 的ret指令时发生的。
A.填写下图,尽可能多地说明在执行完反汇编代码中第3行指令后找的相关信息。 在右边标注出存储在栈中的数字含意(例如“返回地址”),在方框中写出它们的十六进制值(如果知道的话八每个方框都代表8个字节。指出%rsp的位置。记住,字符0〜9的ASCII代码是0x3〜0x39。
00 00 00 00 00 00 40 00 76 |
|
|
|
|
B. 修改你的图,展现调用gets的影响(第5行)。
C. 程序应该试图返回到什么地址?
D. 当get_line返回时,哪个(些)寄存器的值被破坏了?
E.除了可能会缓冲区溢出以外,get_line的代码还有哪两个错误?