Programa em C - Falha de segmentação [RESOLVIDO]

1. Programa em C - Falha de segmentação [RESOLVIDO]

João Paulo
joaopdalferth

(usa Kali)

Enviado em 25/09/2018 - 17:51h

Seguinte pessoal, eu estou fazendo um treinamento para atuar no ramo de pentest. O treinamento é realizado pela empresa Desec.

Na aula que estou aprendendo C eu praticamente copiei o script que o professor fez porém quando vou copiar ele passando o host e o arquivo spider.txt que é um arquivo que contem nome para ser testado como sub dominio, ele apresenta a mensagem "Falha de segmentação" o que poderia ser essa falha?


#include <string.h> //Esse include é para que funcione os códigos de cabeçalho
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netdb.h> //Esse include e o de baixo é para que funcione os comandos do INET
#include <arpa/inet.h>
#include <fcntl.h> //Esse include aqui é para funcionar o comando open
#include <unistd.h> //Esse include aqui é para funcionar o comando close

int main(int argc, char *argv[])
{
char *alvo;
alvo = argv[1];
struct hostent *host;
char *result;
char txt[50];
FILE *spider;
spider = fopen(argv[2],"r");

if(argc < 2)
{
printf("###################################################################\n");
printf("############################ SPIDER DNS ###########################\n");
printf("############ USO: ./spiderdns alvo.com.br spider.txt ##############\n");
printf("############# João Paulo ################\n");
printf("###################################################################\n");
return(0);
}
while(fscanf(spider, "%s", &txt) != EOF)
{
result = (char *) strcat(txt,alvo);
host=gethostbyname(result);
if(host == NULL)
{
continue;
}else{
printf("HOST ENCONTRADO: %s ====> IP: %s \n", result, inet_ntoa(*((struct in_addr *)host->h_addr)));
return 0;
}
}
}



  


2. Re: Programa em C - Falha de segmentação

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/09/2018 - 08:32h

Alguns problemas que eu vi no seu programa:

  • Você usa argv[1] e argv[2] antes de testar o valor de argc. E se argc for menor que 3? Já era: o SIGSEGV veio antes.

  • Quando você finalmente testa o valor de argc, você o compara com 2, mas a comparação deveria ser com 3, porque em C os índices de arrays começam com 0, de modo que um array com três elementos tem como índices possíveis 0, 1 e 2. Mais genericamente, um array com N elementos tem índices que vão de 0 até N-1. argc é um contador de argumentos, não é o valor do índice do último argumento. Desse modo, o último argumento reside em argv[argc-1].

  • Em todos os lugares em que você manipula o array txt, você o faz de modo inseguro, não levando em consideração o tamanho para ele reservado. Você tem espaço para 50 caracteres e, como se trata de uma string, isso lhe dá espaço para 49 caracteres da string mais um byte nulo ao final (que é a forma convencionada do C de representar strings). O que você acha que acontece se uma das linhas do arquivo tiver mais de 49 caracteres de comprimento, ou se a concatenação de uma linha lida com o sufixo tiver mais do que 49 caracteres? Resposta: você tem um case de programa potencialmente vulnerável a penetração.

  • Para corrigir o problema acima, você deveria usar uma forma mais segura de leitura do arquivo, tal como fgets() ou getline(), e substituir a insegura strcat() por strncat() ou snprintf(). Além disso, dado que nomes de domínios podem ter até 253 caracteres de comprimento, talvez fosse melhor você usar um limite para sua string maior do que apenas 50.

(Fora isso, dado que você parece estar concatenando nomes curtos a um sufixo para consultas ao DNS (e/ou outras fontes de resolução de nomes, de acordo com a configuração do seu sistema), você não deveria colocar também um caráter '.' entre o nome lido do arquivo e o sufixo recebido em argv[1]?)

Por fim, você pode saber o ponto exato em que recebeu o SIGSEGV. Compile o programa com símbolos de depuração (opção “-g” do gcc) e depure-o com o gdb.


3. Re: Programa em C - Falha de segmentação

Paulo Bonfanti
pbonfanti

(usa Debian)

Enviado em 26/09/2018 - 08:41h

E ainda vou começar a aprender C (estou lotado de serviço , estou adiando), mas de cara eu já considero copiar e colar texto como o pior método de tentar aprender algo, acho que a coisa tem que ser bem progressiva,começar do bem básico, mas pode ser que esse artigo te ajude:
https://vinipsmaker.wordpress.com/2013/12/20/meu-erro-favorito-de-cc-falha-de-segmentacao/







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts