搜索文章:

首页  |  Java技术  |  Asp.net  |  Asp编程  |  VC/C++  |  Delphi  |  VB编程

怎样编写远程漏洞测试代码

文章作者:robin walser
翻译:冰血封情 [e.s.t]
来源:邪恶八进制安全小组

强烈推荐英文基础好的不要下载我的翻译 因为冰血封情的e文水平问题 技术翻译中存在错漏纯属必然
所以本翻译文章仅仅是给一些英文不太好的朋友对照阅读 以便学习的
英文原文_exploits.htm" target=_blank>http://www.zone-h.org/files/32/remote_exploits.htm

注意 本文章为翻译粗稿 通宵翻译 必定有错 欢迎大家上来指正...文章整理核对后发原创区 草稿先发内部了...

1 介绍

大家好,欢迎阅读我的首篇英语文章,同时也是我的首篇关于exploit coding的文章,随后我将会引导你去探索remote exploits编写基础的奥秘。为了能够跟上我所讲的知识,您应该已经掌握了c socket编程和ansi c,当然最好您已经明白了local exploits是怎么工作的。如果你还对这些前置知识有些陌生,那么我推荐您还是先阅读一下其他的技术资料,比如:
《the c programming language》(kernighan/ritchie)
《unix network programming》(richard stevens)
我的主页上还有一篇很不错的有关exploits的技术文章,也就是《smashing the stack for fun and profit》(aleph1)

2 如何发并完成我们的整个任务呢

好咧,咱们现在做什么呢?我们现在要测试一个有问题的程序(vulnerable.c)并且想要得到一个remote shell。我们首先来找可以利用的安全漏洞。然后仔细的阅读vulnerable.c,编译并且尝试利用这个漏洞。再然后,我们来看看这个有问题的程序,并且注意到程序中有问题的函数。接下来我们盘算着如何触发溢出,我们的exploit的代码大概的结构是怎样的,最后我们动工完成exploit。


#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>


#define buffer<a href="#" target="_blank">_</a>size 1024
#define name<a href="#" target="_blank">_</a>size 2048


int handling(int c)

{
char buffer[buffer<a href="#" target="_blank">_</a>size], name[name<a href="#" target="_blank">_</a>size];
int bytes;
strcpy(buffer, "my name is: ");
bytes = send(c, buffer, strlen(buffer), 0);
if (bytes == -1)
return -1;
bytes = recv(c, name, sizeof(name), 0);
if (bytes == -1)
return -1;
name[bytes - 1] = ’\0’;
sprintf(buffer, "hello %s, nice to meet you!\r\n", name);
bytes = send(c, buffer, strlen(buffer), 0);
if (bytes == -1)
return -1;
return 0;

}


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

{
int s, c, cli<a href="#" target="_blank">_</a>size;
struct sockaddr<a href="#" target="_blank">_</a>in srv, cli;
if (argc != 2)
{
fprintf(stderr, "usage: %s port\n", argv[0]);
return 1;
}
s = socket(af<a href="#" target="_blank">_</a>inet, sock<a href="#" target="_blank">_</a>stream, 0);
if (s == -1)
{
perror("socket() failed");
return 2;
}
srv.sin<a href="#" target="_blank">_</a>addr.s<a href="#" target="_blank">_</a>addr = inaddr<a href="#" target="_blank">_</a>any;
srv.sin<a href="#" target="_blank">_</a>port = htons( (unsigned short int) atol(argv[1]));
srv.sin<a href="#" target="_blank">_</a>family = af<a href="#" target="_blank">_</a>inet;
if (bind(s, &srv, sizeof(srv)) == -1)
{
perror("bind() failed");
return 3;
}
if (listen(s, 3) == -1)
{
perror("listen() failed");
return 4;
}
for(;;)
{
c = accept(s, &cli, &cli<a href="#" target="_blank">_</a>size);
if (c == -1)
{
perror("accept() failed");
return 5;
}
printf("client from %s", inet<a href="#" target="_blank">_</a>ntoa(cli.sin<a href="#" target="_blank">_</a>addr));
if (handling(c) == -1)
fprintf(stderr, "%s: handling() failed", argv[0]);
close(c);
}
return 0;

}
相关文章:
© 2006   www.java-asp.net