首页 > 试题广场 >

以下是函数getline存在漏洞和问题的C语言代码实现,下面

[问答题]
以下是函数getline存在漏洞和问题的C语言代码实现,下面是其对应的反汇编部分结果:
char *getline()
{
    char buf[8];
    char *result;
    gets(buf);
    result=malloc(strlen(buf));
    strcpy(result,buf);
    return result;
}



1    0804840c        <getline>:
2    804840c             55                                     push        %ebp
3    804840d            89 e5                                 mov         %esp,%ebp
4    804840f             83 ec 28                             sub         $0x28,%esp
5    8048412            89 5d f4                             mov         %ebx,-0xc(%ebp)
6    8048415            89 75 f8                             mov         %esi,-0x8(%ebp)
7    8048418            89 7d fc                             mov         %edi,-0x4(%ebp)
8    804841b            8d 75 ec                            lea           0x14(%ebp),%esi
9    804841e            89 34 24                            mov        %esi,(%esp)
10    8048421          e8 a3 ff ff ff                        call         80483c9 <gets>
假定有一个调用过程P调用了函数getline,其返回地址为0x80485c8,在过程P中为了调用函数getline而执行call指令后,部分寄存器的内容如下:R[edp]=0xbffc0800,R[esp]=0xbffc07f0,R[ebx]=0x5,R[esi]=0x10,R[edi]=0x8.执行程序时从标准输入读入的一行字符串为“0123456789ABCDEF0123456789A”,此时,程序会发生错误(segmentation fault)并终止执行,经调试确认错误是在执行getline的ret指令时发生的。回答下列问题或完成下列任务。
(1)分别画出执行第7行和第10行汇编指令后栈中的信息存放情况。要求给出存储地址和存储内容,并指出存储内容的含义(如返回地址、EBX旧值、局部变量、入口参数等)。
(2)当执行到getline的ret指令时,假如程序不发生段错误,则正确的返回地址是什么?发段错误是因为执行getline的ret指令时得到了什么样的返回地址?
(3)执行完第10行汇编指令后,哪些寄存器的内容已被破坏?
(4)除了可能发生缓冲区溢出以外,getline的C代码还有哪些错误?







过程

P调用

这道题你会答吗?花几分钟告诉大家答案吧!