Jump to content

Leandro Fróes

Mente Binária
  • Posts

    183
  • Joined

  • Last visited

  • Country

    Brazil

Posts posted by Leandro Fróes

  1. Boa noite!

    Acho que o problema ai são conceitos de redes mano. Considerando o fato de você estar scaneando sua rede interna o IP 192.0.0.x não é um IP privado, creio que você quis dizer 192.168.0.x. Não esqueça também que o 0 e o 255 no HostID são reservados para a rede e para broadcast, respectivamente.

    Abraços :)

  2. Boa noite,

    sobre roteador assim na lata eu não sei não (se você achar pf me passa que eu também quero), mas sobre redes no geral tem o citado ali em cima pelo manin e o "TCP/IP Illustrated". A questão é que este só tem em inglês :)

    Abs

  3. Boa tarde pessoal!

     

    Muito foda que vocês tentaram, deixaram o post muito completo. Bom, mas eai? Qual a diferença? Depende kkkkkkk

     

    Até onde eu sei (e se alguém souber mais por favor, compartilhe) o parênteses serve para dar ênfase. Na prática eu vejo algumas situações que fazem diferença e duas já foram citadas aqui. São elas:

    • Incremento (ou decremento): aqui *p++ anda de acordo com o tipo de dado que o ponteiro aponta e (*p)++ da ênfase ao elemento apontado.

     

    • Percorrendo um array:
      #include <stdio.h>
      
      int main(){
      
      	int v[] = {10,20,30};
      	int *p = v;
      	int i;
      
      	for(i=0;i<3;i++){
       		printf("Com parenteses: %d\n", *(p+i));
       		printf("Sem parenteses: %d\n", *p+i);
      
      	}
      
      }

      Saída:

    Com parenteses: 10
    Sem parenteses: 10
    Com parenteses: 20
    Sem parenteses: 11
    Com parenteses: 30
    Sem parenteses: 12
    

     

    E um outro caso que não foi comentado aqui é para declaração de arrays. Quando usamos int *v[] estamos criando um array de ponteiros do tipo intero. Agora quando usamos int (*v)[] estamos criando um ponteiro para um array de inteiros.

     

    Mas é isso ai galera, desafio concluído e já achamos 3 coisas interessantes, alguém tem algo mais para mostrar para nós? :)

     

    Abraços!!

  4. Queria deixar uma pergunta interessante para se pensar antes de resolver o desafio. Considerando o ponteiro p:

     

    •  O que acontece se usarmos p++? E quando se usa (*p)++?

     

    Tente aplicar em um array e veja seus elementos =D

     

    Abraço!

  5. 1 hora atrás, kassane disse:

    *p = valor da posição de memoria;

    (*p) = valor da posição da posição de memória neste caso usando um array/vetor

     

    
    void f()
    {
      	int v[] = {1, 2, 3}, x=24;
      int * p= NULL;
      
      p = &x;
      
      std::cout << *p << "!\n"; //output o valor de x = 24
      std::cout << (*v)+1 << "!\n"; //output 2
      
    }

    PS: Caso eu tenha dito besteira favor me corrija!

    Opa, na verdade *p aponta para o conteúdo do endereço que tem dentro de p, como ai foi um vetor ele aponta para o endereço do primeiro elemento do vetor. Se você fizer (*v)+1 ele vai pegar o primeiro elemento e somar 1 e não andar uma posição. Ai deu certo porque 1+1 da 2 xD. Exemplo:

    #include <stdio.h>
    
    int main(){
    
      int v[] = {10,20,30};
      int *p = v;
    
      printf("Segunda posicao do vetor: %d\n", (*p)+2);
    
      return 0;
    
    }

     

    user@user:/home# ./test
    Segunda posicao do vetor: 12
    

     

    Mas o caminho pra achar a resposta é esse mesmo: arrays. Vou esperar mais um tempo antes de postar a resposta.

     

    Abraço!

  6. Bom dia!

     

    Não. Se você fizesse, por exemplo, int a você estaria apenas declarando uma variável do tipo inteiro chamada a. Um vetor pode ser declarado de várias formas, vou mostrar aqui as três mais comuns:

    #include <stdio.h>
    
    int main(){
    
      int v[5];
      int a[] = {1,2,3,4,5};
      int i;
    
      for(i=0;i<5;i++){
        printf("Digite um numero para o vetor: ");
        scanf("%d", &v[i]);
      }
    
      for(i=0;i<5;i++){
        printf("Seu vetor v possui na posicao %d: %d\n", i, v[i]);
        printf("Seu vetor a possui na posicao %d: %d\n", i, a[i]);
      }
    
      return 0;
    }

    Aqui declarei 2 vetores, o primeiro possui um tamanho, mas não foi inicializado e o segundo não possui um tamanho, mas o compilador verifica através dos elementos que foram inseridos nele. Quanto a imprimir o vetor podemos fazer igual você fez, com um for :). O que é importante notar aqui é que um vetor não inicializado pode conter lixo, tendo em vista que não sabemos o que tem naqueles 5 espaços que declaramos para o nosso vetor. Segue um exemplo sem inicializar o vetor v:

    Seu vetor v possui na posicao 0: -1354054000
    Seu vetor v possui na posicao 1: 21979
    Seu vetor v possui na posicao 2: -1354054336
    Seu vetor v possui na posicao 3: 21979
    Seu vetor v possui na posicao 4: -1204222352

    Viu o quanto de lixo de memória tinha nele antes de o preenchermos? Legal né? kkkkkk Podemos também dizer o tamanho e inicializar!!

     

    A outra forma (e foi a que seu exercício pedia) era alocando memória dinâmicamente, ou seja, em tempo de execução conforme a necessidade e para isso declaramos um ponteiro e ele recebe malloc, que por sua vez devolve um ponteiro do tipo void * para o nossa variável do tipo ponteiro:

     

    "The  malloc()  and calloc() functions return a pointer to the allocated memory, which is suitably aligned for any  built-in  type"

     

    Com isso podemos alocar espaços de memória de acordo com algum acontecimento ou com o input do usuário. Tudo que estou falando aqui é por cima, tenta entender por baixo dos panos que você vai longe :ph34r:. Acho que é isso, qualquer coisa manda ai pra gente!

     

    Abraço!

  7. Boa noite!

    Vou postar um código rodando aqui e apontar algumas coisas, pode ser?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a, b, *alocar, *alocarb, i;
        printf("Digite o primeiro numero que corresponde ao tamanho do vetor A: ");
        scanf("%d", &a);
        printf("Digite o primeiro numero que corresponde ao tamanho do vetor B: ");
        scanf("%d", &b);
    
        alocar = malloc(sizeof(int)*a);
        alocarb = malloc(sizeof(int)*b);
        for(i=0; i<a; i++)
            {
                printf("Digite o valor do vetor A: ");
                scanf("%d", (alocar+i));
            }
        for(i=0; i<b; i++)
            {
                printf("Digite o valor do vetor B: ");
                scanf("%d", (alocarb+i));
            }
    
        free(alocar);
        free(alocarb);
    }

    Então...

    •  No seu código você declarou tanto ponteiros quanto vetores, sendo que no ex só pedia pra você usar ponteiros de forma dinâmica (o que é um problema pois você alocou memória e não a utilizou, praticamente deixou dois ponteiros apontando pra nada)
    • Você criou 2 vetores com tamanho a e b sendo que estas variáveis não tinham valor nenhum, ou seja, os vetores não tinham sido inicializados e não estavam com tamanho definido (o que é um problema).
    • A função printf já pula a linha por si só, não precisa do \n no fim.
    •  Quando você for dar malloc não precisa do casting como em (int *)malloc, pois seu retorno é um ponteiro do tipo (void *), mas tudo bem usar casting... A questão aqui é que foi usado malloc(sizeof(a)) sendo que a é uma variável do tipo INT, ou seja, seu tamanho é de 4 bytes. Para ver o tamanho determinado anteriormente do vetor devemos usar malloc(sizeof(int)*a). Por que? Porque estamos alocando a endereços de inteiros que serão retornados para alocar.
    • Nos looping não precisa criar duas variáveis, se você zera uma só em loopings diferentes a cada novo for o valor será 0 novamente, independente do valor que tinha no for anterior
    • O jeito que você fez no for está ok: &vet, a única coisa é que como estes vetores são desnecessários bastaria você trocar por alocar e alocarb
    • O jeito que trabalhei com os ponteiros no scanf indica que estou olhando para o endereço que ponteiro aponta e andando conforme i incrementa (ou seja, de 4 em 4 bytes, tendo em vista que meu ponteiro é de int e int vale 4 bytes no seu pc)
    •  Sempre que alocar memória dinâmicamente com malloc use um free no ponteiro após terminar de usar. Isto "desaloca" a memória utilizada e diz ao sistema operacional que aquele espaço de memória pode ser usado futuramente.    

     

    Da uma lida sobre tudo isso que falei mano, acho que vai ti ajudar bastante. Indico o curso de C feito pelo Papo Binário, ele mostra tudo isso que falei e mais ainda. Não fique chateado, C é do demônio (mas é lindo) kkkkkk

     

    Abraço!!

  8. Boa tarde galera,

     

    um tempo atrás fiquei com uma dúvida e tanto sobre ponteiros, principalmente com um uso em específico. Tendo isso em mente decidi jogar aqui pra vocês testarem e pensarem, acho que vai ser legal pra geral aprender. P.S Não usem o google, testem ;)

     

    - Qual a diferença entre (*p) e *p?

     

    Só será validada a resposta daquele que mostrar o código e o pq, sem compromisso galera, apenas pra descontrair :)

     

    Abraços!

  9. 1 minuto atrás, luispadilha disse:

    Eu ainda não sei. Muito proovável que uma parte delas seja open source sim. O sistemas de segurança pretendo desenvolver so dois lados, uma parte open source e um lado comercial.

    Saquei. Perguntei pq tive curiosidade de ver como você faria e quem sabe a galera não colaborasse =)

  10. 1 hora atrás, Marciano Calvi Ferri disse:

    Fala Leandro,

    Por acaso vc fez uma cópia do site numaboa.com.br? Lá no discord, se eu não entendi errado, alguém tinha copiado, mas não sei quem foi.

    Abraço, T+.

    Fala mano,

    então, não fiz não (na real eu imprimi alguns artigos dela na época que estava lendo). Quem fez foi o @Gribel xD

    Abraço!

  11. Bom dia!

    Achei todas as ideias muito legais cara, principalmente o "sistema seguro" e "forense em nuvem", até porque hoje em dia o mundo inteiro está em cloud kkk. Estas ideias seriam open source?

    Sobre a outra pergunta... não sou analista de malware, mas o que acredito ser o maior problema é a falta de base sólida. Muita gente acha que fazer análise de malware é simplesmente usar um debugger etc, quando na verdade é preciso um conhecimento sólido em Sistemas Operaionais, programação, redes e por ai vai.

    Abraços!!

  12. 16 horas atrás, gzn disse:

    Sr. @Leandro Fróes obrigado pelo comentário. Eu estava meio que brincando quando falei em arrancar a placa de rede hehe (veja os kkkk lá). Mas falando serio, eu estudaria o malware em um PC só para isso e criaria uma rede isolada (tipo virtual) quando o malware não tem documentação ou não foi estudado mais a fundo pela comunidade. Só deixaria ele comunicar com a rede mundial se eu souber por outros especialistas (pois eu não sou) que ele é inofensivo, mas por quê?

    Porque podem haver casos em que isolar um malware seja o melhor? Bom, no meu caso em específico eu já sei que não sei de nada (sou uma materialização desse resumo sobre a opinião de Sócrates sobre o conhecimento e os sábios).

    Eu imagino o seguinte @Leandro Fróes, pensa num malware desconhecido (não estudado pela comunidade), um "especialista em segurança" vai e coloca ele numa máquina e executa ele para fins de estudo, belezaaaaa! O malware tem um código de mutação muito complexo mas graça aos esforços do "especialista" ele resolve se propagar pela rede. Esse malware entra em hospitais públicos e muda dados de prontuários e outras coisas para prejudicar, roubar e criptografar os dados afim de exigir dinheiro em troca da liberação deles. O IP parte da casa do "especialista", e aí? E aí?! Será que ele teria como explicar para PF e assumir a responsabilidade das consequências de ter "manipulado" o malware e isso ter acontecido? hmmm, ele vai se borrar todo e vai dizer: "Ahhh! Mas eu só estava estudando ele, não sou quem fez e eu não queria fazer nada com ele. Só estudo...". Como esse programa é de autoria desconhecida quem na justiça vai cair como um dos primeiros suspeitos? Oras, não tem como provar que é o "especialista", certo, mas não tem como provar que é outro! Não até as investigações terminarem!

    Agora, para esses malwares que a comunidade faz artigos tudo e mais (os mais conhecidos), eu não vejo tanto problema em criar uma VM na sua máquina de uso do dia a dia. Claro, desde que o "especialista" saiba o que está fazendo e tem a mínima noção de como o malware funciona. Mas o ideal é não lidar com worms se o "especialista" pretende dar livre acesso a rede, porque mesmo assim a pessoa pode se encrencar com a justiça e prejudicar outros (independente da nossa intenção o que importa para a justiça são os fatos).

    Acho que você quer dizer, resumindo, que todos os meios de comunicação com a máquina infectada podem ter consequências negativas, não é? Sim, isso é verdade.

    Eu tipo assim, vamos dizer que eu luto kung fu muito mal (vamos pegar analogia com Neo do Matrix e seu kung fu. Ele é um super hacker que owna até a "realidade" kkk). Bom, se eu sei lutar muito mal, por que eu pegaria um lutador que está muito acima do meu conhecimento/habilidades?

    Quando eu disse "todo cuidado é pouco" é uma maneira de dizer para os novatos (eu sou um deles!) terem cuidado. A paranoia de cada um é de cada um, varia conforme as experiências da vida. Veja o Edward Snowden, será que ele é paranoico ou age apropriadamente conforme as circunstâncias? Cada um pode ter uma opinião diferente, uns podem dizer: ah, todo governo já sabe de tudo, não vou botar senha em nada e não vou nem trancar a porta de casa. Já outro pode dizer, vou fazer isso, isso e mais aquilo. No fim todos podem se ferrar independente das suas habilidades ou precauções. Se for como eu a sua confiança vai contar única e exclusivamente com Deus.

    Desculpe, acho que escrevi demais. :D

    Não entendi porque você falou todas essas situações pra dizer simplesmente que estava brincando hehe. Outra coisa também, se o cara SABE que o malware é desconhecido (um ransomware no caso ai) o mínimo é cortar o acesso com a internet completamente (qualquer ambiente virtual permite isso com sei lá, 3/4 clicks). Se ele não o fez ou mesmo assim foi comprometido, o descuidado foi ele e talvez não esteja preparado pra lidar com tal nível, não? Se for pra contar situações assim eu posso falar que um malware explora um módulo de kernel do linux eai? Se o cara não souber lidar ele senta e chora.

    Enfim, espero que não tenha ficado nenhum mal entendido até porque ninguém aqui sabe nada ^_^

    abs

  13. 45 minutos atrás, gzn disse:

    Acho que exagerei ao dizer que os bugs como meltdown, spectre, etc. poderiam ter a possibilidade de acessar a memória do host. Parece não haver nenhum modo de sair do isolamento de memória do guest (não até o momento!) e ir para o host.

    Mas... mesmo assim se eu fosse analista e profissional nessa área eu teria um PCzinho isolado em uma sala só para análise de malware (e arrancaria a placa de rede desse pczinho kkkk). Acho que não é ideal fazer análise de malware em VM sendo executadas em um host que você acessa sites de banco, etc. Se a Intel que tem ótimos profissionais foi pega de surpresa com essa falha grotesca (digo, não só ela como outras fabricantes), imagina noix. :D

    Lembre-se: todo cuidado é pouco.

    Na sua linha de pensamento praticamente não há como fazer uma análise, concorda? Em um pc sem placa não há nem como ter um malware para analisar (se você falar que pega de um pendrive etc já estará abrindo um vetor de ataque fácil fácil). Acho que no geral todo cuidado é sim pouco, mas não há como fugir, saca?

  14. Fala galera, tudo bem?

     

    Queria trazer aqui pra vocês uma questão um tanto polêmica, mas muito recorrente em meu pensamento e no que acabo vendo no mercado de segurança no geral. Vejo MUITA, mas MUITA gente que coloca títulos a frente de qualquer tipo de conhecimento de fato, como já ouvi de alguns amigos da área: "Análise de Malware virou o novo marketing". De fato... Como se faz uma análise, por exemplo, sem ter base alguma de S.O, programação e redes? Ou como se tem a habilidade de "proteger uma aplicação web" sem conhecer o httpd ou como se constrói uma aplicação web? Como tem tanta gente falando que sabe isso e faz aquilo, mas eu não vi nada publicado, nada feito, apenas palavras soltas e pior, as pessoas acreditam...

     

    Eu acho muito estranho as pessoas terem orgulho de falar o que não sabem porque se você fizer uma pergunta se quer sobre o assunto a pessoa buga, da tela azul. Resumindo, se até o maior sábio dizia "Só sei que nada sei", como pode alguém dizer que SABE algo assim tão fácil, não?!

     

    Queria deixar claro que esta é apenas minha opinião e estou totalmente aberto para conversar sobre, acho muito saudável ver pontos de vista diferentes sobre o assunto. Sei que é um ponto de vista meio tenso, mas eu queria saber de coração a opinião de vocês sobre isso, sem preconceito!!! ^_^

     

    Obrigado!

    • Curtir 1
  15. 4 horas atrás, gzn disse:

    @Leandro Fróes que tal o Sr. transferir esse(s) artigo(s) para o wikilivros? O Mercês começou a produzir um livro sobre ER lá e a plataforma é ideal para colaboração. Acho que se você colocar lá vai motivar mais o Mercês e outros camaradas a trabalhar colaborativamente (o que pode ser benéfico a outros e prazeroso para o nosso meio de aprendizagem em ER). 

    Bacana a ideia, vou falar com ele sim, obrigado!! ^_^

     

    3 horas atrás, gzn disse:

    Curiosidade @Leandro Fróes, eu to começando ER e não entendo muito os termos usados nessa área, mas existe mesmo "tripa de bytes"? Eu pesquisei no Google e achei pouquíssimos resultados com essa expressão. Aproximadamente 11 resultados (excluindo repetições). Será que esse termo não veio de "tuple of bytes"? Em python por exemplo tupla é uma sequencia de objetos imutáveis.

    
    $$('._Rm').forEach(function(i){console.log(i.firstChild)});
    VM2067:1 "www.numaboa.com.br › Informática › Oráculo de Referências › Formatos Padrão"
    VM2067:1 "www.numaboa.net.br/informatica/oraculo/230-formatos/1096-formato-pe"
    VM2067:1 "https://acrecom.files.wordpress.com/2013/06/engenharia-reversa.doc"
    VM2067:1 "https://www.passeidireto.com/arquivo/1914647/engenharia-reversa/2"
    VM2067:1 "https://www.mentebinaria.com.br/forums/topic/97-formato-pe/?do=embed"
    VM2067:1 "www.forum-invaders.com.br › Fórum › ¤ Segurança da Informação ¤ › Segurança"
    VM2067:1 "caloni.com.br/como-ofuscar-strings/"
    VM2067:1 "www.ebah.com.br/content/ABAAAf2CEAJ/50-apostilas-hacker-engenharia-reversa"
    VM2067:1 "forum.guiadohacker.com.br › ... › Área Hacker › Matérias/Tutoriais/Dicas"
    VM2067:1 "www.desenvolvedoresdaruma.com.br/sddn/ddn/ddn005_61.html"
    VM2067:1 "https://docgo.net/embed/o-formato-pe"

    Só esses sites acima ai.

    Então... até onde eu sei isso não é de fato um "termo de RE" e sim um simples termo para dizer "cadeia de bytes" ou "sequência de bytes". Não se prenda nos termos, se você pegou a ideia já está ótimo.
     
    Abraços
     
     
     

     

  16. 2 horas atrás, bornman disse:

    Bom dia.

    Então, eu já olhei as duas grades, a que me agradou mais foi ciência da computação, porém não sei como é o curso, meu objetivo principal é aprender mais sobre essa área, porém não sei se o curso é do jeito que eu penso. Acho que vou acabar escolhendo automação mesmo.

    Entendi... o que você curte no geral? Na MINHA opinião a faculdade nunca da o suficiente saca, até porque é impossível (e isso independe do curso).

     

    Tendo isso em mente os dois únicos filtros que você pode aplicar é ver se a grade agrada e/ou perguntar pra pessoas que fazem Ciência o que elas acham, como é o dia a dia etc, mas tenha em mente que estudar por fora sempre será necessário.

  17. Bom dia mano!

     

    Assim, acho que muito mais valiosa do que nossa opinião é onde você pretende chegar fazendo uma ou outra. Que tal abrir 2 abas no navegador, com as duas grades e ver a que ti agrada mais? Até porque não sei bem o que você curte etc. A distância acaba sendo quase irrelevante pois fazer uma faculdade com matérias que não ti agradam se torna mais cansativa que uma mais distante, porém com matérias mais agradáveis xD

     

    abs

    • Curtir 1
  18. Boa noite!!

    Hoje estava lendo um dos artigos da coluna "Fundamentos da Computação Ofensiva" na revista da h2hc e me deparei com um trecho de código bem bacana, ele é bem simples e explica bastante coisa. Minha intenção aqui não é explicar ordenação de bytes, acho que o artigo explicou muito bem isso, vou apenas falar de uma única linha de código (de acordo com o meu entendimento) e como ela pode ser útil.

    O código é esse aqui:

    #include <stdio.h>
    
    int main(){
    
      int x = 1;
    
      if(*(char *)&x == 1)
        printf("Little Endian!!\n");
      else
        printf("Big endian!!");
    
      return 0;
    }
    
    user@test:/home/codes# ./teste
    Little Endian!!

     

    A ideia é testar o endianness (ordenação) dos bytes. O que está rolando no código acima? Assumindo um inteiro de 32 bits atribuimos o valor 1 à ele. Dentro do condicional IF acontece a seguinte mágica: converte o endereço de x (que é de um inteiro) para o endereço de um char  e o operador * que precede o casting (char*) diz que estamos apontando para o conteúdo daquele endereço e SE o valor que estamos apontando for 1, é Little Endian. Pera, que? Blz, para entender a linguagem decidi fazer um código bem newbie pra mostrar números e ver o que está acontecendo no código acima:

     

    #include <stdio.h>
    
    int main(){
    
      int x = 1;
      printf("Valor de x: %d\n", x);
    
      int y = *(char *)&x;
      printf("Valor de y: %d\n", y);
    
      char *p = (char *)&x;
      printf("Valor apontado por p: %d\n", *p);
    
    
      return 0;
    }

     

    user@test:/home/codes# ./teste
    Valor de x: 1
    Valor de y: 1
    Valor apontado por p: 1

    O que podemos notar aqui (assumindo de fato que é little endian) é que na declaração do ponteiro para char p que toda essa mágica é meramente um casting no endereço da variável. Note que em y fiz toda a linha do código e o valor deu realmente 1, mas em p tirei o primeiro * e mantive apenas o casting de fato, com isso imprimi o valor apontado pelo ponteiro p que recebeu o endereço com o casting e deu 1 também!!

    Ok, mas até agora não entendi o endianness. A sacada é que se for Little Endian os bits no endereço de x estariam dessa forma: 00000000 00000000 00000000 00000001, com o casting do endereço para um tipo char nós limitamos o teste para apenas a célula da direta e SE esta célula de oito bits possuir o valor 1 (que é o caso) será little endian, pois neste os bytes menos significativos são codificados primeiro. Caso neste teste o valor seja diferente de 1 (no caso zero) é porque é Big Endian pois neste os bytes mais significativos (da esquerda) são codificados primeiro.

    Esse assunto deve ser bem simples pra maioria de vocês, mas eu curto ler sobre coisas simples e ver o quão essenciais são, espero não ter sido confuso e me corrijam qualquer besteira que escrevi. Caso tenha uma visão diferente por favor, me dê um toque, gostaria de saber mais sobre.

    Abs!!

×
×
  • Create New...