LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1024|回复: 13

缓冲区的大小?

[复制链接]
发表于 2005-5-2 15:46:18 | 显示全部楼层 |阅读模式

  1. /*
  2. *program.c
  3. */
  4. #include<stdio.h>

  5. void test(void)
  6. {
  7.         char small[30];
  8.         gets(small);
  9.         printf("%s\n", small);
  10. }

  11. int
  12. main(void)
  13. {
  14.         test();
  15.         return 0;
  16. }

  17. ./program
  18. /*
  19. *39个
  20. */
  21. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  22. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  23. ./program
  24. /*
  25. *40个
  26. */
  27. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  28. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  29. 段错误

  30. $gdb program

  31. (gdb) disas test
  32. Dump of assembler code for function test:
  33. 0x08048394 <test+0>:        push   %ebp
  34. 0x08048395 <test+1>:        mov    %esp,%ebp
  35. 0x08048397 <test+3>:        sub    $0x38,%esp /*56 byte*/
  36. 0x0804839a <test+6>:        lea    0xffffffd8(%ebp),%eax
  37. 0x0804839d <test+9>:        mov    %eax,(%esp)
  38. 0x080483a0 <test+12>:        call   0x804829c <gets>
  39. 0x080483a5 <test+17>:        lea    0xffffffd8(%ebp),%eax
  40. 0x080483a8 <test+20>:        mov    %eax,0x4(%esp)
  41. 0x080483ac <test+24>:        movl   $0x80484f4,(%esp)
  42. 0x080483b3 <test+31>:        call   0x80482bc <printf>
  43. 0x080483b8 <test+36>:        leave  
  44. 0x080483b9 <test+37>:        ret   
  45. End of assembler dump.

复制代码

0x08048397 <test+3>:        sub    $0x38,%esp /*56 byte*/
可以看出分配的是56byte,怎么40个x就会产生溢出呢?
 楼主| 发表于 2005-5-2 22:45:45 | 显示全部楼层
56byte的栈中是不是这样分配的
small[]/*40byt*/
small address/*4byte*/
0x080483a5 /*4byte*/
small address/*4byte*/
0x080483b8 /*4byte*/

对了,若
small[]分配40byte
那怎么input 40个 x 就会 Segment faulty ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-2 22:56:19 | 显示全部楼层
对了,还有'\0'
回复 支持 反对

使用道具 举报

发表于 2005-5-3 00:03:17 | 显示全部楼层
Never use gets()! Instead:
fgets(small, sizeof small, stdin);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 08:29:23 | 显示全部楼层
i only want to have a experiment of buffer overflows.
回复 支持 反对

使用道具 举报

发表于 2005-5-3 09:18:47 | 显示全部楼层
不给一个局部字符数组赋初值,想不出错才怪

你这里small的大小是40没错,但是通过这种方式来检测其大小不是太愚蠢了吗。C/C++中没有字符串这种基础类型,字符串的判别是通过\0的,所以对于这种内容为随机字符序列来说,哪一位会是\0就是不确定的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 15:27:44 | 显示全部楼层
是我搞错了

我想应该是这样的
small[]/*40byt*/
。。。/*不知道这12byte是干什么用的?*/
small address/*4byte*/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 15:41:59 | 显示全部楼层
>>DoDo 不知道你有什么好的方法来确定small的大小
现在要讨论的不是small空间中那位是‘0’的问题
回复 支持 反对

使用道具 举报

发表于 2005-5-3 16:16:20 | 显示全部楼层
sizeof
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-3 18:20:07 | 显示全部楼层
>>DoDo
看来你没看明白该贴的意思
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表