BasE91 codificação introdução basE91 é um método avançado para codificar dados binários como caracteres ASCII. É semelhante a UUencode ou base64, mas é mais eficiente. A sobrecarga produzida pelo basE91 depende dos dados de entrada. Ele é no máximo de 23 (versus 33 para base64) e pode variar até 14, o que normalmente ocorre em blocos de 0 bytes. Isso torna o basE91 muito útil para transferir arquivos maiores em conexões binárias inseguras como e-mail ou linhas de terminal. Alfabeto Como o nome sugere, basE91 precisa de 91 caracteres para representar os dados binários codificados em ASCII. Dos 94 caracteres ASCII imprimíveis (0x21-0x7E), os três seguintes foram omitidos para construir o alfabeto basE91: A tabela de tradução é composta dos restantes caracteres como mostrado abaixo. Tempo estava indo para ver o que uma declaração switch parece em (des) montagem. Squeeee Então vamos atualizar o nosso radare do git, instalá-lo e começar. Heres o que estavam indo analisar. Bastante o doozy de uma função com algum grave ramificação. Um pouco preocupado com como bonkers esta parece Tomar uma boa olhada, porque thats a declaração switch que eu mencionei anteriormente. É realmente muito menos assustador do que parece, então tome um gole de sua bebida favorita e deixe mergulhar. Analisando a entrada Após o prólogo da função o endereço de nossa seqüência de entrada é movido para edx (linha 5). Em seguida, três variáveis locais são empurradas para a pilha (linhas 7-12). Depois disso, a string d c d é empurrada para a pilha, e então nossa string de entrada, (como seu endereço armazenado em edx) é empurrada para a pilha. Essas linhas configuram os argumentos de função para a chamada sscanf. Nossa string é a fonte, a string de formato (d c d) e as três variáveis que conterão os valores digitalizados. É agora aparente que a entrada necessária é na forma de um número, um caractere e outro número. Podemos extrair essas informações da string de formato passada para sscanf. É bom saber o que precisamos para entrar, porque se não conseguirmos isso bem explodir a bomba. Uma vez que voltar do sscanf. Eax obtém comparado ao valor imediato 2. Após sscanf retorna, eax contém seu valor de retorno, que é, de acordo com sua página de manual, o número de conversões que foram concluídas com êxito é retornado. Se o valor em eax for maior que 2. Em seguida, saltar sobre sym. explodebomb. Portanto, este teste deve garantir que três valores tenham sido digitalizados com êxito. Mudando as coisas Agora a instrução switch começa (linha 20). Porque ebp - localch foi a última variável a ser empurrada para a pilha antes da chamada para sscanf. Ele conterá o primeiro número. À medida que os argumentos são empurrados para a pilha na ordem esquerda para a direita. O valor armazenado é comparado ao valor imediato de 7. Na linha seguinte (linha 21) há um salto condicional que não vimos anteriormente. Aos documentos JA. Saltar se acima (se leftOp gt rightOp) Para expandir sobre isso, ja é parte dos saltos com base em comparações sem assinatura. Ok, então vamos dar o salto se o nosso primeiro valor é maior (ou igual) 7. O que com o salto sendo um cheque para inteiros não assinados, também sabemos que não pode ser menor que 0. Permite espreitar em 0x8048c88. Que é onde o salto nos levaria. Use: s 0x8048c88 para procurar lá. Não, isso não gosta de algum lugar que queremos acabar. Tome nota: o primeiro número tem de ser menor ou igual a sete. Parece que esta é a instrução de maiúsculas e minúsculas padrão. Vamos voltar e ver o que acontece se não fizermos o salto. O valor é movido para eax e, em seguida, temos um salto com base nesse valor. Este é o início da instrução switch. Na linha 23 o código jmp dword eax4 0x80497e8 saltará para a instrução caso relevante, com base no endereço armazenado em eax4 0x80497e8. Vamos dar uma olhada no que é armazenado em 0x80497e8 Nós sabemos que theres um cheque para certificar-se de nossa entrada não superior a sete, então eu pensei que eu poderia apenas verificar 35 bytes (4 7 mais 4 extra para ver o que está lá). O que temos aqui é uma tabela de pesquisa (ou mais corretamente nomeado, uma tabela de salto) que contém os endereços das declarações de caso, em formato little endian naturalmente. Você verá somente este tipo de tabela de salto se as instruções de caso forem baseadas em valores seqüenciais. Isso é porque os valores de salto necessários para entrar na tabela de salto só vai funcionar em tal situação. Outras instruções de comutação que o encouter funcionará de forma diferente. Aqui é que o compilador pode otimizar valores seqüenciais para produzir o que temos aqui. Portanto, a primeira entrada é 0x08048be0. Que é o endereço da primeira declaração de caso No momento em que chegarmos ao final da tabela de consulta você vai notar que theres nenhum endereço válido, daí a condição de que o nosso valor é menor ou igual a 7. Agora sabemos que a nossa primeira Input nos direcionará para uma instrução de caso específico, mas como isso afeta nossas outras entradas Vamos apenas olhar para o exemplo acima, onde o primeiro número que entrou é 0. Na linha 1 o caractere q é movido para bl. Este é um registo de 8 bits, que forma o byte baixo do registo bpx. Depois disso, nosso segundo dígito é comparado com 0x309, que é 777 em decimal. Se os números forem iguais, o salto condicional leva-nos a 0x8049c8f. E porque nós não chamamos sym. explodebomb. Estavam fazendo o bem. Vamos dar uma olhada no que acontece no endereço do salto Outro cmp. Desta vez comparando nosso caráter de entrada para o que está em bl. Se eles são iguais, saltamos sobre sym. explodebomb mais uma vez e começamos a sair da função para retornar ao sym. main. O que sabemos Então, sabemos que precisamos inserir um número, seguido por um caractere, seguido por outro número. O primeiro número precisa ser menor ou igual a sete. A escolha do número determinará que letra e número seguem. Olhando para a instrução switch, podemos trabalhar com as seguintes opções Escolha uma e experimente. Se ele funciona (e deveria), adicione-o ao arquivo defuse, e prepare-se para a fase 4. Porque weve praticamente descobriu toda a fase da análise estática, eu não acho que há uma necessidade de cobri-lo com análise dinâmica aqui. Se você manchar algum erro, tem algum feedback ou perguntas sobre qualquer uma das fases, deixe-me saber, quer através dos comentários Disqus abaixo, ou via Twitter. Uma boa opção para criar strings com dados binários para salvar (por exemplo, salvando um sql Declaração para um arquivo) em arquivos de texto ou código php é fazer o seguinte: campo ltphp campo bin2hex (campo) campo chunksplit (campo 2.x) x. Substr (field, 0, - 2) gt isso irá converter seu campo (binário ou não) em hexadecimal e então converter o hex em uma string que pode ser colocada em um arquivo php: FFFFFFFF - gt xFFxFFxFFxFF Em resposta a Patrik: Maneira de imprimir um número em binário é usar baseconvert (). Lt echo baseconvert (bin, 10, 2) gt Se você precisar dele para imprimir todos os 32 bits (como sua função faz) você pode apenas pad it out: lt eco balcão (baseconvert (bin, 10, 2), 32, STRPADLEFT) gt A conversão é a partir da base 10 porque quando bin é passado para baseconvert (), ele é convertido em uma seqüência de caracteres, ea representação padrão é em decimal. Espero que isto ajude. Alguns deram uma função para converter um código hexadecimal de volta em um texto simples (legível por humanos ASCII: P) Mais alguém deu uma função que faz uso de bin2hex para converter URLs em algo como 123456 Aqui está uma função para ir do formulário 123456 de volta em ASCII Observe que esta função pode ser facilmente alterada para transformar qualquer código hexadecimal em ASCII lt função hex2text (str) str explode (, str) arrayshift (str) nmlstr foreach (str como hexstr) nmlstr. Chr (baseconvert (hexstr, 16, 10)) return nmlstr gt espero que isso ajude :) Saudações - Tsuna Espero que isso ajude alguém. Ele apenas exibe uma representação html de dados hexadecimais, bem como um visualizador hexadecimal. Ltplp função hexview (dados) bytePosition columnCount lineCount 0 colunas 8 dataLength strlen (dados) return array () return lttable border1 cellspacing0 cellpadding2gt para (n 0 n lt dataLength n) linhas lineCount columnCount substr (dados n. ) LineCount columnCount 0 foreach (linhas como linha) return lttrgtlttd alignrightgt. BytePosition. : Lt / tdgt para (n 0 n lt colunas n) return lttdgt. Strtoupper (bin2hex (linha n)). Lt / tdgt retorna lttdgt ampnbspampnbspampnbspampnbspampnbspampnbspampnbspampnbsp lt / tdgt para (n 0 n lt colunas n) return lttdgt. (Htmlentities (linha n). Htmlentities (linha n). Ampnbsp). Lt / tdgt retorna lt / trgt bytePosition bytePosition colunas retornam lt / tablegt return implode (return) gt Esta função o desfaz (converte novamente em ASCII). Ltphp função hex2asc (myin) para (i 0 i lt strlen (myin) / 2 i) myout. Chr (basconvert (substr (myin. I 2. 2), 16. 10)) return myout gt Eu estava apenas navegando o acima e com uma pequena modificação, veio com o seguinte que eu acredito ser mais flexível: ltphp função bin2hex (Dados) corrigidos eregreplace (0-9a-fA-F. Dados) pacote de retorno (H. strlen (corrigido), corrigido) gt Isso fará com que tudo o que você passar, mesmo se for preenchido nas extremidades ou entre pares , Deve retornar os dados desejados.
No comments:
Post a Comment