因此,本质上,程序正在读取文本行,解释它们,并基于它们执行操作。这些“网络守护进程”利用的一个方便的特征是它们可以使用“标准输入”和“标准输出”与客户端计算机通信,对于正常程序,其将是键盘和运行程序的人的显示。但在这种情况下,它正在读取和写入另一台计算机上运行的另一个程序(如Microsoft Outlook)。

要了解缓冲区溢出的工作原理,您需要查看以下非常小的C程序: 

#include <stdio.h>
main(){
  char * name;
  char * dangerous_system_command;
  name =(char *)malloc(10);
  dangerous_system_command =(char *)malloc(128);
  printf(“地址名称是%d \ n”,name);
  printf(“命令地址是%d \ n”,danger_system_command);
  sprintf(danger_system_command,“echo%s”,“Hello world!”);
  printf(“你叫什么名字?
  gets(name);
  system(danger_system_command);
}}
如果你不是一个C编码器,不要担心,我会带你通过它。该程序设计为由用户在控制台上运行,但它说明了一个编写不良的网络守护程序可能导致的问题。

程序做的第一件事是声明两个字符串变量,并为它们分配内存。“name”变量被赋予10个字节的内存(这将允许它保存一个10个字符的字符串)“dangerous_system_command”变量给出128字节你必须理解的是,在C中,给予这些内存块变量将在给出程序的虚拟内存空间中彼此相邻,如果你使用短名称运行程序,你可以看到事情是如何工作的:

[jturner @ secure jturner] $ ./overrun
名称的地址是134518696
命令的地址是134518712
你叫什么名字?
你好,世界!
[jturner @ secure jturner] $
正如你可以看到的,给“danger_system_command”变量的地址是从“name”变量开始的16个字节。额外的6个字节是由“malloc”系统调用使用的开销,以允许在释放内存时将其返回到一般使用。

在分配存储器和打印两个变量的存储器位置之后,程序产生稍后将被发送到“系统”调用的命令,这使得它被排除,好像它已经在键盘上键入。在这种情况下,它所做的就是打印“Hello world!”。然后,我们提示用户他们的名字,并使用“gets”系统调用读取它。在真实网络守护进程中,这可能是打印提示并等待来自客户端程序的命令,例如网站地址或邮件地址。

重要的是要知道“gets”,它从标准输入读取一个字符串到指定的内存位置,没有“长度”规范。这意味着它将读取到达行末尾所需的字符数,即使它超出了分配的内存的末尾。知道这一点,一个笑脸黑客可以将“名称”内存溢出到“dangerous_system_command”内存,并运行他们想要的任何命令。例如:

[jturner @ secure jturner] $ ./overrun
名称的地址是134518696
命令的地址是134518712
你叫什么名字?0123456789123456cat / etc / passwd
root:x:0:0:root:/ root:/ bin / bash
bin:x:1:1:bin:/ bin:
守护进程:x:2:2:守护进程:/ sbin:
adm:x:3:4:adm:/ var / adm:
lp:x:4:7:lp:/ var / spool / lpd:
sync:x:5:0:sync:/ sbin:/ bin / sync
shutdown:x:6:0:shutdown:/ sbin:/ sbin / shutdown
halt:x:7:0:halt:/ sbin:/ sbin / halt
mail:x:8:12:mail:/ var / spool / mail

通过将名称查询的响应填充为16个字符,然后添加系统命令,系统命令将覆盖“echo Hello World!”。与“cat / etc / passwd”。如您所见,这将导致运行该命令,而不是适当的命令。

那么可以做些什么来防止这种情况呢?首先,使用fgets系统调用(它指定最大长度)将完全消除这种可能性。通过将“gets”调用更改为:

fgets(name,10,stdin); 

问题已经解决了: 

[jturner @ secure jturner] $ ./overrun
名称的地址是134518768
命令的地址是134518784
你叫什么名字?01234567890123456cat / etc / passwd
你好,世界!
[jturner @ secure jturner] $

但是,由于许多站点运行软件,他们没有源代码(例如商业数据库),你不能保护自己免受所有缓冲区溢出。您需要采取的另一个重要步骤是关闭您不使用的任何网络服务,并且只运行您在满足程序需求的权限级别使用的服务。例如,不要以root身份运行数据库,给它自己的用户和组。这样,如果它被利用,它不能用于接管系统。

缓冲区溢出是每个第一年程序设计的学生应该避免的事情之一。它仍然与这样的频率使用黑客是一个迹象,我们必须走多远去寻求真正可靠和安全的软件。

每个黑客黑客的目标是让目标系统做你不想做的事情。 一个主要的例子是显示敏感文件,如/ etc / passwd和/ etc / shadow(存储用户的用户名和加密密码)。一旦这些文件在他或她的手中,就可以使用“字典“攻击的密码。 或者,他们可以使您的系统FTP受感染的文件,并运行它,这可能是坏或坏。为了做到这一点,他们需要得到一个“可信”的程序来执行他们指定的命令。通常,这是通过“缓冲区的更多相关文章

  1. (转)linux口令相关文件(/etc/passwd和/etc/shadow)

    在linux中,口令文件在/etc/passwd中,早期的这个文件直接存放加密后的password,前两位是"盐"值,是一个随机数.后面跟的是加密的password.为了安全,如今 ...

  2. Word密码破解工具字典攻击用来干什么的

    AOPR全称Advanced Office Password Recovery作为一款专业的Word密码破解工具,是通过暴力破解的方式帮助用户迅速恢复各种Word文档的密码,其中常常会用到字典攻击,这 ...

  3. oAuth 使得第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权

    OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可 ...

  4. Nginx实战之让用户通过用户名密码认证访问web站点

    1.Nginx实战之让用户通过用户名密码认证访问web站点 [root@master ~]# vim /usr/local/nginx/conf/extra/www.conf server { lis ...

  5. PHP中Cookie的使用---添加/更新/删除/获取Cookie 及 自动填写该用户的用户名和密码和判断是否第一次登陆

    PHP中Cookie的使用---添加/更新/删除/获取Cookie 及 自动填写该用户的用户名和密码和判断是否第一次登陆  什么是cookie 服务器在客户端保存用户的信息,比如登录名,密码等 这些数 ...

  6. Linux账号和密码文件 /etc/passwd和/etc/shadow

    Linux系统中,所有用户(包括系统管理员)的账号和密码都可以在/etc/passwd和/etc/shadow这两个文件中找到,(用户和密码就放在文件中,不怕被其他人看的或者修改吗?/etc/pass ...

  7. 启动Nginx目录浏览功能及 让用户通过用户名密码认证访问web站点

    一.启动Nginx目录浏览功能  [root@abcdocker extra]# cat w.conf server { listen 80; server_name IP地址; location / ...

  8. C&C控制服务的设计和侦测方法综述——DDoS攻击,上传从宿主机偷窃的到的信息,定时给感染机文件加密勒索等。

    这篇文章总结了一些我在安全工作里见到过的千奇百怪的C&C控制服务器的设计方法以及对应的侦测方法,在每个C&C控制服务先介绍黑帽部分即针对不同目的的C&C服务器设计方法,再介绍白 ...

  9. NSUserDefaults:通常用来保存一些小巧的数据,如用户的用户名密码,或者是用户的使用习惯,如是否自动打开背景音乐等。

    1,NSUserDefaults通常用来保存一些小巧的数据,如用户的用户名密码,或者是用户的使用习惯,如是否自动打开背景音乐等. 2,使用它的原因就是:代码简短,使用方便 3,使用方法如下: -(vo ...

随机推荐

  1. Openjudge-计算概论(A)-回文串判断

    描述: 任意给定一个非空的字符串,判断其是否是回文串.回文串是指正向看和反向看均相等的串,如AbcDcbA和cDDc.如果是回文串,则输出1,否则,输出0 输入长度不小于1不大于100的字符串输出如果 ...

  2. spring 集成mongo配置

    spring继承Mongo使用的是spring-data. 如果需要加入两个mongo与spring集成的包,spring-data-commons-1.7.0.RELEASE.jar,spring- ...

  3. erlang lists模块函数使用大全

    转自:http://qqdenghaigui.iteye.com/blog/1554541 一,带函数Pred1, all(Pred, List) -> boolean()如果List中的每个元 ...

  4. 阿里云ECOS 集群方案

    转载 https://it.toggle.cn/article_detail/7e6f674b2564d6c319f807b4fda87eac.html 架构说明 前端由阿里云SLB统一分发Web请求 ...

  5. Value '0000-00-00' can not be represented as java.sql.Date

    Value '0000-00-00' can not be represented as java.sql.Date 时间 2014-07-30 09:00:50 ITeye-博客 原文  http: ...

  6. 通过实例来理解ajax

    点击一个按钮,然后将信息显示到指定的div内. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"& ...

  7. mysql5.6 online ddl—索引

    尝试对mysiam表(1500万)删除索引失败 #uk表字段类型比较简单,都是int/tinyint/timestamp类型. CREATE TABLE `uk` (  `id` int(11) NO ...

  8. c/s架构

    C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销.目前大多数应用软件 ...

  9. OC-之AFNetworking

    AFNetworking介绍与用法: http://cocoadocs.org/docsets/AFNetworking/2.4.1/index.html

  10. HDU 5755 Gambler Bo

    可以设n*m个未知量,建立n*m个方程.位置i,j可以建立方程 (2*x[i*m+j]+x[(i-1)*m+j]+x[(i+1)*m+j]+x[i*m+j-1]+x[i*m+j+1])%3=3-b[i ...