|
|
- /*
- *program.c
- */
- #include<stdio.h>
- void test(void)
- {
- char small[30];
- gets(small);
- printf("%s\n", small);
- }
- int
- main(void)
- {
- test();
- return 0;
- }
- ./program
- /*
- *39个
- */
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- ./program
- /*
- *40个
- */
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 段错误
- $gdb program
- (gdb) disas test
- Dump of assembler code for function test:
- 0x08048394 <test+0>: push %ebp
- 0x08048395 <test+1>: mov %esp,%ebp
- 0x08048397 <test+3>: sub $0x38,%esp /*56 byte*/
- 0x0804839a <test+6>: lea 0xffffffd8(%ebp),%eax
- 0x0804839d <test+9>: mov %eax,(%esp)
- 0x080483a0 <test+12>: call 0x804829c <gets>
- 0x080483a5 <test+17>: lea 0xffffffd8(%ebp),%eax
- 0x080483a8 <test+20>: mov %eax,0x4(%esp)
- 0x080483ac <test+24>: movl $0x80484f4,(%esp)
- 0x080483b3 <test+31>: call 0x80482bc <printf>
- 0x080483b8 <test+36>: leave
- 0x080483b9 <test+37>: ret
- End of assembler dump.
复制代码
0x08048397 <test+3>: sub $0x38,%esp /*56 byte*/
可以看出分配的是56byte,怎么40个x就会产生溢出呢? |
|