Ir para conteúdo

Todas Atividades

Atualizada automaticamente     

  1. Recentemente
  2. Ontem
  3. Papo Binário #21 - Robótica

    Papo sobre robótica com Natan Steinberg pra abrir, antes tarde do que nunca, a terceira temporada de entrevistas do Papo Binário. :-) Nesse papo o Natan explica o que é a robótica, por que o tema está em alta e nos mostra um pouco de seus projetos no Instituto de Tecnologia ORT (www.ort.org.br). Não perde!
  4. Engenharia reversa de uma black box

    Não estou com ele agora... Assim que puder jogo a output aqui
  5. Engenharia reversa de uma black box

    Ela lista no lsusb como?
  6. Engenharia reversa de uma black box

    Fala pessoal! Me apresentaram o desafio de fazer engenharia reversa em uma black box mas não sei muito bem como começar... De interfaces, ela conta com uma microUSB que é utilizada pela SDK para embarcar código. Mas quando conecto ela no linux o dispositivo não é nem detectado =(. Além disso, ela tem mecanismo de Tamper, o que torna dificíl abrí-la. Meu objetivo seria conseguir uma shell. Teriam alguma dica de como proceder?
  7. Criando meu CTF com CTFd

    Conhecendo o CTFd O CTFd é uma plataforma para criar de forma fácil o seu próprio Capture The Flag no estilo jeopardy , com a possibilidade de criar e inserir diversos plugins e temas acredito que seja a melhor plataforma para quem está começando e deseja criar o seu próprio CTF. Site Oficial Podemos ver também um demo que o pessoal disponibiliza. Demo CTFd Além disso eles disponibilizam a plataforma por 50 dólares por mês em uma cloud para você. **Mais temos o código fonte dela no github.** Obtendo o CTFd Podemos encontrar o CTFd no repositório oficial no Github Repositório CTFd O projeto está em desenvolvimento , mais ainda tem alguns bugs como , exportar os desafios e os jogadores. Assim como todo projeto em desenvolvimento temos alguns bugs , podemos resolver ajudando no desenvolvimento do projeto. Documentação do CTFd Assim como todo projeto de qualidade achamos uma documentação para nos auxiliar , podemos ver em [Documentação CTFd](https://github.com/CTFd/CTFd/wiki). Instalando o CTFd Podemos criar o nosso CTF em uma simples VM rodando no Virtualbox , Vagrant e até o Docker. Idependente de onde vamos rodar precisamos baixar o CTFd , eu recomendo usar o GIT. Com ele já instalado podemos dar um **git clone**. git clone https://github.com/CTFd/CTFd Ou podemos baixar ele em https://github.com/CTFd/CTFd/archive/master.zip Instalação simples Nesse primeiro caso é uma instalação simples , visando apenas conhecer o projeto e jogando com os brothers já que dessa forma conseguimos ter um numero pequeno de jogadores pois usa o próprio servidor do Flask. Vamos apenas executar o arquivo **prepare.sh** com poderes de administrador. Com isso já temos nossa plataforma rodando sem problemas. Basta executar o arquivo serve.py. python serve.py Instalação completa Já na segunda vamos usar o gunicorn e o nginx como proxy reverso já que é o que eles recomendam para jogar com grande numero de pessoas. A documentação pede para que seja rodado o arquivo prepare.sh , o arquivo de instalação nada mais é que o pedido para instalar. apt-get install build-essential python-dev python-pip libffi-dev E os requisitos requeriments.txt. pip install -r requirements.txt Esses requisitos vão ser instalados automaticamente , mais caso queira saber o que é podemos ver esse arquivo que é uma pequena lista de bibliotecas e versões para que o CTFd funcione sem problemas. Atualmente é Flask==0.12.2 Flask-SQLAlchemy==2.2 Flask-Session==0.3.1 Flask-Caching==1.2.0 Flask-Migrate==2.0.4 SQLAlchemy==1.1.11 SQLAlchemy-Utils==0.32.14 passlib==1.7.1 bcrypt==3.1.3 six==1.10.0 itsdangerous==0.24 requests==2.18.1 PyMySQL==0.7.11 gunicorn==19.7.0 dataset==0.8.0 mistune==0.7.4 netaddr==0.7.19 Com isso já temos nossa plataforma rodando sem problemas. Basta executar o arquivo serve.py . python serve.py Caso instalou para rodar usando o **python3** faça. python3 serve.py Executando o gunicorn Mais a ideia é executar essa plataforma usando o gunicorn , na própria documentação ele explica como podemos fazer isso. Com ele já instalado vamos executar iniciar ele na porta **8000** , mais podemos iniciar em qualquer porta , nesse caso ele não precisa de permissão de um administrador para ser executado. gunicorn --bind 0.0.0.0:8000 -w 4 "CTFd:create_app()" Configurando Proxy Nginx Para instalar o **Nginx** é bem simples. apt-get install nginx Vamos agora configurar ele para que ele sirva de **proxy reverso** a nossa aplicação que vai estar rodando na porta **8000**. Vamos criar o arquivo chamado ctf.conf. /etc/nginx/sites-available/ctf.conf O conteúdo do arquivo é server { listen 80; server_name localhost; access_log /var/log/nginx/proxy-ctf.log; location / { proxy_pass http://127.0.0.1:8000; } } Vamos apagar o arquivo padrão. rm /etc/nginx/sites-enabled/default Agora vamos criar um link no Linux usando o comando ln para lincar a pasta sites-available para a sites-enabled. ln -s /etc/nginx/sites-available/ctf.conf /etc/nginx/sites-enabled/ctf.conf Agora basta reiniciar o **Nginx** e pronto. service nginx restart Pronto para jogar Toda a instalação que eu acabei de explicar eu fiz e está online no meu blog em http://lab.greenmind.top/ Espero ter ajudado nesse tutorial , e qualquer duvida por favor entrem em contato. Pontos importantes - Esse projeto ainda está em desenvolvimento. - Esse é apenas a primeira versão desse tutorial - Esse é o primeiro POST do meu blog e toda critica é muito bem vinda. - Tema é muito simples modificar e criar. Referências GreenMind ABase - https://greenmind.top/abase/Infraestrutura/Games/CTFd/ CTFd Wiki - https://github.com/CTFd/CTFd/wiki CTFd Github - https://github.com/CTFd/CTFd/ Site CTFd - https://ctfd.io
  8. Última semana
  9. Tudo na paz Wesley? Cara essa plataforma é muito bacana , estou começando a brincar nela também , para quem está começando também tem uma trilha para estudar. Alias da para montar grupos no ShellterLabs para juntar o pessoal. Obs:Eles falam que ajudam a montar um CTF mais estou esperando os caras me responderem a um bom tempo , mais estou montando um para um FabLab aqui da minha cidade usando o CTFd.
  10. Lab owasp bwa-WAF

    Olá, pessoal! Há também o DVWA - http://www.dvwa.co.uk/ , que fornece exemplos em PHP com níveis de segurança que vão de Low até Impossible. Você pode ver aonde o código está vulnerável e o conserto do mesmo. Quanto ao WAF, recomendo setar uma rede virtual com 1 máquina executando a plataforma vulnerável e outra máquina fazendo HTTP Proxy com o WAF embutido. É geralmente assim que vemos nas empresas. Ai você vai manuseando as regras/assinaturas do WAF e tentando gerar os bypass. Um exemplo seria ter o mod_security instalado num apache com mod_proxy 'protegendo' o seu servidor vulnerável. Ferramentas para testar bypass de WAF tem várias, tais como o sqlmap mesmo. Para detectar um WAF há o W00f waf - https://github.com/EnableSecurity/wafw00f A grande maioria dos WAFs trabalha usando o conceito de assinaturas, até porque os outros modos costumam gerar muito falso positivo e/ou overhead. Então, é possível bypassar por procurar enviar dados que não geram pattern match ou estudar a regex(expressão regular) para ver se ela apresenta algum problema passível de gerar o bypass. Encontramos vários desses bypass no mod_security, abaixo alguns que o dmr encontrou: https://github.com/SpiderLabs/owasp-modsecurity-crs/issues/116 Abaixo repasso outro exemplo de bypass em um Sophos rodando mod_security: http://seclists.org/fulldisclosure/2015/May/121 Nesse caso, o Sophos não analisava o payload caso o content-type fosse JSON. Descobrimos isso em um pentest real e depois fizemos uma análise e na época um workaround, pois a Sophos não teve competência pra resolver isso. Outros ataques que fizemos(Netscaler, Astaro, etc) foi enviando payloads mais complexos em ataques de SQL Injection. Também há problemas de internacionalização, onde você tem, por exemplo, a aplicação recebendo SELÉCT (com acento),, removendo o acento e enviando para o banco (problemas de normalização). O WAF enxerga "SELÉCT" o banco recebe "SELECT". Enfim, WAFs bem configurados constituem um desafio, mas hackers determinados tendem a encontrar brechas. Meus 2 cents. Um cordial abraço a todos. NL. PS: Estou anexando 4 arquivos que demonstram algumas metodologias de exploração de WAF. São antigos, mas os conceitos são os mesmos e funcionais. itts_0110_pt.txt NL-Netscaler_9.2_Bypass_MS_Sqli_v01.pdf waf_bypass2.txt waf_bypass_regex.pdf
  11. Ponteiros em C

    Ponteiros em C Vou fazer um breve resumo do que eu aprendi até agora sobre ponteiros, lembrando que eu não fiz nenhuma formatação, e nem vou me aprofundar neste assunto, até mesmo porque tenho muito o que treinar ainda, se alguém quiser incrementar algo é só falar. 1->Todo ponteiro é um apontador para o endereço de memória de uma variável, função e etcs, e todo ponteiro tem o tamanho de um int, e ao apontar para um dado, tem um tamanho deste dado. Vale ressaltar que o tamanho pode variar de acordo o sistema operacional ou arquitetura. #include <stdio.h> int main(void) { char *ptr; printf("%d", sizeof(ptr)); //tamanho de um unsigned inteiro printf("%d", sizeof(*ptr)); //tamanho de um char, porque neste caso ptr está apontando para este tipo de dado } 2-Pode se dizer que todo array, faz referência a um ponteiro e vice versa. Internamente o compilador considera, que todo nome de um array é um ponteiro para o primeiro índice deste array, e seu tamanho é fixo e linear na memória, que é incremento em bytes de acordo com o seu tipo. #include <stdio.h> #include <string.h> int main(void) { char nome[] = {'t','e','s','t','e','\0'}; int i; for(i=0; i < strlen(nome); i++) printf("Letra: %c Endereço de memória: %x\n", nome[i], &nome[i]); // percorre todo o array e retorna o valor que está em cada posição, e o endereço de mem´´oria // note que só incementa de 1 byte na memória de forma linear } 3-Um ponteiro pode apontar diretamente para um array, sem precisar pegar o endereço de memória do mesmo, isso ocorre porque todo nome de um array é um ponteiro, e a primeira posição tem o mesmo endereço de memória do nome da variável, obs: Só tem o mesmo endereço de memória para arrays, e não para ponteiros. ¨#include <stdio.h> int main(void) { char *ptr; strcpy(ptr, "Ponteiro"); //copia o array de chars para ptr //Obviamente todo array começa no 1 indice, ou seja, para temos todos dados ou lista, como quiser chamar, é necessaria informar apenas o 1 indice printf("%x", &ptr); // Exibe o endereço de memória do ponteiro em hexadecimal printf("%x", &ptr[0]); //Exibe o endereço de memória para onde o ponteiro aponta em hexadecimal char string[] = "Isso é um array"; //Array de chars, o compilador já faz o trabalho de contar os caracteres, e colocar nullbyte no final printf("%x", &string); // Endereço de memória de string em hexadecimal printf("%x, &string[0]"); // Endereço de memória para onde string aponta, justamente o mesmo endereço do nome do array ptr = string; // não preciso usar o operador ¨&, porque o nome string é um ponteiro para &string[0]; /*ptr é um atalho para &ptr[0], quando usamos a função printf, ou demais funções, o compilador está na verdade lendo o endereço de memória da váriavel, isso ocorre quando a váriavel é um array*/ printf("%s", &ptr[0]); } 4-Operadores: *->Dereferência ¨&->Referência Atalho->*ptr == ptr[0] ambos são a mesma coisa O operador & comercial, retorna o endereço de memória de uma variável, ou até mesma uma função O operador * asterisco, retorna o conteúdo para onde o ponteiro está apontando #include <stdio.h> #include <stdlib.h> int main(void) { int *x = malloc(5*sizeof(int)); /*aloca 5 posições na memória de um int 4*5 = 20 bytes ocupado na memória, dividido em blocos de 4 byte na memória*/ int numero[5] = {1,2,3,4,5}; x = &numero[1]; // recebe o endereço de memória de numero[1] printf("%d", *x); /*Ponteiro incialmente sempre aponta para o começo de um dado // Porem podemos mudar isso fazendo com que avançe bye por byte neste caso 4 bytes*/ *x++; // incremento 1 na posição, internamente o ponteiro avança 4 byte, indo para o próximo elemento //numero[2] printf("%d", *x); // Exibe o número 3 } 5-Ao criamos um ponteiro, sempre é bom inicializa-lo, pois o ponteiro pode apontar para um endereço de memória inválida ou sem permissão de leitura, causando lixo de memória, e encerrando com o sinal SIGSEGV, para isso não ocorrer, podemos inicializamos com um valor, especificamente 0, que limpa, 0 em c não é nada #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int *ptr = 0; // Ponteiro aponta para 0, logo temos uma area de memória válida char *pointer = NULL; // Aponta para a constante null // As duas declarações fazem a mesma coisa, aponta para o nada char *ptr; memset(ptr, 0, sizeof(char)); /*Outra forma de limpar uma area de memória, é inicializarmos com 0, usando a funçao memset*/ } 6-A função memset preenche um endereço de memória com um valor, serve para inicializar uma variável, enfim. Então, alem de poder ser utilizado para limpar a área de memoria, pode ser usado também para preencher todo um array, ponteiro, ou estrutura com um valor veja o exemplo abaixo #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main() { char *ptr = malloc(10); strcpy(ptr, "aaaaaaaaab"); while(*ptr != 'b') { //percorre o loop até achar a letra b memset(ptr, 'x', 1); //preenche o endereço de memória do ptr, com x, com tamanho de um 1 byte printf("%c", *ptr); *ptr++; //incrementa 1 na posição de memória, ptr[0], ptr[1], e assim por diante } free(ptr); ptr = NULL; } 7-Podemos manipular o endereço de memória de várias formas, uma dessas é quando passamos um argumento do tipo ponteiro na função. Na verdade estamos pegando o seu endereço de memória, e passando para uma função genérica, e com isso mudamos o que tem dentro do endereço de memória, essa função dá se o nome de passagem por referência. Obs: Ao utilizar-se uma função que pede como argumento um ponteiro, não nos obriga a passar uma variável que não seja, pois o que importa realmente é o endereço de memória, lembre-se que, o nome do ponteiro sempre aponta para o próximo elemento e pega o seu endereço de memória, logo assim, simplesmente podemos passar uma variável que não é ponteiro apenas informando o seu endereço de memória com o operador ¨¨& #include <stdio.h> #include <stdlib.h> char *string(char *ptr) { *ptr = 'b'; //colocar o b no endereço de memória do ptr return ptr; // retorna um ptr } int main(void) { char caracter = 'a'; printf("%c", caracter); string(&c); //pega o endereço de memória de nome printf("%c", caracter); } 8-Utilizar-se ponteiros no código, pode garantir performance, e otimização com código genéricos, alocar memória dinamicamente, manipular endereços de memória, fazer callbacks, e um monte afim, além de ser mais visível achar erros. Segue um exemplo bem básico de ponteiro para função #include <stdio.h> #include <stdlib.h> int func(int a, int b) { return a + b; } int main(void) { int x = 5, y = 5; int (*ptr)(int x, int y); ptr = 0; printf("Ponteiro aponta para 0 : %p\n", ptr); ptr = string; printf("Ponteiro aponta para func: %p\nValor: %d", ptr, ptr(x,y)); } Bom, vou ficando por aqui, isso foi um resumo bem simples sobre ponteiros, fiquei na dúvida se postava ou não, porque sou bem noob em C, mas acredito que o fórum seja pra isso mesmo, compartilhar, independente do nível de conhecimento de cada um, espero que um dia eu fique bom nesse treco, haha. Agradecimentos ao Frederico e ao Mercês que me explicou sobre uso de ponteiros, lembrando, se tiver algum erro me avisem, ou se ficou ruim o texto desse jeito, seguido de código e mais código. Bye bye ao som de Vanessa Carlton - A thousand Miles
  12. IRC, RaidCall

    O que vocês acham de ter mais um meio de comunicação para a galera do fórum?através do irc, raidcall, etc, seria bom para conversar em tempo real
  13. Eu estou brincando com o crypt e acabei fazendo esse programinha que criptografa strings em arquivos de texto, foi feito em C e pode ajudar pessoas que tbm estao iniciando. https://github.com/T9xx/criptoC
  14. Bem-vindos ao portal de conteúdo Mente Binária

    Parabéns pela iniciativa, acredito eu, que o conteúdo do fórum vai ser de extrema importância para todos os membros, acompanho o site há muito tempo. Ah propósito, me chamo Wallas, porém uso vários nick, haha, curso engenharia mecatrônica, mas minha paixão é por segurança da informação, pretendo trabalhar algum dia nesta área.
  15. Solucionado Resposta http completa

    Já fiz isso Fernando, porém dá no mesmo, e se eu não colocar a função memset dentro do loop, ele vai ficar repetindo todo o código a cada iteração, por isso tenho que limpar o buffer, o problema é na função recv, porém não sei como solucionar.
  16. Solucionado Resposta http completa

    Essa linha tá zerando o buffer a cada iteração, e quando o loop acaba, o buffer tá zerado. Experimenta movê-la para fora (antes) antes do loop.
  17. livros - currículo

    Gostaria de perguntar para todos, dicas de livros, seja de estudantes ou pessoas já formadas, já vi no canal do youtube indicando para começar bem com uma base sólida, gostaria de receber dica de livros bons para toda parte da TI, tenho um foco em programação mas quero aprender bem LINUX , WIN, REDES, Banco de dados, algoritmos, coisas que ainda não sei que tenho que aprender, nos rankings aqui as melhores faculdades em computação é ITA/UNICAMP/USP , e ainda bons alunos desses cursos quando vão para fora do Brasil dizem que a gente estuda muito pouco aqui Brasil, o que seria nossa bibliográfica básica por matéria de 1 ou 2 livros por matéria, os americanos estudam mais de 4 livros por matéria e amplia a base de conhecimentos. Estou no primeiro semestre de Sistemas de Informação, tinha preferência para Ciências da computação / engenharia de computação / engenharia de software / mas é melhor terminar os estudos logo do que ficar esperando, não fui para analise de sistemas porque para validar o diploma fora do pais geralmente é necessário um curso de 4 anos, bacharelado, gostaria também de dicas sobre bons livros para ingles, estou tentando melhorar todo meu conhecimento, escrever melhor aprimorar meu português para aprender bem o ingles, reforçando minha base matemática física e química, estou estudando matemática pelo IEZZI tenho todos volumes, e ainda as coleções do PAIVA, DANTE,katia stocco, para matemática ; Sampaio E Calçada, kazuhito e fuke e Renato Brito para física, Alexandre oliveira e Ricardo Feltre pra química; apesar de não focar em biologia tenho sonia lopes e Amabis e Martho. pode me indicar todos os livros que voce acha importante para uma boa formação em TI, como se configura-se um currículo perfeito para o mercado no mesmo nivel do internacional. pode indicar livros em ingles e portugues, só diferencie os principais livros para o inicio dos estudos em todas as aeras, e mostre quais são livros de aprofundamento. obrigado!
  18. Bom gostaria de deixar minha contribuição e meu primeiro post. Venho por meio deste post humildemente para fazer a recomendação da plataforma Shellter labs, shellterlabs.com é uma plataforma web com intuito de disseminar conhecimento na área de SecInfo com foco em CTF's - Capture The Flags (https://ctf-br.org/sobre/), a plataforma te provê de pequenos treinamentos para que você tenha um norte de como funciona um "hacking do bem", dentro da plataforma é possível criar desafios, competições, ver ranking dos jogadores, interatividade comunicativa e muito mais. Eu como um entusiasta da área de segurança da informação e do movimento OpenSource estou bem feliz com o crescimento de adeptos ao 'conhecimentos livre'. Muito obrigado pela lida deste post, não quis aprofundar muito para não fazer um post cansativo. vlw
  19. Lab owasp bwa-WAF

    Um dos ambientes controlados já pronto e com interface intuitiva é o projeto bwapp, neste projeto você pode testar várias vulnerabilidades web e de servidor
  20. Solucionado Resposta http completa

    Eu conseguir solucionar o problema referente a resposta http, a solução foi copiar blocos de memória com o tamanho total a cada iteração, fazendo uma soma no buffer. A solução está na linha 99 a 101. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <regex.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/wait.h> #include <netinet/in.h> #include <arpa/inet.h> #include <fcntl.h> #include <sys/time.h> #define TAM 512 struct zone{ char *host; char *result; char *content; char *user; char *page; char *postr; }; int main(void) { struct sockaddr_in host; struct zone *s; s = (struct zone *) malloc(500*sizeof(struct zone)); memset(s, 0, sizeof(struct zone)); // inicializa todos os dados da estrutura com 0, deixando o buffer limpo int sock_create, conectar, total; s->host = "zone-h.org"; s->result = malloc(500*sizeof(char)); s->content = "Content-Type: application/x-www-form-urlencoded"; s->user = "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"; s->page = "/notify/single"; s->debugger = "defacer=Teste&domain1=http://testando.com.br&hackmode=18&reason=1: undefined"; sprintf(s->result, "POST %s HTTP/1.1\r\nHost: %s\r\n%s\r\nContent-length: 70\r\n\r\n%s", s->page, s->host, s->content, s->post); // uni todos os conteúdos das váriaveis para o buffer s->result if((sock_create = socket(AF_INET, SOCK_STREAM, 0)) < 0) { puts("Erro ao criar socket"); return 1; } //estrutura do socket do host host.sin_family = AF_INET; host.sin_port = htons(80); host.sin_addr.s_addr = inet_addr("72.20.18.5"); if(connect(sock_create, (struct sockaddr *)&host, sizeof(host)) < 0) { puts("Erro ao se conectar"); asm("xor %eax, %eax"); // zera os registradores asm("mov $0x1, %eax"); // move 0x1 exit para o registrador eax asm("mov $0x1, %ebx"); // move 0x1 para ebx como argumento da função asm("int $0x80"); // executa a syscall } if(send(sock_create, s->result, strlen(s->result), 0) < 0) { puts("Erro ao enviar mensagem"); return 1; // encerra o programa com erro } free(s); char *buffer = malloc(20000); char *body = malloc(20000*sizeof(char)); //váriavel não usada for(;;) { //loop infinto até a conexão ser encerrada e retornar 0 if((total = recv(sock_create, buffer, TAM, 0)) < 0) { puts("Erro ao receber body"); exit(1); } else if(total == 0) { break; } memset(&body[total_length], 0, TAM); memcpy(&body[total_length], buffer, total); total_length += total; } printf("%s", buffer); //free(buffer); //buffer = NULL; //aponta para a constante NULL evitando wild pointers }
  21. Fontes de Conhecimento

    Tem também o Tecnocast do Tecnoblog.
  22. Fontes de Conhecimento

    Conheci o podcast Hipsters Ponto Tec atualmente. Há também o canal ComputerPhile
  23. Fontes de Conhecimento

    Valeu pela dica @Cabral, esse eu não conhecia, aproveito esses podcasts gringos para treinar o ouvido a escutar conteúdo em inglês.
  24. Engenharia Reversa I

    Ficamos no aguardo, o bacana da versão online é que mais pessoas podem participar.
  25. Lab owasp bwa-WAF

    O hacking feito em ambiente controlado é bacana (fácil), mas quando se volta para a pratica real a coisa muda, e falando a real já montei um ambiente controlado passei pouco tempo, acho que é mais util para quem está tendo o primeiro contato com hacking ou quer dá aula, é uma boa.
  26. Fontes de Conhecimento

    Nessa linha dos podcasts, ouço sempre o Cyberwire. Eles produzem episódios diariamente e também possuem uma newsletter diária cheia de conteúdo muito bem escolhido com origem em outras fontes. Mais info em https://thecyberwire.com/
  27. Bem-vindos ao portal de conteúdo Mente Binária

    Parabéns, Fernando. Excelente projeto! Olá meu nome originalmente é Matheus Catarino tenho 22 anos e sou da Bahia, estudo sobre TI de forma voluntária (atualmente sem vínculo a qualquer Instituição de Ensino). Pois acredito que pessoal aqui no Mente Binária podem trazer uma boa proza relacionado ao assunto.
  28. Primeira Certificação

    Opa, @ferreirasc blz! Vou dar uma pesquisada e, com certeza, volto a incomodá-los novamente. Grato
  1. Mais Resultados
×