Jump to content

Fernando Mercês

Administradores
  • Content Count

    687
  • Joined

  • Last visited

Everything posted by Fernando Mercês

  1. Ué, você escreveu e não entendeu? Como assim? rsrs Pensa aí que valor terá nas tuas "variáveis" no teu loop, dependendo do valor de i. Algo como: Entrada é a string "bacon" Para i=0: word.at(0) é 'b' word.at(0) != word.at(5 - 0 - 1) wrod.at(0) != word.at(4) // que é 'n' Para i=1: word.at(1) é 'a' word.at(1) != word.at(5 - 1 - 1) wrod.at(1) != word.at(3) // que é 'o' ... Coloca o return true fora do bloco do loop. Assim se ele achar uma letra diferente, já retorna falso. Se o loop acabar e não retornar falso, é só retornar true. Resolve esse problema primeiro e quando conseguir avisa, porque tem mais coisa pra melhorar nesse código e ele pode ficar ainda mais legal. Grande abraço!
  2. Opa! Então.. Fiquei um pouco confuso: você que escreveu a função que faz o hash? Ou usou uma função pronta da biblioteca de C++? Sim, querido, patcheando dá pra fazê-lo aceitar qualquer coisa. Só que você disse que o desafio era quebrar o hash (eu entendi que era descobrir a senha, não burlar a checagem). Tá tudo certo e também foi legal pra estudar um pouco. Tinha tempo que eu não brutava nada e tal. Foi uma noite e tanto. Abraço!
  3. Opa, beleza? O seu loop tá iterando até "menor ou igual o tamanho da string", logo, se você inserir a string radar, tem que tamanho 5, o teu loop vai tentar acessar o elemento word.at(5), que não existe - lembra que os arrays começam em 0? Logo, a string radar tem elementos indexados de 0 à 4, totalizando 5 elementos. Pensa aí, não quero te dar a solução pra não atrapalhar teu aprendizado. Vai ter que corrigir na comparação dentro do loop também. Adicionalmente, você tá declarando funções/métodos com um tipo de retorno int (a main() e a isPolindrome()), mas não tá deixando um valor padrão a ser retornado nelas. A identação pode melhorar também. Abraço, Fernando
  4. Mas é possível mesmo? Por isso perguntei se você quebrou, entende? Uma função de hashing, se bem implementada, é one-way, ou seja, não dá pra "voltar" ao original. Então eu tentei brutar os 3 caracteres e todas as combinações ASCII possíveis não funcionaram, ou seja, em nenhum caso na faixa dos caracteres imprimíveis para s[0], s[1] e s[2] é possível fazer com que eax seja 0xed5dd719. unsigned eax; char s[] = "???"; eax = (s[2] << 0x10) ^ 0xC70F6904; eax ^= (s[1] << 8); eax ^= s[0]; eax *= 0x5BD1E995; eax ^= (eax >> 0xd); eax *= 0x5BD1E995; eax ^= (eax >> 0xf); // Depois disso tudo eax tem que ser igual a 0xed5dd719; Com 8 caracteres (que é o caso da senha correta) o algoritmo usado pela função é outro: char s[] = "????????"; for (int i=0; i < 8; i++) { tmp = (unsigned *) &s[i*4]; edi = *tmp * 0x5BD1E995; edx = edi >> 0x18; edx ^= edi; edi = eax * 0x5BD1E995; eax = edx * 0x5BD1E995; eax ^= edi; } edx = eax >> 0xd; eax ^= edx; eax *= 0x5BD1E995; edx = eax >> 0xf; eax ^= edx; //eax tem que ser igual a 0xED5DD719 Mas com 8 caracteres já fica inviável brutar: $ crunch 8 8 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 \!\"#$%&'()*+,-./:;<=>?@[\\]^_\`{|}" Crunch will now generate the following amount of data: 54861204468697344 bytes 52319721668 MB 51093478 GB 49895 TB 48 PB Então vejo 3 possibilidades: Você usou a função hash e conseguiu revertê-la quebrando seu próprio crackme, chegando na senha, o que significa que essa função é fraca, mas mais forte que eu. Você implementou seu próprio hash de maneira correta e ele não é quebrável. Você usou a função hash mas não quebrou o crackme e fez um crackme impossível, não por sua culpa, mas por ter usado uma função de hash segura. Ajuda? Abraço, Fernando
  5. Eu pensei que você queria a senha correta. É que patchear o jump é fácil po. rs Mas como chegar na senha? Teria que quebrar essa função de hash como o @bornman falou. Era aí que eu tava trabalhando... Qual era a senha correta?
  6. Oi @kassane blz e você? Acho que o você fez é um keygenme, já que imagino que a solução seja descobrir a senha. Cara, eu olhei aqui e vi que se a string de entrada tiver mais que 3 caracteres, você converte grupos de 4 caracteres da string para inteiro e depois faz um monte de cálculos entre XOR, shifts e multiplicações. Por fim compara o resultado com 0xed5dd719. Eu tentei brutar com strings de 4 caracteres mas não consegui chegar nesse valor. Ficou uma coisa na minha cabeça: você conseguiu resolver este crackme? Digo, sem saber a senha, olhando o código em Assembly, você conseguiu resolver? Se sim, dá uma dica? Abraços, Fernando
  7. Já usei Xubuntu e gostei. @cpuodzius tu sabe a diferença entre XFCE e LXDE? Ambos são ditos leves, certo? Abraços, Fernando
  8. Olá. Qual ajuda você precisa? Já definiu a linguagem? É uma necessidade ou trabalho de colégio/faculdade? Se for necessidade, já existem conversores (iconv, por exemplo).
  9. Em março do ano passado, pesquisadores da Trend Micro descobriram que o malware Winnti utilizava o Github para baixar um arquivo de configuração de seu servidor de Comando & Controle (C&C, ou C2). Mais para o fim do ano, a empresa Sucuri analisou um caso onde um minerador de criptomoeadas foi encontrado na plataforma. Agora é a vez de malware brasileiro entrar na brincadeira. Disfarçado seu malware de "notafiscal" como muitos outros criadores de malware brasileiros, o usuário w3afkli1001 hospedou um .rar e um .exe num repositório chamado nfiscal. Ironicamente, foi escolhida uma licença livre Apache. Usando a ferramenta repoget, que fiz exatamente para casos como esse, baixei todo o conteúdo de todos os repositórios deste usuário (mas só havia um mesmo): $ python2.7 repoget.py w3afkli1001 Creating ./w3afkli1001 directory... Cloning repositories... w3afkli1001/nfiscal Cloning gists repositories... $ cd w3afkli1001/nfiscal $ md5 * MD5 (ET78G4B6GTY8H6GFB5XCSRY846HGFB15XRHTYD46HGFB5X1HDY468HDFGB15DHY46HFB51HYD846HDBFG5.PDF.exe) = 778351a3953ed0cc081fef0a5da53358 MD5 (ET78G4B6GTY8H6GFB5XCSRY846HGFB15XRHTYD46HGFB5X1HDY468HDFGB15DHY46HFB51HYD846HDBFG5.PDF.rar) = b97861be214d9a4643571090ee8740e9 MD5 (LICENSE) = 86d3f3a95c324c9479bd8986968f4327 MD5 (Nota_Fiscal.exe) = 679dd0f68e9f25b4c57bd5bc332fb952 Olhando o log dos commits, percebe-se que o autor utilizou a interface web do Github para fazer uploads dos arquivos. Mais fácil que aprender a usar o git né? $ git log commit 5e0d647a5356b861102b8fe4eacbf13d3f9c1eef (HEAD -> master, origin/master, origin/HEAD) Author: w3afkli1001 <35973712+w3afkli1001@users.noreply.github.com> Date: Thu Feb 15 14:28:19 2018 -0200 Add files via upload commit 61792bc7a8591291d2467333a5cecfc6d9505c5e Author: w3afkli1001 <35973712+w3afkli1001@users.noreply.github.com> Date: Mon Feb 5 20:14:25 2018 -0200 Add files via upload commit f03d7491f2c5369d4d6be9353d04faa8564c60dc Author: w3afkli1001 <35973712+w3afkli1001@users.noreply.github.com> Date: Mon Feb 5 20:13:00 2018 -0200 Delete ET78G4B6GTY8H6GFB5XCSRY846HGFB15XRHTYD46HGFB5X1HDY468HDFGB15DHY46HFB51HYD846HDBFG5.PDF.exe Mas por que afinal, é perigoso hospedar malware em sites como Github, Google Drive, Dropbox, etc? Acontece que muitas soluções de segurança não bloqueiam as requisições para estes sites, pois são conhecidamente sites benignos. A responsabilidade da segurança é deles, mas reconheço que é um desafio.
  10. Rapaz, eu li múltiplas vezes pra entender mas não sei se entendi. Vamos lá, quando um computador (se você usa a palavra "micro" essa TI parece mais engessada ainda! haha) falha, o técnico liga um cabo cross (isso ainda existe?) nele com outro computador, dá um boot com o DEFT e dá uns comandos pra fazer a cópia (mount, cp, etc), certo? Você quer automatizar esses comandos somente? Abraço, Fernando
  11. Já estamos vendo isso @andrefilho08. To vendo com a @Gabrielle Alves como fazer isso!
  12. Ainda assim, @gzn, temos que ter o dump de memória antes, correto? É o que entendi do manual...
  13. Eu acho que a melhor parte de tê-la feito é o código ser limpo, claro de ser entendido. Lembro que na época eu tentei entender o código do hexdump, od, etc mas falhei miseravelmente. rs Abraço!
  14. @gzn no Windows você pode usar o hdump também, pra não precisar Cygwin.
  15. O pessoal do blog hasherezade's 1001 nights liberou um crackme hoje. Quem resolver e contactá-los no Twitter leva 3 livros escolhidos pelos ganhadores. É uma ótima oportunidade pra treinar os conhecimentos de ER e ainda ganhar uns livros maneiros. O crackme é para Windows, feito em C++, mas vai exigir. O post completo com a explicação e link para download está em https://hshrzd.wordpress.com/2018/02/03/white-rabbit-crackme/ Dica: já é uma chance de usar a dica do vídeo Desabilitando ASLR. Podem usar essa thread pra postar o desenvolvimento se quiserem. Abraço e boa sorte!
  16. Nesta sexta-feira a desenvolvedora de software Hex-Rays atualizou a versão do IDA, seu disassembler. A versão gratuita do IDA não era atualizada desde a versão 5.0, enquanto a versão paga seguiu passando pela 6.0, 6.5, etc até chegar à versão 7.0 atual. Como este software tem um custo alto, esta é uma notícia muito boa para estudantes e entusiastas em engenharia reversa que querem ter um gostinho de como funciona este poderoso analisador estático (ok, sabemos que o IDA também pode depurar, mas sua principal função é disassemblar código ). O IDA freeware está disponível para Windows, Linux e macOS e pode ser baixado aqui. Em breve faremos alguns vídeos sobre o uso desse disassembler, mas até lá, você já não tem desculpa pra não baixar e começar a conhecê-lo!
  17. Sim, mas tem que alocar antes. O mais rápido é simplesmente declara e passar o endereço, tipo: SIZE_T bytes; ReadProcessMemory(...., &bytes) Posta o trecho de código onde você chama a função também, pra gente ver como tá. Abraço.
  18. Isso pra dumpar a stack do processo, @Vernieri? É do mesmo jeito que usei aqui? Pega o endereço da stack no /proc/<pid>/maps e usa o dump memory do gdb? Eu não sei sobre as técnicas modernas, por isso pergunto. Abraço!
×
×
  • Create New...