面试官不讲公平,居然让我讲讲蠕虫和金丝雀!
蠕虫病毒是一种常见的利用Unix系统中的缺点来进行攻击的病毒。缓冲区溢出一个常见的后果是:黑客利用函数调用过程中程序的返回地址,将存放这块地址的指针精准指向计算机中存放攻击代码的位置,造成程序异常中止。为了防止发生严重的后果,计算机会采用栈随机化,利用金丝雀值检查破坏栈,限制代码可执行区域等方法来尽量避免被攻击。虽然,现代计算机已经可以“智能”查错了,但是我们还是要养成良好的编程习惯,尽量避免写出有漏洞的代码,以节省宝贵的时间! 1. 蠕虫病毒简介 蠕虫是一种可以自我复制的代码,并且通过网络传播,通常无需人为干预就能传播。蠕虫病毒入侵并完全控制一台计算机之后,就会把这台机器作为宿主,进而扫描并感染其他计算机。当这些新的被蠕虫入侵的计算机被控制之后,蠕虫会以这些计算机为宿主继续扫描并感染其他计算机,这种行为会一直延续下去。蠕虫使用这种递归的方法进行传播,按照指数增长的规律分布自己,进而及时控制越来越多的计算机。 2. 缓冲区溢出 缓冲区溢出是指计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。 3. 缓冲区溢出举例 void echo() { char buf[4]; /*buf故意设置很小*/ gets(buf); puts(buf); } void call_echo() { echo(); } 反汇编如下: /*echo*/ 000000000040069c <echo>: 40069c:48 83 ec 18 sub $0x18,%rsp /*0X18 == 24,分配了24字节内存。计算机会多分配一些给缓冲区*/ 4006a0:48 89 e7 mov %rsp,%rdi 4006a3:e8 a5 ff ff ff callq 40064d <gets> 4006a8::48 89 e7 mov %rsp,%rdi 4006ab:e8 50 fe ff ff callq callq 400500 <puts@plt> 4006b0:48 83 c4 18 add $0x18,%rsp 4006b4:c3 retq /*call_echo*/ 4006b5:48 83 ec 08 sub $0x8,%rsp 4006b9:b8 00 00 00 00 mov $0x0,%eax 4006be:e8 d9 ff ff ff callq 40069c <echo> 4006c3:48 83 c4 08 add $0x8,%rsp 4006c7:c3 retq 在这个例子中,我们故意把buf设置的很小。运行该程序,我们在命令行中输入012345678901234567890123,程序立马就会报错:Segmentation fault。 要想明白为什么会报错,我们需要通过分析反汇编来了解其在内存是如何分布的。具体如下图所示: 如下图所示,此时计算机为buf分配了24字节空间,其中20字节还未使用。 (编辑:ASP站长网) |