缓冲区溢出攻防

很久以来,在人们心目中,“黑客”和病毒作者的身上总是笼罩着一层神秘的光环,他们被各种媒体描述成技术高手甚至技术天才,以至于有些人为了证明自己的“天才”身份而走上歧途,甚至违法犯罪。记得不久前就看到过这样一个案例:一位计算机专业研究生入侵了一家商业网站并删除了所有数据。当他在狱中接受记者的采访时,他非常自豪地说这样做只是为了证明自己和获得那种成就感。

本文讨论的缓冲区溢出攻击实际上是一项非常“古老”的技术,但它的破坏力依然不可小视——相信大家都还没有忘记几个月之前的“冲击波”。文中的代码实例几乎就是一个真实的病毒了,其中的一些技术你可能没有见过,但我可以很负责任的说它没有使用任何高深的技术,我没有进ring0,没有写设备驱动,甚至连汇编代码也只用了非常简单的11句。我希望此文能让大家重新认识一下“黑客”和病毒作者,把他们从神坛上“拉”下来。我更要提醒大家把那位“研究生”作为前车之鉴,不要滥用这项技术,否则必将玩火自焚。下面就进入正题。什么是缓冲区溢出

你一定用strcpy拷贝过字符串吧?那,如果拷贝时目的字符串的缓冲区的长度小于源字符串的长度,会发生什么呢?对,源字符串中多余的字符会覆盖掉进程的其它数据。这种现象就叫缓冲区溢出。根据被覆盖数据的位置的不同,缓冲区溢出分为静态存储区溢出、栈溢出和堆溢出三种。而发生溢出后,进程可能的表现也有三种:一是运行正常,这时,被覆盖的是无用数据,并且没有发生访问违例;二是运行出错,包括输出错误和非法操作等;第三种就是受到攻击,程序开始执行有害代码,此时,哪些数据被覆盖和用什么数据来覆盖都是攻击者精心设计的。

一般情况下,静态存储区和堆上的缓冲区溢出漏洞不大可能被攻击者利用。而栈上的漏洞则具有极大的危险性,所以我们的讲解也以栈上的缓冲区溢出为例。

攻击原理

要进行攻击,先得找到靶子。所以我就准备了一个叫做“victim”的程序作为被攻击对象,它在逻辑上等价于下面的代码:

void GetComputerName(SOCKET sck, LPSTR szComputer)
{
  char szBuf[512];
  recv(sck, szBuf, sizeof(szBuf), 0);
  LPSTR szFileName = szBuf;
  while((*szFileName) == ''\\'')
    szFileName++;
  while((*szFileName) != ''\\'' && (*szFileName) != ''\0'')
  {
    *szComputer = *szFileName;
    szComputer++;
    szFileName++;
  } 
  *szComputer = ''\0'';
}
void ShowComputerName(SOCKET sck)
{
  char szComputer[16];
  GetComputerName(sck, szComputer);
  // mov ecx,dword ptr [esp+4]
  // sub esp,10h; ———②
  // lea eax,[esp]
  // push eax
  // push ecx
  // call GetComputerName (401000h)
  printf(szComputer);
  // lea edx,[esp]
  // push edx
  // call printf (401103h)
}
  // add esp,14h
  // ret 4; ———③
int __cdecl main(int argc, char* argv[])
{
  WSADATA wsa;
  WSAStartup(MAKEWORD(2,2), &wsa);
  struct sockaddr_in saServer;
  saServer.sin_family = AF_INET;
  saServer.sin_port = 0xA05B; //htons(23456)
  saServer.sin_addr.s_addr=ADDR_ANY;
  SOCKET sckListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  bind(sckListen, (sockaddr *)&saServer, sizeof(saServer));
  listen(sckListen, 2);
  SOCKET sckClient = accept(sckListen, NULL, NULL);// ———①
  ShowComputerName(sckClient);
  closesocket(sckClient);
  closesocket(sckListen);
  WSACleanup();
  return 0;
}

时间: 2024-11-30 22:36:45

缓冲区溢出攻防的相关文章

Oracle 8i TNS Listener 缓冲区溢出漏洞

Oracle 8i TNS Listener 缓冲区溢出漏洞 (Other,缺陷)     Oracle 8i 发现重大漏洞,允许攻击者执行任意代码 详细: Oracle 8i TNS (Transparent Network Substrate) Listener 负责建立和维系客户机同 ORACLE 数据库服务的远程连接.发现该 Listener 存在缓冲区溢出漏洞.攻击者成功利用此漏洞,将能在数据库服务器上执行任意代码. 更为糟糕的是,缓冲溢出发生在验证之前,这意味着激活了口令保护机制的

iPlanet Web Server 缓冲区溢出漏洞

server|web 涉及程序: iPlanet 描述: iPlanet Web Server 缓冲区溢出漏洞 详细: iPlanet Web Server 4.x存在一个缓冲区溢出漏洞.该漏洞允许恶意的用户远程执行任意代码或产生拒绝服务攻击. 通过发送一个长度大约为 198-240 字符并以.shtml 作后缀的HTTP请求,将产生缓冲区溢出. 该漏洞只有在服务器端打开'parsing' 选项时才被利用.成功地利用这个漏洞恶意的攻击者可以完全控制目标主机. 受影响的系统:Sun Solaris

缓冲区溢出还是问题吗?C++/CLI安全编码

C++/CLI是对C++的一个扩展,其对所有类型,包括标准C++类,都添加了对属性.事件.垃圾回收.及泛型的支持. Visual C++ 2005扩展了对使用C++/CLI(通用语言基础结构)开发运行于带有垃圾回收的虚拟机上的控件及应用程序的支持,而C++/CLI是对C++编程语言的一个扩展,其对所有类型,包括标准C++类,都添加了如属性.事件.垃圾回收.及泛型等特性. Visual C++ 2005支持.NET Framework通用语言运行时库(CLR),其是垃圾回收虚拟机Microsoft

VC++中利用/GS开关防止缓冲区溢出

缓冲区溢出通常表现为一个最为常见的漏洞而存在于今天的各种软件之中,黑客可以用恶意的输入,从而更改程序的执行流程,由此入侵相应的进程.电脑.或整个域.如果进程运行于一个高度受信的账户之下,如管理员或本地系统账户,那么黑客带来的破坏将是极其严重,并有潜在广泛传播的危险.近几年来爆发的一些"知名"病毒,如红色代码.冲击波.震荡波等等,都源于C/C++代码缓冲区溢出的结果. 从程序的角度来看,缓冲区溢出只是一个再简单不过的编程错误--都是关于复制一个内存区域的内容到另一个内存区域,而目标内存区

浅谈缓冲区溢出之栈溢出<上>

有段时间没有用windows了,刚一开机又是系统补丁更新.匆匆瞥了一眼看到了"内核缓冲区溢出漏洞补丁"几个字眼.靠,又是内核补丁.打完这个补丁后MD的内核符号文件又得更新了.于是抱怨了几句,一旁的兄弟问什么是缓冲区溢出.这个-三两句话还真说不清楚.解释这个问题用C语言比较方便,但是单从C代码是看不出来什么的,具体原理要分析机器级代码才能说清楚.既然是浅谈原理,那就从最基本的开始吧. 本文的定位是对此方面一无所知的读者,所以大牛们可以直接飘过- 缓冲区溢出这个名词想必大家并不陌生吧,在微

浅谈缓冲区溢出之栈溢出<下>

上回我们简单的介绍了缓冲区溢出的基本原理和机器级代码的解释,对此类问题的分析和研究都必须建立在对程序的机器级表示有一定的了解的基础上.记得有句话是这样说的,"真正了不起的程序员是对自己代码的每一个字节都了如指掌的程序员."我们也许做不到每一字节,但至少得明晰机器级程序的组成结构和执行流程. 言归正传,我们今天在上回的基础上继续探索缓冲区溢出.之前的例子都是简单的通过越界访问来实现对程序执行流程的变动,而且执行的函数都是编译前写入的,那么如何对一个发行版的可执行程序进行缓冲区溢出呢? 首

在linux下进行缓冲区溢出实验 出现illegal instruction

问题描述 在linux下进行缓冲区溢出实验 出现illegal instruction int main(int argc, int *argv[]) { char buf[10]; if(argc>1) strcpy(buf,argv[1]); return 0; } 编译时带有-fno-stack-protector,在第一参数为21字符时正常,22字符时出现illegal instruction,23字符时出点段错误. 请问22字符时的illegal instruction是怎么回事? 解

glibc gethostbyname 缓冲区溢出漏洞 修复建议

包括Linux不支持在线升级替换内核在内, 还有这个CASE, 还是不如AIX啊. http://www.ksyun.com/indexNotice/info/2015/2185.html#80b8ba67-599d-4f7d-a0e3-196dcc238f03 一.漏洞背景 代码审计公司Qualys的研究人员在glibc库中的__nss_hostname_digits_dots()函数中发现了一个缓冲区溢出的漏洞,这个bug可以经过gethostbyname*()函数被本地或者远程的触发. 1

网络安全 缓冲区溢出-基于缓冲区溢出的网络渗透攻击

问题描述 基于缓冲区溢出的网络渗透攻击 本人大四学生一枚,请教各位大神,怎么做基于缓冲区溢出的网络渗透攻击这一课题.请大家多多指点,跪谢了! 解决方案 编写一个简单的C程序,从文件读入一个缓冲区超长的数据,让它执行一个另外的命令. 解决方案二: 话说缓冲区溢出这种课题姐姐初中的兴趣班就学过啦. 解决方案三: 大神们多多指教哈,这里拜谢 解决方案四: 缓冲区溢出攻击缓冲区溢出攻击缓冲区溢出攻击