Ir para conteúdo

gzn

Membros
  • Total de itens

    85
  • Registro em

  • Última visita

Reputação

20 Excellent

Dados pessoais

  1. gzn

    duvida

    Se você pretende alterar um binário no formato PE você pode pesquisar pelos termos "infect PE", "binary code injection PE". Acho que cada formato de arquivo executável tem lá suas particularidades. Por exemplo, você pode pensar no seguinte (se meu raciocínio estiver errado alguém me corrija! rs): Crie um programa normal em C com os comandos que você quer utilizar. Compile ele e retire o código da seção .text dele. Analise as bibliotecas que ele precisa. Crie uma nova seção executável no binário que você quer colocar esse código e "cole" lá. Atualize as bibliotecas que o binário precisa com base no seu código e veja se está faltando alguma biblioteca. Mude o ponto de entrada do binário para seu código e do seu código desvie para o ponto de entrada original do binário que você quer modificar. Essas 6 etapas podem ser divididas em subetapas e o negócio não é simples porque você vai precisar saber como funciona o carregamento de um binário variando o formato (ELF, PE-COFF, PE). KKKK no mais, não tenho condições de prosseguir e te ajudar porque também... não sei sei! Siga o método cartesiano e divida esse problema em problemas simples! Quem sabe outros experientes que trabalham na área e lidam com infecções possa ajudá-lo a entender isso... E... ouvintes de Sócrates ficavam surpresos ao pensar nas perguntas que ele fazia a fim de demonstrar que eles não sabiam o que diziam saber, mas quando supunham que Sócrates sabia das respostas ele mesmo dizia: "Eu também não sei, por isso estou perguntando"! Daí surgiu a expressão que resume esse pensamento dele, só sei que nada sei! Eu também digo o mesmo!
  2. gzn

    Como encontrar a função main?

    Muito bacana seu script @Felipe.Silva! Creio que não só eu mas os outros que estão iniciando acharam motivador você escrever esse script e ainda na linguagem python (o que é até bom pra quem ta fazendo o curso Pythonicos!). kkk é isso aí amigo, quando você souber de um e fizer uns testes não deixa de comenta ai no fórum. Seus posts são muito bem organizados e você tem uma didática legal (a maneira como você explica passo a passo). valeu!
  3. gzn

    Radare2 dicas de uso

    Como encontrar a main de alguns arquivos executáveis? No caso da instrução usada para especificar o primeiro argumento da __libc_start_main seja MOV: Usando a fonte ola_mundo.c e as opções de compilação nesse Makefile: r2@d0d325823847:~$ r2 -qc 's entry0+0x20;pxw 4~[1]' ola_mundo 0x00400430 Claro que se for fazer a análise dinamicamente fica mais fácil! Se estamos falando de um ELF de 64 bits vamos olhar para RDI onde está o endereço da main. Como olhar seu valor antes da call __libc_start_main? Primeiro inicie o radare com -d (análise dinâmica requer modo de depuração) Geralmente o radare já deixa você no ponto de entrada do binário se ele for um executável mesmo, mas se por algum motivo estranho ele não estiver lá, digite s entry0 Faça uma análise básica para descobrir as funções (use af) Agora coloque um ponto de parada na primeira call (que provavelmente será para __libc_start_main) com comando db ` pdf~call:0[1]` Continue a execução com comando dc Agora inspecione o registrador RDI com dr~rdi Lembre-se que você pode fazer todos estes passos pela linha de comando de forma automática! (deixo para exercício) Achou engraçado isso tudo só para pegar aquele enderecinho?! rsrs Bom isso tudo é só pra você ir treinando um pouco e saber o que cada comando acima faz! Boa diversão e continue praticando!
  4. gzn

    Radare2 dicas de uso

    Como ter a última versão do radare e ter um ambiente minimamente isolado para analisar binários? Que tal usar o docker com uma imagem com o radare atualizado? sudo apt install -y docker-compose sudo docker pull radare/radare2 mkdir sandbox cd sandbox Agora um script para simplificar a sua vida (vou chamá-lo de r2docker): #!/bin/sh imagem='radare/radare2' container='radare' if sudo docker container ls -a|egrep Exited.+$container then echo reiniciando sudo docker start $container elif ! sudo docker container ls -a|egrep Up.+$container then echo iniciando sudo docker run --name $container --cap-drop=ALL --cap-add=SYS_PTRACE -v $PWD:/home/r2/ -id $imagem fi sudo docker exec -it $container bash Torne-o executável: chmod +x r2docker Agora é só entrar nesse ambiente e fazer os seus experimentos: wget https://shellter-static.s3.amazonaws.com/media/files/7dd461ae-89bf-49c0-a7a3-4148bd788599.bomb -O bomb ./r2docker r2@d0d325823847:~$ ls bomb r2@d0d325823847:~$ r2 -dAA bomb Para atualizar a imagem do radare é bem simples, basta você parar o container e fazer o pull: sudo docker container stop radare sudo docker pull radare/radare2 Então, o que você acha disso? Eu particularmente mesmo que os binários que eu vá analisar não sejam perigosos eu não gosto de bagunçar meu ambiente principal de trabalho (tudo que faço nele procuro instalar via gerenciador de pacotes para se quiser mais tarde desinstalar o que instalei com facilidade!). Como meu PC é muito lento pra rodar uma VM essa é uma boa alternativa.
  5. gzn

    Como encontrar a função main?

    Meus amigos, gostaria que alguém desse um exemplo para situação nº 3. Alguém pode escolher um protetor (protector) de binário popular para linux ou windows e dizer mais ou menos as etapas para se chegar a main? Não vale usar o UPX porque ele só comprime os dados! thank you
  6. gzn

    Como encontrar a função main?

    @Felipe.Silva realmente você está certo! Até para resolver no caso de um binário estático (pelo menos se for fazer o binário da forma tradicional com libc). Parece mesmo que esse deslocamento da entrada+0x20 não varia muito não (pelo menos, até agora nos meus testes não vi nada diferente). Obs.: essa técnica parece funcionar melhor só em casos em que é usada a instrução mov (ex.: mov rdi, 0xFFF...). Algumas vezes nesse ponto (próximo a entrada+0x20) é usado LEA ao invés de MOV, nesse caso essa técnica precisa ser adaptada.
  7. gzn

    Como encontrar a função main?

    Bacana meu amigo! Você comentou sobre a situação 1. (aquela situação que eu até comentei em que simplesmente poderíamos pegar o primeiro argumento de __libc_start_main). Agora, minha dúvida mesmo é situação nº 2 [em diante] onde você pega um binário estático! Um pouco difícil : Ligado estaticamente e sem símbolos! Por exemplo: na sua máquina tenta fazer esse procedimento acima que você sugeriu no binário ola_mundo.static que você consegue com o seguinte código: https://github.com/gu10ng1t/re/tree/master/bin É só clonar o repo, dar cd em bin/ e digitar make. Muito obrigado pelo post amigo, achei muito bacana o seu passo a passo! Tenta tenta fazer esse "desafio" e compartilha com a gente o que você acha que daria para fazer pra achar a main de maneira que você pudesse aplicar essa técnica em outros binários compilados assim estaticamente e sem símbolos.
  8. gzn

    Como encontrar a função main?

    Se vocês puderem apresentar as soluções mais triviais de se fazer isso acho que muitos iniciantes agradecerão! rs Começando da situação mais simples à mais complicada: Situações: Fácil : Ligado dinamicamente e sem símbolos. Um pouco difícil : Ligado estaticamente e sem símbolos! Muito difícil : Ligado estaticamente, sem símbolos e com um protector popular no mercado!! Analisando um ELF na situação 1. parece que é fácil, é só procurar pelo símbolo __libc_start_main, colocar um bp nele e observar o primeiro argumento. Mas aí eu pensei: e no caso 2. em que nós não temos símbolos e a libc está dentro do nosso binário? E se fosse um PE, quais dicas você daria para as situações acima? Obs.: a situação número 3 se vocês não quiserem comentar deixem de lado, é um tanto difícil de dar dicas visto que não especifiquei nenhum protetor específico (aliás, nem sei quais existem e muito menos os mais populares! rs). Era só pra vocês comentarem quais seriam as técnicas gerais para se chegar na main (ex., como você começaria a analisar o binário e que tipo de técnicas você usaria como por exemplo assinaturas, algoritmos de comparação de código que procuram similaridades com funções previamente conhecidas, o uso de estatística e probabilidade, inteligência artificial, etc.). Participe e comente o que você faria em cada situação!
  9. gzn

    Radare2 dicas de uso

    Imprimir desmontagem de referências `a chamadas intermodulares com contexto? Não entendeu? objdump -d binario | grep -C 2 call É mais ou menos isso daí de cima... Primeiro defina uma macro que: volta duas instruções a partir da referência atual (so -2) imprime 5 instruções (pd 5) imprimir um espaço para facilitar a leitura (echo '') (grepc2, so -2, pd 5, echo '', echo '') O nome que eu criei é grep + c (de contexto) + 2 (duas antes e duas depois). Agora é só chamar a macro: .(grepc2) @@=`axt @@@i~[1]`
  10. gzn

    As gafes do mundo da TI

    Bacana sr. Mercês! Haha, já vi um pouco disso daí alguma vezes. Só um comentário: https://pt.wikipedia.org/wiki/Compressão_sem_perda_de_dados (lossless no inglês) Outra coisa que eu posso acrescentar que tem uma relação indireta com a TI é o inglês técnico do pessoal da área. Eu não sou um cara avançado inglês (talvez, nem intermediário rsrs), mas da pra notar que o pessoal não estuda muito inglês! Algumas palavras que o pessoal sempre tem dificuldade em pronuncia (muitas vezes bem diferente do ideal) são Apple, mobile. Ate no curso que estou fazendo o pessoal dá um vacilo (até professores rsrs). "Mobaiol" (vídeo já ta no tempo certo, 13s) "Mobol" Já com a palavra Apple as pessoas no Brasil costumam falar "eipoul", mas o mais correto (creio eu) é "épol". Falou em TI é bom investir um pouco no inglês (eu faço isso com aplicativos igual duolingo rsrs) Mas todo mundo comete erros! é natural do ser, humano!
  11. gzn

    Radare2 dicas de uso

    Visualizando variáveis locais (que estão na pilha) de uma forma mais inteligível r2 -c 'db sym.main;dc;v!' -AAd binario O comando "v!" entra no modo visual com paineis, com ele você pode criar novos paineis com o comando que quiser. Eu particularmente acho útil criar um comando para visualização do "afvd": afv? ... afvd name output r2 command for displaying the value of args/locals in the debugger ... Basicamente você deve digitar M, coloca um nome, por exemplo "Variáveis locais", depois o comando (que nesse caso é o afvd). Note que você pode rearranjar os painéis navegando por eles pelo TAB e apertando ENTER no que você quer dar maior foco.
  12. gzn

    Radare2 dicas de uso

    Search for all Intermodular calls (recurso do OllyDbg)? Você pode fazer algo parecido no radare com: pd 2 @@=`axt @@@i~[1]` 8 | 0x5629e1b6c76f e87cfeffff call sym.imp.puts ; int puts(const char *s) | 0x5629e1b6c774 488d3dab0100. lea rdi, str.Enter_the_first_number: ; 0x5629e1b6c926 ; "[+] Enter the first number: " | 0x5629e1b6c845 e8a6fdffff call sym.imp.puts ; int puts(const char *s) | 0x5629e1b6c84a b800000000 mov eax, 0 | 0x5629e1b6c816 e8d5fdffff call sym.imp.puts ; int puts(const char *s) | 0x5629e1b6c81b 8b4df4 mov ecx, dword [local_ch] | 0x5629e1b6c780 e87bfeffff call sym.imp.printf ; int printf(const char *format) | 0x5629e1b6c785 488d45fc lea rax, [local_4h] | 0x5629e1b6c7b7 e844feffff call sym.imp.printf ; int printf(const char *format) | 0x5629e1b6c7bc 488d45f8 lea rax, [local_8h] | 0x5629e1b6c7e8 e813feffff call sym.imp.printf ; int printf(const char *format) | 0x5629e1b6c7ed 488d45f4 lea rax, [local_ch] | 0x5629e1b6c832 e8c9fdffff call sym.imp.printf ; int printf(const char *format) | 0x5629e1b6c837 b801000000 mov eax, 1 | 0x5629e1b6c798 e873feffff call sym.imp.__isoc99_scanf | 0x5629e1b6c79d 8b45fc mov eax, dword [local_4h] | 0x5629e1b6c7cf e83cfeffff call sym.imp.__isoc99_scanf | 0x5629e1b6c7d4 8b45f8 mov eax, dword [local_8h] | 0x5629e1b6c800 e80bfeffff call sym.imp.__isoc99_scanf | 0x5629e1b6c805 8b45f4 mov eax, dword [local_ch] [*] Defuse the bomb with the right sequece of secret numbers [+] Enter the first number: [BOOM] You're dead x.x! Note que eu decidi imprimir duas instruções depois da referência (veja, é inclusivo, incluindo a própria referência), eu até acharia melhor imprimir duas antes. Como fazer isso? Simples, ao invés de pd 2 você digita pd -2!
  13. gzn

    Radare2 dicas de uso

    Search For All referenced text strings? (recurso do Ollydbg) Como fazer algo parecido no radare? pd 2 @@=`axt @@ str.* ~[1]`' 14 | 0x56446be70768 488d3d790100. lea rdi, str.Defuse_the_bomb_with_the_right_sequece_of_secret_numbers ; 0x56446be708e8 ; "[*] Defuse the bomb with the right sequece of secret numbers " | 0x56446be7076f e87cfeffff call sym.imp.puts ; int puts(const char *s) | 0x56446be70774 488d3dab0100. lea rdi, str.Enter_the_first_number: ; 0x56446be70926 ; "[+] Enter the first number: " | 0x56446be7077b b800000000 mov eax, 0 | 0x56446be707ab 488d3d940100. lea rdi, str.Enter_the_second_number: ; 0x56446be70946 ; "[+] Enter the second number: " | 0x56446be707b2 b800000000 mov eax, 0 | 0x56446be707dc 488d3d810100. lea rdi, str.Enter_the_third_number: ; 0x56446be70964 ; "[+] Enter the third number: " | 0x56446be707e3 b800000000 mov eax, 0 | 0x56446be7080f 488d3d6b0100. lea rdi, str.Bomb_defused ; 0x56446be70981 ; "[+] Bomb defused" | 0x56446be70816 e8d5fdffff call sym.imp.puts ; int puts(const char *s) | 0x56446be70826 488d3d6b0100. lea rdi, str.shellter_yeah_th3_s3qu3nc3_1s:__d__d__d ; 0x56446be70998 ; "[+] shellter{yeah_th3_s3qu3nc3_1s:(%d_%d_%d)} \n" | 0x56446be7082d b800000000 mov eax, 0 | 0x56446be7083e 488d3d830100. lea rdi, str.BOOM__You_re_dead_x.x ; 0x56446be709c8 ; "[BOOM] You're dead x.x! " | 0x56446be70845 e8a6fdffff call sym.imp.puts ; int puts(const char *s) [*] Defuse the bomb with the right sequece of secret numbers [+] Enter the first number: [BOOM] You're dead x.x! Comandos usados: pd N disassemble N instructions axt [addr] find data/code references to this address E o que é a expressão "@@=" ? Com essa expressão dá pra gente montar uma lista de endereços e trabalhar em cima delas. Nesse caso usamos os endereços que referenciam strings (str). Obs.: lembre-se que para você ter o resultado de um comando como argumento de outro você deve colocar o comando dentro de dois acentos graves (igual em shells como bash). E o que é a expressão "~[1]"? Você já usou o grep? Se já essa expressão é quase um grep! O til chama o "grep" interno e [1] seleciona a segunda coluna (começa do 0). Se você quisesse a primeira linha usaria a expressão ":0", sem as aspas.
  14. gzn

    Termos que vocês gostariam de ver na Wikipédia

    Engenharia Reversa (Específico para computação)! mando bem com essas sugestões, também apoio
  15. gzn

    Radare2 dicas de uso

    Como pesquisar por comandos e subcomandos? ?*~<expressão> ?*~current function | $F current function size | x @@b run 'x' on all basic blocks of current function (see afb) | x @@i run 'x' on all instructions of the current function (see pdr) | x @@=`pdf~call[0]` run 'x' at every call offset of the current function | aeaf Show regs used in current function | afB 16 set current function as thumb (change asm.bits) | afc convention Manually set calling convention for current function | afcr[j] Show register usage for the current function | afns list all strings associated with the current function | axg [addr] show xrefs graph to reach current function | pxf show hexdump of current function | sf. Seek to the beginning of current function Obs.: ~ (til) chama o grep interno para você poder filtrar os dados.
×