| 溢出专题(六) 利用结构异常绕过溢出保护攻击 |
|
| 作者:未知 文章来源:网络收集 点击数: 更新时间:2006-3-29 15:06:31
|
像溢出攻击,虽然已经是发展了那么多年了,但其shellcode编写也差不多是那么 一个模式。写出汇编,编译,得到二进制代码,修改汇编,编译,再得到二进制代码, 最后用\xaa\xbb的形式把二进制代码写到攻击程序里面。这在unix等下面一般 shellcode要求比较简单,那还勉强过得去,但如果应用限制,shellcode代码不能包含 一些特殊字符那又是一个麻烦的调试、修改过程。还有溢出攻击的溢出点、怎么跳到 shellcode,虽然unix下面已经比较多的办法了,但感觉也没怎么统一的考虑过,很多 人也没有去理解溢出攻击。还有溢出过程形参被覆盖后不能返回的情况,也没怎么仔细 考虑。
个人的理解溢出攻击只是通过外部条进改变了程序原来流程,而考虑改变程序流程 的办法就不只是溢出了,溢出攻击只是一个比较容易让程序流程改变并且按我们意愿运 行的比较方便的办法,还有一些边界条进,函数指针等都可能引起程序流程改变。像缓 冲溢出覆盖形式参数不能返回的问题,我们攻击是改变的程序流程,这个流程方向不能 返回了,那到底有别的流程没有?就可以考虑程序流程的别的线。这点unix下面有信号 机制,WINDOWS下面也有异常结构处理,这些都是程序运行的另一个隐蔽的流程。想到 这了就可以有解决办法了。 其实UNIX等下面发展的比较好的一些保护缓冲溢出的办法很多也相应有了一些破解 思路。像堆栈里面加上随机数等的办法,就是检测溢出后不让其返回到溢出代码,这与 形参被覆盖不能返回不就是一样的吗。这在windows下面就很好的可以绕过了,UNIX没 有具体看代码,还没有实现细节。
下面程序有溢出,但因为检测了变量j,发现有溢出就提示后退出,用于模拟一些溢 出保护或者因形参被覆盖不能返回的情况。对于这个程序我们一般的溢出攻击就不能成 功。
/* 利用异常结构绕过溢出保护攻击的有问题的例子程序except.c。 vc6.0下编译。 yuange@nsfocus.com
*/ #include #include #include
int main(int argc, char **argv) { int j; char *str; char buff1[0x0f80]; char buff2[0x1000]; struct sockaddr_in s_in; struct sockaddr addr; SOCKET fd ,fd1; u_short port; int result,i,recvbytes; WSADATA wsaData;
result = WSAStartup(MAKEWORD(1, 1), &wsaData); if (result != 0) { printf("\n SOCKET err!\n "); exit(1); } j=0; str=argv[0]; if(argc>1) port=atoi(argv[1]); else port=1080; fd = socket(AF_INET, SOCK_STREAM,0); s_in.sin_family = AF_INET; s_in.sin_port = htons(port); s_in.sin [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>
|
|
[ 收藏此页到: 天天|和讯|博采|ViVi|狐摘|我摘|天极 ] 文章录入:kinda 责任编辑:kinda |
|
上一篇文章: 如何利用格式化溢出漏洞,x86/sparc 下一篇文章: 没有了 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |