Ir para conteúdo

Fernando Mercês

Administradores
  • Postagens

    1.507
  • Registro em

  • Última visita

  • Dias Ganhos

    160

Tudo que Fernando Mercês postou

  1. Pra facilitar seus testes, você pode escrever um arquivo texto com todas as entradas para o programa e depois só redirecionar a entrada ao executar seu programa. Por exemplo, o arquivo anexo pode ser usado da seguinte maneira no Prompt de Comando (no Windows) ou no shell do Linux: No examplo do arquivo anexo, ele vai criar: Produto de código 1. Produto de código 2. Cliente de código 1. Cliente de código 2. Cliente de código 3. Cliente de código 4. Venda para o cliente de código 2 do produto de código 1 de 5 unidades a 2.50 cada. Venda para o cliente de código 1 do produto de código 4 de 3 unidades a 5.00 cada. Venda para o cliente de código 1 do produto de código 2 de 1 unidade a 3.00. Ou seja, é o mesmo que você digitar tudo isso, só que não precisar digitar toda hora. ? Valeu. entrada.txt
  2. Opa, tudo bem? Para nos ajudar, pode editar seu tópico e formatar a parte do código como código? É o botãozinho <> no editor. ? Eu achei a lógica meio complexa, mas te recomendo examinar o valor da variável soma na iteração do loop na função mais_vendido. Se você souber colocar breakpoint de depurar, ótimo. Se não, pode usar um: printf("%f\n", soma); Bom, acredito que o problema esteja na seguinte parte: if(soma>mais_vendido){ mais_vendido=produtos[b]; } Aí você está comparando soma (que tem o total faturado por todas as vendas de determinado produto) com o código do produto. Na real você precisa armazenar quanto um produto vendeu e comparar soma com esta nova variável. Boa sorte!
  3. Fernando Mercês

    retoolkit

    Montar uma máquina virtual para analisar malware no Windows pode ser bastante demorado devido à quantidade de ferramentas que precisamos baixar e configurar. Mesmo existindo soluções que as baixam automaticamente, a banda de internet necessária pode ser bem grande, já que algums programas possuem muitos gigabytes. Pensando em otimizar este tempo, criamos o retoolkit, um conjunto de ferramentas pré-configurado que você baixa uma vez e usa sempre, em quantas máquinas virtuais quiser. A lista de ferramentas é grande, por isso criamos uma wiki no respositório do projeto no Github falando sobre cada uma delas, inclusive com exemplos de uso. Além de acelerar o setup de uma VM nova, você pode utilizar o retoolkit simplesmente para conhecer mais sobre algumas ferramentas utilizadas na área. ?
  4. Fernando Mercês

    FileGrab

    Muitas vezes quando analisando processos suspeitos estes criam arquivos e podem apagá-los depois. Algumas famílias de ransomware chegavam a escrever a chave usada para encriptar os arquivos no disco e depois apagar com o recurso de shredding (substituindo os bytes com zero ou com bytes aleatórios) para evitar a recuperação. Da necessidade de recuperar estes arquivos que "tocam" o filesystem surgiu, em 2014, o FileGrab, um software para monitorar a criação de arquivos no Windows e copiar assim que este for "fechado" (ter todo o seu conteúdo escrito). Na monitoração, é possível especificar um padrão de arquivos específicos para monitorar, utilizando a expansão tradicional do Windows (como *.exe) ou expressões regulares: Os nomes de arquivos que casarem sofrerão uma ação, se especificada na aba Capture. Esta pode ser a cópia para uma outra pasta, drive de rede ou um servidor FTP: O FileGrab é particularmente útil em máquinas virtuais para análise de malware e sandboxes. O código-fonte, assim como binários para Windows estão disponíveis no repositório do Github.
  5. Opa, na verdade basta uma estrutura (struct) com as coordenadas cartesianas e um código que converta, que você já tem. ? Algo assim: struct coord { float x; float y; }; Aí você declara assim: struct coord c; Após declarar, você acessa os membros da uma struct com o operador . (ponto). Por exemplo, para colocar valores nos membros: c.x = 9.1; c.y = 3.4; Você vai precisar adaptar isso na sua chamada à scanf(). Depois de ter os valores preenchidos na sua struct declarada, é só converter, acessando da mesma maneira e imprimir os resultados. Se já souber usar ponteiros, pode fazer uma função que receba a struct e substitua os valores, ou que receba duas structs (uma com as coordenadas cartesianas e a outra vazia, para preencher as coodernadas polares). Mas se ainda não trabalhou com ponteiros, ou não é exigido pelo exercício, pode fazer na main() mesmo. Um abraço e boa sorte!
  6. O vx-underground notou que o site do Ministério da Defesa Russo, https://mil.ru, está devolvendo um código de erro HTTP 418 para quem tenta acessá-lo de fora da Rússia, como mostra captura de tela abaixo: Mensagem de erro ao tentar acessar o site em 24/02/2022 às 15h51 UTC-3 Esse código de retorno foi parte de uma piada de primeiro de abril implementada na RFC do HTTP em 1998. De acordo com a documentação, o código HTTP 418 significa “Eu sou um bule de chá”, brincando com o fato de não poder fazer café por tal motivo. A única razão pela qual um webserver emitiria esse erro é trollar quem tenta acessar. Historicamente, alguns administradores de servidores web configuram seus servidores para emitirem este erro quando o webserver detecta scripts automatizando acessos (crawlers). Se um site oficial do governo russo o faz, é justamente para trollar o mundo, pois é algo configurado manualmente. A piada vem em momento de muito mal gosto, já que ontem a Rússia invadiu a Ucrânia, atacando a capital Kiev com mísseis, o que deu início a uma guerra. Diversas personalidades no mundo da tecnologia já se pronunciaram a respeito da guerra iniciada pela Rússia. Um dos criadores da criptomoeda Ethereum, o russo-canadense Vitaly Dmitriyevich "Vitalik" Buterin, disse num tweet que "O Ethereum é neutro, mas eu não". "Muito triste com a decisão do Putin de abandonar a possibilidade de solução pacífica na disputa com a Ucrânia e partir para a guerra. Isso é um crime contra os cidadãos ucranianos e russos. Eu espero que todos fiquem seguros, embora eu saiba que não vai haver segurança. Glória à Ucrânia.", diz no seu segundo tweet.
  7. O que é o radare2? O framework radare2 é um conjunto de poderosas ferramentas para engenharia reversa totalmente open source e multiplataforma que conta com inúmeras funções desde de um poderoso disassembler, debugger, decompiler, emulação de código, uma interface para scripting e criação de plugins, assim como suporte para vários formatos de arquivos. O treinamento O curso abordará os conceitos iniciais e intermediários do framework radare2, desde de à mais superficial análise de arquivos até emulação e scripting usando r2pipe, além de ser feito à análise de alguns arquivos usando features de debugging e scripting para automação de atividades em RE. O instrutor @anderson_leite (Buzzer no Discord) é um profissional da segurança da informação, com grande ênfase e prática em desenvolvimento, engenharia reversa e análise de malwares, utiliza o radare2 e o Cutter no seu dia a dia como ferramenta de trabalho para analisar diversas ameaças que atingem sistemas macOS e Windows. Pré-requisitos VM com Ubuntu 20.04. Conhecimento básico de programação, especialmente Python e C. Ter feito o Programação Moderna em C e o CERO, nessa ordem. Familiaridade com arquitetura de computadores e engenharia reversa. Aulas publicadas Aula 0 - Instalação do r2 Aula 1 - Trabalhando com o rax2 e o rahash2 Aula 2 - Navegando e resolvendo um crackme Aula 3 - Referências de chamadas e modo visual (Parte 1) Aula 4 - Referências de chamadas e modo visual (Parte 2) Aula 5 - Scripting com r2pipe (Parte 1) Aula 6 - Scripting com r2pipe (Parte 2) Aula 7 - Debugging Aula 8 - Conhecendo o Cutter Aula 9 - Reconstruindo structs e navegando pelo binário Aula 10 - Debugando e reconhecendo ponteiros
  8. Opa, Vamos preicsar de mais que o enunciado. ? Dá uma lida ó: Valeu!
  9. O fato de você estar compilando com gcc no Windows pelo Git Bash faz com que várias coisas sejam adicionadas no binário final, por conta do MinGW (Minimalist GNU for Windows). Fica mais complicado aprender assim. Eu recomendaria usar nasm e ld somente, de preferência num Linux virtual, ou via WSL2. Outra opção é usar ferramentas nativas para Windows. Aí recomendaria o fasm. Mas o livro é muito bom mesmo, então segui-lo como o autor propõe é a melhor recomendação, creio. ? Abraço.
  10. Opa, quando a gente fala "binário" é em referência ao arquivo executável (ou biblioteca), mas não precisa dar a saída em sistema binário de numeração não. ? Na verdade a melhor saída pra ver isso é com um disassembler, então você pode ou anexar o arquivo aqui (hello.o) ou postar a saída do seguinte comando: $ objdump -d hello.o Valeu!
  11. É outro label sim, porque tem dois underscores. Mas não vejo onde ele está sendo definido. Talvez esteja vazio? Como fica no binário depois de assemblado? Abraço!
  12. Não acho que dê. Que eu saiba, o NASM não suporta a sintaxe da AT&T usada pelo GAS. Eu insistiria no seu exemplo anterior com o ld mesmo. ? Abraço.
  13. Ah, você pode tentar linkar com o ld também: ld -o assembly assembly.obj
  14. Olha, eu não tenho certeza, mas acho que o NASM requer símbolos globais começando com underscore. De qualquer forma, como você tá usando o gcc, acho que ele vai buscar a main. Então tenta aí: bits 64 global main main: mov eax, 777 ret Ou tenta com _main ao invés de main (altera nos dois lugares). Boa sorte!
  15. Oi Marvin, Acho que idade não tem grilo algum. Tá tudo certo. Sobre entrar para a área de segurança, acho que o caminho é por computação tradicional, senão fica muito inconsistente. Recomendo você buscar um curso de Ciência da Computação. É bem capaz que no terceiro ano você já consiga um emprego na área. Aí você continua os estudos e vai ter uma formação forte para uma carreira sólida. ? Vale também dar uma olhada no nosso Guia de Estudos e Profissões em https://menteb.in/guia também, para se guiar no que estudar no auto-estudo. Conta com a gente! Abraço!
  16. É sempre bom quando me deparo com um projeto de software livre criativo. E é a cara do Brasil ser o berço de softwares assim. Aqui no Mente Binária, além de trabalharmos muito pela formação tecnológica no Brasil, também mantemos vários projetos de software livre e para isso contamos não só com a comunidade, mas também com dois estagiários que começaram conosco ano passado. São dois estudantes de programação que, além de trabalharem nos nossos projetos, também desenvolvem seus próprios. E é justamente sobre um caso desse que venho falar hoje: o OPM (Oxidized Packager Manager) é um gerenciador de pacotes de pacotes DEB, então pode ser usado em sistemas como Ubuntu, Debian, Kali, etc. No entanto, o FallAngel, principal desenvolvedor, pretende estender este suporte a outros tipos de pacote, como o RPM. Os seguintes sub-comandos são suportados pelo OPM: clear – Limpa o cache do OPM help – Exibe a ajuda install – Instala um pacote remove – Remove um pacote search – Busca por um pacote update – Atualiza o cache do OPM O OPM gerencia as dependências, assim com o APT. O código, escrito em Rust, é super enxuto e o desenvolvedor não vê a hora de receber contribuições. Se você conhece da linguagem ou está a fim de aprender, ou mesmo tem só a curiosidade de saber como um gerenciador de pacotes funciona, tá aí sua oportunidade, isso porque o desenvolvedor é brasileiro e acessível. Downloads, código e mais informações podem ser obtidas no repositório do OPM no Github. Velocidade Se tem uma coisa que chama atenção no OPM é a velocidade. Uma busca em todos os pacotes disponíveis dura menos que um segundo! Olha só: # export PKG_FMT=deb $ time sudo target/release/opm search ht | grep -i editor ht - Viewer/editor/analyser (mostly) for executables real 0m0.067s user 0m0.051s sys 0m0.015s Olha a velocidade de instalar o tmux... 0 segundos! $ sudo ./target/release/opm install tmux Installing tmux for debian ... Looking up for dependencies ... Done Installing 2 NEW package libevent-core-2.1-7 tmux After this operation, 561.26KiB of additional disk space will be used. Do you want to continue? [Y/n] y Done Installing libevent-core-2.1-7 ... Done Installing tmux ... Running pre-install script ...Done Running post-install script ...Done Installed tmux in 0 seconds Compatibilidade O OPM é genérico e foi feito principalmente para permitir a instalação de pacotes personalizados. No entanto, com a variável de ambiente PKG_FMT=deb, ele passa a utillizar os repositórios do APT. Inifinitas possibilidades Imagine um sistema embarcado onde manter a infraestrutura de um DPKG, RPM ou APT seja muito custosa (espaço, performance, etc)... O OPM parece ser ideal. ? Ou ao desenvolver seu próprio Linux, por que não ir de OPM? Comunidade Falando em ser acessível, junto com outros membros do servidor do Mente Binária no Discord (e possivelmente outros), o desenvolvedor do OPM e outros amigos criaram a comunidade CoffeCode no Discord, pública para quem quiser trocar ideia sobre programação e aprender. Não por coincidência, Rust tá no topo dos canais, mas também há canais para C/C++, Python, Assembly, Java e Golang. ?
  17. Opa, a gente tem bastante coisa sobre Assembly aqui mesmo: https://www.mentebinaria.com.br/search/?q=assembly&quick=1&type=downloads_file A maioria dos autores usa a sintaxe Intel, mas pode ter algumas comparações lá. Dá uma olhada. ? Valeu!
  18. kkkkk então tudo que eu falei você aplica na origem. E o registrador EAX é o destino, no caso. ? é nóis!
  19. Opa, a instrução não tá completa aí.. falta o segundo argumento do MOV, mas é o seguinte: A sintaxe Intel, que é essa que você usou o exemplo, funciona assim: instrução argumento1, argumento2, argumento3... No caso do MOV, que é uma instrução de cópia de dados e por isso possui dois argumentos, o destino vem primeiro e a origem depois. Então é: mov destino, origem Então no seu exemplo: mov dword ptr ds:[eax + 0x30] Ou seja, você colocou só o destino, por isso a instrução tá incompleta, mas tudo bem, talvez sua dúvida seja no destino mesmo. Esse destino aí diz o seguinte: Copie uma DWORD (palavra dupla, ou seja, 32-bits/4 bytes) para o endereço apontado pelo registrador EAX, mas some 0x30 (48 em decimal) a este endereço antes. Ou seja, suponha que tenhamos o valor 0x950000 no registrador EAX e a instrução completa seja: mov dword ptr ds:[eax + 0x30], 0xffffffff Após executar essa instrução, o valor 0xffffffff será copiado para o endereço 0x950030 (que é o tal EAX + 0x30). O ds vem de data segment e já dá a dica que este é um segmento de dados. No caso de executáveis de Windows, provavelmente este endereço estará na seção .data, já que está sendo usado para escrita (o valor é copiado para lá) e esta seção em geral possui permissão de escrita quando mapeada em memória. Abraço, Fernando
  20. Ué, mas você usa loops for e while em várias partes do teu código. Não entendi... De qualquer forma, ignorando tudo que pode ser corrigido e/ou melhorado, no caso da sua implementação das opções 4 e 5, só faltou imprimir na tela o número do cacifo, dentro do loop. Então ao invés de: cout << "O cacifo esta " << cacifo[i] << endl; Você pode fazer: cout << "O cacifo " << i << " esta " << cacifo[i] << endl; Abraço.
  21. Olá, @herculespt, beleza? Acho que antes de implementar as opções 4 e 5, precisamos acertar o seu código. Do contrário, vai ficar cada vez mais difícil. ? Vejo os seguintes problemas: 1. main() precisar retornar int A função main() não pode retornar um float. Tem que ser int. Falta também um return 0 no fim do seu código. 2. A variável que vai abrigar a opção não precisa ser um array Você declara essa variável int op[6], mas como ela só vai abrigar uma opção por vez, ou seja, um número por vez, basta que seja int op. 3. Provavelmente era pra você criar um tipo cacifo Pela estrutura do programa, me parece que a resposta mais correta seria criar uma struct ou class do tipo cacifo, ou seja, seu próprio tipo. Até dá pra fazer com as propriedades do cacifo (nome e estado - ocupado ou vazio), em variáveis independentes, mas seria mais complicado e menos eficiente. A não ser que você não precise do nome, aí basta um array de strings mesmo ou, mais eficiente, de inteiros (você pode usar 0 para vazio e 1 para ocupado). Se for nesta última opção, você só vai precisar declarar como int cacifos[20], mas acho que antes vale verificar se estes cacifos não precisam de nome ou de outras propriedades. Se precisarem, aí é melhor criar uma struct ou class (depende do que seu professor, ou professora, ensinou). 4. Você precisa usar mais loops Ao invés de fazer: cout << "\nCacifo " << i << cacifo[0] << endl; cout << "Cacifo 1: " << cacifo[1] << endl; cout << "Cacifo 2: " << cacifo[2] << endl; cout << "Cacifo 3: " << cacifo[3] << endl; cout << "Cacifo 4: " << cacifo[4] << endl; cout << "Cacifo 5: " << cacifo[5] << endl; cout << "Cacifo 6: " << cacifo[6] << endl; cout << "Cacifo 7: " << cacifo[7] << endl; cout << "Cacifo 8: " << cacifo[8] << endl; cout << "Cacifo 9: " << cacifo[9] << endl; cout << "Cacifo 10: " << cacifo[10] << endl; cout << "Cacifo 11: " << cacifo[11] << endl; cout << "Cacifo 12: " << cacifo[12] << endl; cout << "Cacifo 13: " << cacifo[13] << endl; cout << "Cacifo 14: " << cacifo[14] << endl; cout << "Cacifo 15: " << cacifo[15] << endl; cout << "Cacifo 16: " << cacifo[16] << endl; cout << "Cacifo 17: " << cacifo[17] << endl; cout << "Cacifo 18: " << cacifo[18] << endl; cout << "Cacifo 19: " << cacifo[19] << endl; Você pode fazer: for (int i=0; i<20; i++) { cout << "Cacifo " << i + 1 << ":" << cacifo[i] << "\n"; } Sempre que estiver repetindo linhas como essas no seu código, substitua por um loop. Você vai errar muito menos assim Faz essas correções aí, porque pra avançar precisaremos delas. Aí a gente continua a conversa. ? Um abraço!
  22. Bem lembrado. Mas tem um ponto.. Eu acho que a gente deve considerar o que o aluno está estudando (admitindo que isso é um exercício de um curso de programação). Normalmente, em enunciados deste tipo, que miram a lógica, considerar tabulações verticais e outros caracteres é um pouco "demais". Usar a isspace() provavelmente vai na mesma linha. Mas concordo que sua consideração é mais completa. Se quem passou o exercício falou de outros caracteres, e/ou falou da isspace() - o que pode ter acontecido vide a inclusão do ctype.h pelo @lucas costa da cruz -, você está certíssimo. Do contrário, comparar com ' ' deve ser suficiente. ? Um abraço, Fernando
  23. Bom dia, @lucas costa da cruz, tudo bem? Eu precisei editar seu post original pra formatar o código como código (é só clicar no botão <> aqui do editor na hora de postar). Pode fazer isso da próxima vez que postar código, por gentileza? ? Também fiz as seguintes edições no seu código, para melhorar a visualização: Indentação: aninhei os códigos dentro dos blocos {} Espaços: pus espaços entre coisas como include<arquivo> e for (i=0;i<...;i++), etc. Coloquei os comentários das declarações de variáveis alinhados. Adicionei também um espaço depois do caractere ":" (dois pontos) na linha "Digite sua frase: ". Tudo isso foi pra deixar o código melhor pra quem for te ajudar, inclusive pra você mesmo ler. Agora em relação à lógica do programa em si, me parece que você modificou um programa que já contava vogais para agora contar espaços, foi isso? Achei inteligente fazer isso, parabéns! ? A sua contagem está certa. Só faltou imprimir o valor da variável ContadorEspacos. E nem precisa usar um condicional (if) pra testar se é maior que zero. Basta imprimir o valor dela, mesmo que seja zero. Mais uma coisa: você aloca um vetor de apenas 12 posições com char texto[12]. Isso vai fazer com que sua frase não possa ter mais do que 11 caracteres. Eu usaria pelo menos uns 255. ? NOTA: O seu programa possui um bug de segurança ao combinar um buffer que pode ser facilmente estourado com o uso da função gets(), mas este assunto foge do tema da lógica de programação em si, e acredito que este exercício seja para treinar sua lógica, então abrir este assunto com seus professores pode desviar muito, mas se quiser saber mais sobre o assunto, é só googlar por "buffer overflow". Um abraço!
  24. Matrix é um sucesso absoluto para os amantes da computação. Sua história torna o submundo, o underground, algo tangível, ainda que ilusório. Parece que alguém finalmente conseguiu relacionar a teoria de que o universo é uma ilusão, tão explorada em textos filosóficos e religiosos, com os computadores. O sonho de todo nerd. O primeiro filme, lançado em 1999, tem nota 8.7 no IMDb – talvez o maior banco de dados com informações sobre filmes, séries e outras produções audiovisuais do mundo – e a nota de Matrix não é para menos: trouxe inovações em efeitos, som e imagem, um elenco incrível, enredo amarrado, personagens marcantes (você provavelmente lembra da Switch com seu “nevou”, do traidor Cypher e da bebida do Dozer, isso sem falar nos protagonistas). A espera para o Matrix 4 (5.7 no IMDb) foi grande e a comunidade amante de computação comemorou muito. Comigo não foi diferente. Apesar de ter ouvido algumas críticas, eu fui ao cinema na última terça-feira, desafiando a Ômicron e a H3N2, só para ver o que a diretora Lana Wachowski preparou. Vou contar aqui minhas percepções na ordem em que apareceram. Alerta de spoiler. História Achei o roteiro do filme maneiro. Colocar o Neo de volta na Matrix e fazer parecer que tudo foi um jogo que ele programou foi genial. Já o objetivo de acordar a Trinity achei bobo. Acorda e aí? De qualquer forma, aprendi que é possível reamarrar bem uma história já terminada. Inclusão Há muitos pretos no filme e muitas mulheres, incluindo uma espécie de protagonista (a Bugs – é, o nome é marmomeno). Curti muito isso e para mim é um exemplo incrível. Velhice Ver Neo e Trinity mais velhos, mais experientes, foi muito maneiro. Infelizmente isso não foi muito explorado. Ninguém precisa morrer Audacioso fazer um filme em que nenhum dos mocinhos sequer se fere gravemente. Vai contra quase todas as receitas de sucesso dos filmes de ação. Tudo no Matrix 4 parece ser bem fácil. Interessante. Fidelidade Os generais de Ion são bem fiéis à Niobe. Um deles diz “Se essa missão é importante pra você, nenhum de nós vai ficar em casa”, quando ela pede voluntários para ajudar no resgate da Trinity. Gostei. ? Efeitos As porradas no analista têm uns efeitos muito maneiros, mas Neo e Trinity abobam as cenas com um estalar de dedos, infelizmente. De qualquer forma, curti a inovação. Transcendência Neo e Trinity sabem exatamente o que é a Matrix e por isso não temem nada e controlam tudo. Por um lado é legal, porque realmente se sabemos que esse mundo não é real, nem nos preocupamos. Vilões Honestamente, não há vilões. Tem o analista que mantém o Neo na Matrix, mas é isso. Morpheus Enquanto no Matrix 1 o Morpheus é super sério, sabe da verdade e tal, no Matrix 4 o Morpheus é um malandrops que bebe drinks. E totalmente coadjuvante. Cenas de Matrix 1 Muitas cenas do primeiro filme foram refeitas com menos capricho. Um exemplo é a do helicóptero, as cápsulas caindo e a aeronave finalmente batendo no prédio. Pareceu uma e uma tentativa pouco criativa de requentar o que deu certo. Trilha sonora Saudades do Rage Against The Machine… Hacking Tem uma única menção e mais nada. Bobo, bobo... Miscelânea O Neo não se vê como ele realmente é, mas isso é falado uma vez só no filme e ninguém nunca mais volta no assunto. A Niobe envelhecida me lembrou o Gugu no táxi do Gugu. Aprendi bastante coisa do que fazer e do que não fazer, em tudo. Normalmente meu trabalho aqui no Mente Binária envolve criar conteúdo e gerenciar a equipe. Aprendi com Matrix 4 algumas coisas que posso fazer e algumas coisas pra eu não fazer. Por exemplo, tentar "requentar" o que já foi feito não é legal, mas com certeza é possível pegar um curso que foi terminado e encaixar um novo que tenha o primeiro como o ponto de partida. Mas tem que ser realmente novo. Nada de tentar ressucitar o que já morreu. ?
×
×
  • Criar Novo...