以下是函数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> |
(1)分别画出执行第7行和第10行汇编指令后栈中的信息存放情况。要求给出存储地址和存储内容,并指出存储内容的含义(如返回地址、EBX旧值、局部变量、入口参数等)。
(2)当执行到getline的ret指令时,假如程序不发生段错误,则正确的返回地址是什么?发段错误是因为执行getline的ret指令时得到了什么样的返回地址?
(3)执行完第10行汇编指令后,哪些寄存器的内容已被破坏?
(4)除了可能发生缓冲区溢出以外,getline的C代码还有哪些错误?
过程
P调用
| | |
| | |
| | |
过程
P调用
