我们写C/C++程序的时候,用scanf,gets,strcpy什么的,编译总会有warning,这个函数是不安全的云云。到现在才明白这个所谓的不安全是怎么回事,这个关于C的历史遗留问题真的有够严重的。。。
不安全的代码,产生的bug就不是bug那么简单了,而是exploit。这个buffer overflow attack (缓冲区溢出攻击)在安全界的知名度是不言而喻的,基本上属于最经典的漏洞之一。各种利用工具和shellcode何其多哉!
抱着亲身了解下缓冲区溢出攻击的过程,顺便体验下linux下强大的gdb的心态,就拿gets()写了个小程序练下手。
//attack.c
#include<stdio.h>
int main()
{
char s[8];
gets(s);
printf(s);
return 0;
}
生成的attack可执行文件用objdump反汇编:
080483f4 <main>:
80483f4: 55 push %ebp
80483f5: 89 e5 mov %esp,%ebp
80483f7: 83 e4 f0 and $0xfffffff0,%esp
80483fa: 83 ec 20 sub $0x20,%esp
80483fd: 8d 44 24 18 lea 0x18(%esp),%eax
8048401: 89 04 24 mov %eax,(%esp)
8048404: e8 fb fe ff ff call 8048304 <gets@plt>
8048409: 8d 44 24 18 lea 0x18(%esp),%eax
804840d: 89 04 24 mov %eax,(%esp)
8048410: e8 0f ff ff ff call 8048324 <printf@plt>
8048415: b8 00 00 00 00 mov $0x0,%eax
804841a: c9 leave
804841b: c3 ret
804841c: 90 nop
804841d: 90 nop
804841e: 90 nop
804841f: 90 nop