Gdb print format binário opções


Eu tenho GDB, mas o binário eu quero engenharia reversa dinamicamente não tem símbolos, que é quando eu executo o utilitário de arquivo que me mostra despojado: Que opções eu tenho se o ambiente em que este executa doesnt permitir que uma instância IDA Pro remoto para se conectar a Gdbserver. Em suma: o ambiente que você tem é limitado no que ele permite que você faça, mas você tem trustd old gdb e um binário para engenharia reversa. 27 de abril de 13 às 3:13 Convenções usadas mais observações preliminares Eu estou cortando a saída de GDB para a brevidade desde que mostra geralmente os direitos reservados e a outra informação no início de toda a sessão. Quando eu reproduzir a saída Ill começar na primeira linha de prompt (gdb), ou no caso ou comandos auto-executados da primeira linha de saída genuína. Para distinguir comandos inseridos no prompt do GDB, estes terão um líder (gdb) como no mundo real. Para o comando do shell, este não será nenhum prefixo ou como ele parece ser a convenção na maioria dos sistemas unixóides. Quando eu uso um comando específico, como vim como meu editor, você está livre para usar o seu editor favorito, é claro. Seja emacs ou nano. Eu não vou julgá-lo) Primeiros passos Esta seção trata de configurar seu ambiente gdb e iniciar o processo. Ill também incluem alguns tidbits para os recém-chegados completa. Truques que você deve saber GDB tem um prompt agradável em que o cursor irá parar após o programa quebras ou sempre que você está pisando ou alguns tal. Pressionar RETURN (aka ENTER) depois de executar um comando GDB executará o mesmo comando novamente. Isso é útil quando você está passando por código com etapa ou próximo e simplesmente deseja continuar um por um. Os comandos podem ser abreviados desde que não sejam ambíguos. Para alguns dos comandos usados, existe uma abreviação particular que tem precedência apesar da ambigüidade: b para quebrar (apesar de bt e backtrace) c ou cont para continuar (apesar da captura e assim por diante) n para próxima (apesar ni e nexti) Você pode chamar Funções de biblioteca reais ou mesmo funções de dentro do programa depurado usando a chamada de comando. Isso significa que você pode experimentar o comportamento ou forçar o comportamento. Você pode iniciar o GDB com gdbtui ou gdb - tui para obter um - supostamente mais conveniente - mais visual interface de usuário de texto. Ele mostra o código fonte na parte superior eo prompt (gdb) abaixo. Você também pode alternar para esse layout executando o layout de comando src no prompt (gdb). O GDB tem um recurso de conclusão de linha de comando muito parecido com muitos shells, então use o Tab para sua vantagem e também certifique-se de usar a ajuda ou o keywordcommand de ajuda sempre que precisar de ajuda. Shell permite que você execute comandos no shell, para que você possa executar comandos de dentro de sua sessão do GDB. Durante o desenvolvimento um exemplo seria shell make. impressão. Examinar e exibir vários formatos (FMT) que você pode usar para tornar a saída mais legível. Quando a depuração de nível de origem você pode usar moldes de tipo C para exibir valores. Imagine uma string C atrás de um vazio (que GDB sabe graças aos símbolos em tal caso). Basta converter para (char) e imprimi-lo: print (char) variável. Como o processo é executado Como queremos analisar dinamicamente o binário, precisamos iniciá-lo primeiro. Linha de comando Podemos fazer isso diretamente da linha de comando, passando não apenas o caminho para o binário, mas também os argumentos com os quais queremos iniciá-lo. Todo o processo então se parece com isto: Fácil o suficiente. A partir do prompt (gdb), você pode emitir o comando run (abreviação r) para executar. exe com os parâmetros fornecidos na linha de comando. Eu prefiro este método, mas sua milhagem pode variar. GDB prompt Fire up GDB e no prompt (gdb) use o comando file para carregar o binário e, em seguida, use o comando run para iniciá-lo com os argumentos que você deseja passar: uma alternativa para o acima seria o uso de set args como Isto: Você também pode ver em qualquer caso quais argumentos serão passados ​​para o processo iniciado, emitindo um: btw: se você estivesse se perguntando sobre variáveis ​​de ambiente, use o comando de ajuda embutido do GDBs como conjunto de ajuda e ajuda. Ponteiros: definir ambiente VARNAMEVALUE e mostrar ambiente VARNAME e unset ambiente VARNAME. Phew, mas por que o programa pára com um SIGSEGV (falha de segmento) Bem, nós não sabemos ainda, mas parece que este pouco beasty quer o tratamento adequado. Desde que nós praticamos a computação defensiva, nós não queremos executar qualquer coisa que não sabemos muito sobre, direito Então vamos começar de novo. Se isso teria sido malware wed tem que limpar a máquina e reinstalar ou restaurar um instantâneo se é um hóspede VM. Primeiro, queremos executar o comando info da seguinte forma: Existem duas informações importantes, a mais relevante para nós é a linha indicando: tudo bem, então podemos definir um ponto de interrupção sobre aquele e então executar o processo com os argumentos que nós chique..gdbinit para a vitória Mas espere, isso está ficando tedioso já. Nenhum método fácil de automatizar essas etapas de alguma forma Como uma questão de fato não é. Um arquivo chamado. gdbinit pode ser usado para emitir comandos para o GDB durante a inicialização. Você também pode passar um arquivo com comandos do GDB usando o argumento - x na linha de comando (shell). Se eu tiver um número de projetos, geralmente eles estão em subpastas com um arquivo. gdbinit cada. Nota-lateral: - nx impede que o conteúdo. gdbinit seja executado durante a inicialização. Então nós sabemos quais argumentos queremos passar e nós sabemos o endereço do ponto de interrupção, isso traduz o seguinte arquivo. gdbinit: A saída que recebo quando começo o gdb sem outros argumentos é: Nice Mas isso parece diferente. Assembly e GDB Então você está acostumado a ver a próxima linha que você está indo para executar e, em seguida, seu fiel velho (gdb) prompt. Mas não existe tal coisa. Não temos fonte para este binário e, além disso, símbolos. Doh Então, nós contemplamos o cursor intermitente no prompt (gdb) e nos perguntamos o que fazer. Não se preocupe, GDB também pode lidar com o código de montagem. Único problema, o padrão é - na minha opinião - inconveniente ATAMPT assembly sintaxe. Eu prefiro o sabor da Intel e o seguinte comando diz ao GDB para fazer exatamente isso: Mostrar o código de montagem E como ele vai nos mostrar o código de montagem Bem, semelhante ao modo TUI (verifique a tag wiki para gdb) usando o seguinte Comando: e se você estiver tão inclinado, também: que também irá mostrar o conteúdo dos registros em uma visão geral. Vamos executá-lo novamente Então, acabamos com o seguinte. Gdbinit para os nossos propósitos: E quando começamos gdb sem argumentos acabamos com isso: Doce. Assim, podemos ver a desmontagem enquanto passamos pelo código. Podemos concluir isso aqui, mas é claro que há mais truques a serem aprendidos, então por que não ir um pouco mais longe. NOTA: os registos com fundo branco mostram que um valor mudou. Não muito significativo quando acabamos de iniciar o programa, mas poderoso útil ao pisar através de código mais tarde. Btw, se você preferir salvar propriedade de tela e tê-lo menos visual, começando com GDB 7.0 você pode usar: em versões GDB antes que você pode emular o comportamento por configurações de um display automático: ou mais curto dispi pc onde i é o formato, você Pode recordá-lo melhor pela instrução de pensamento e pc sendo o ponteiro de instrução, também conhecido como contador de programa - daí pc. Também é bom saber Às vezes, ao pisar através da montagem, as vistas regs e asm serão obtidas. Basta executar os respectivos comandos de layout novamente para restaurá-los à sua antiga glória: Depuração no nível de montagem Acontece quando você está no modo de montagem alguns dos comandos que você está acostumado a partir de depuração a nível de fonte simplesmente não funcionará. Isso faz sentido, porque uma linha de fonte única geralmente significa uma dúzia de instruções ou mais. O próximo e passo comandos, no entanto, têm nível de instrução contrapartes: nexti (estenografia ni. Qualquer outra pessoa pensando em arbustos) stepi (ta si) De nossa desmontagem acima sabemos: e para todos os efeitos práticos esta é a principal função. Claro que se você fosse reverter malware engenharia você deve ser mais cuidadoso, mas neste caso é. Então vamos adicionar um ponto de interrupção para este endereço (0x40f961) em vez do ponto de entrada: Se examinarmos (abreviação x) o código no qual estamos atualmente, podemos ver: Ok, a chamada é o que queremos seguir, então vamos passo Dentro dele usando si. Podemos ver outra chamada imediatamente no ponteiro de instrução ao inserir a função: A chamada nos leva a uma função que chama ptrace (PTRACETRACEME.). Agora, por que faria isso? Bem, é um velho truque anti-depurador que Mellowcandle descreveu em outro QampA aqui: Mas como podemos contorná-lo Quero ter de substituir a chamada para a função que chama ptrace () com nop ou algo assim Essas linhas. Este é o lugar onde GDB se torna um pouco pesado. Mas podemos usar o conjunto de modo a fazer a magia para nós. Deixa primeiro inspecionar os bytes de instrução: O 0xe8 é uma instrução de chamada e sabemos agora que é 5 bytes de comprimento. Então vamos nop isso. (X10b pc significa examinar 10 bytes no contador do programa - o formato padrão é hex já). Então fazemos enquanto parado em 0x40911f: e verifique o local corrigido: Excelente. Agora podemos executá-lo. Alternativas para o método dado alternativa para patching: conjunto 0x40911f 0x90909090 seguido pelo conjunto 0x409123 0x90 Manipular o contador de programa (ponteiro de instrução) em vez disso: conjunto pc5 ou o conjunto mais explícito pcpc5 jump pc5 Melhores maneiras ainda para manipularpartilhar o programa em execução Existem alternativas (e Maneira superior) métodos como este por Tavis Ormandy. Eu estou reproduzindo o macro de montagem abaixo (caso ele fique offline do outro lugar): Novamente o snippet de script acima não foi escrito por mim, mas por Tavis Ormandy - veja o link acima. Isso conclui este pequeno QampA.8.4 Formatos de saída Por padrão, o GDB imprime um valor de acordo com seu tipo de dados. Às vezes isso não é o que você quer. Por exemplo, você pode querer imprimir um número em hexadecimal ou um ponteiro em decimal. Ou você pode querer exibir dados na memória em um determinado endereço como uma seqüência de caracteres ou como uma instrução. Para fazer essas coisas, especifique um formato de saída quando você imprime um valor. O uso mais simples de formatos de saída é dizer como imprimir um valor já calculado. Isso é feito iniciando os argumentos do comando de impressão com uma barra e uma letra de formato. As letras de formato suportadas são: x Considere os bits do valor como um inteiro e imprima o inteiro em hexadecimal. D Imprimir como número inteiro em decimal assinado. U Imprimir como número inteiro em decimal não assinado. O Imprimir como um número inteiro em octal. T Imprimir como um inteiro no binário. A letra t significa dois. (2) um Imprimir como um endereço, tanto absoluto em hexadecimal e como um deslocamento do símbolo precedente mais próximo. Você pode usar este formato usado para descobrir onde (em que função) um endereço desconhecido está localizado: O símbolo de informação de comando 0x54320 produz resultados semelhantes. Veja o símbolo da informação da seção. C Considere como um número inteiro e imprima-o como uma constante de caractere. F Considere os bits do valor como um número de ponto flutuante e imprima usando a sintaxe típica de ponto flutuante. Por exemplo, para imprimir o contador de programas em hexadecimal (consulte a seção 8.10 Registros), digite Note que nenhum espaço é necessário antes da barra porque os nomes de comandos no GDB não podem conter uma barra. Para reimprimir o último valor no histórico de valores com um formato diferente, você pode usar o comando de impressão com apenas um formato e nenhuma expressão. Por exemplo, px reimprime o último valor em hex. GNU GDB Debugger Comando Cheat Sheet Compile com a opção - g (para a maioria dos compiladores GNU e Intel) que gera informações adicionadas no código do objeto para que o depurador possa corresponder a uma linha de código-fonte com O passo de execução. Não use a diretiva de otimização do compilador, como - O ou - O2, que reorganizam as operações de computação para ganhar velocidade, já que este reordenamento não corresponderá à ordem de execução no código-fonte e pode ser impossível segui-lo. Controlc: Parar a execução. Pode parar o programa em qualquer lugar, em sua fonte ou em uma biblioteca de C ou em qualquer lugar. Para executar um comando do shell: comando ou comando do shell Comando do GDB: Use a tecla TAB info bre TAB completará o comando resultando em pontos de interrupção de informações Pressione TAB duas vezes para ver todas as opções disponíveis se houver mais de uma opção disponível ou digite M-RETURN. De-Referencing STL Containers: A exibição de classes de contêineres STL usando o nome da variável p do GDB resulta em uma exibição enigmática de definições de modelo e ponteiros. Abreviatura do comando GDB: info bre RETURN funcionará como bre é uma abreviação válida para pontos de interrupção. Use o seguinte . Gdbinit arquivo (V1.03 091508). Agora funciona com o GDB 4.3. (Versões arquivadas: V1.01 GDB 6.4 apenas) Agradecimentos ao Dr. Eng. Dan C. Marinescu para permissão para publicar este script. Use os seguintes comandos fornecidos pelo script:

Comments

Popular Posts