Inicialmente este blog foi criado para armazenar algumas dicas e links de UNIX/Linux, OpenVMS, linguagem C, Assembly, TCP/IP e nerdezas afins. No entanto devido ao autor ter abandonado o seu plano de ser um super hacker e dominar o mundo (devido esposa, família, filhos, trabalho), a partir de 2012 este blog tem um tipo de nerdeza mais light (Android, Linux, RetroPie (retrogames), produtividade, e por aí vai). Estas dicas raramente serão criações minhas.

Mostrando postagens com marcador assembly. Mostrar todas as postagens
Mostrando postagens com marcador assembly. Mostrar todas as postagens

quarta-feira, 1 de agosto de 2007

segunda-feira, 30 de julho de 2007

desassemblando para hexadecimal

Venci o desafio lançado a mim mesmo! Consegui uma maneira rápida de desassemblar uma função e ver os opcodes em hexadecimal! E nada de grep+sed, apenas o bom e velho shell script. Aí vai a solução:

#!/bin/bash

if [ $# -ne 2 ]; then
echo "Falta parametros!"
echo
echo "Uso: `basename $0` funcao programa"
echo
exit 1
fi

# a opcao -t do objdump mostra a tabela de simbolos do arquivo
# e eh lah que temos as informacoes sobre as funcoes do programa
# tais como endereco, tamanho, nome, etc...
# o grep procura a funcao que queremos na tabela de simbolos
LINHA=`objdump -t $2 | grep " $1$"` || {
echo "Erro!"
echo
echo "Nao existe a funcao \"$1\" no programa \"$2\""
echo
exit 1
}

# a variavel ENDERECO tem o endereco inicial e final da funcao
# mais infos sobre vetores em bash no meu texto de bashscripting
ENDERECO=(`echo $LINHA | cut -d' ' -f1,5`)

# a saida do objdump NAO coloca 0x no inicio dos numeros hexa
INICIO="0x${ENDERECO[0]}"

# o endereco final eh (inicio + tamanho_da_funcao)
# a conta eh feita dentro do $[ cifrao-colchetes ]
FIM="$[ $INICIO + 0x${ENDERECO[1]} ]"

# voilah! agora o golpe de misericordia:
objdump -j.text -d --start-address=$INICIO --stop-address=$FIM $2
Tá tá tá... não ficou lá muito elegante, mas é só pra quebrar um galho, né!

Um dia eu faço um mais bacana com getopts e talz...

sábado, 28 de julho de 2007

Livro: Programming From The Ground Up

Ótimo livro sobre os primeiros passos em programação assembly x86 para linux: http://savannah.nongnu.org/projects/pgubook

quinta-feira, 19 de julho de 2007

"Desassemblando" uma função de programa

Essa eu aprendi na man page do gdb. Achei útil para ver o endereço e o tamanho das instruçoões.

O parâmetro "-batch" executa o gdb no modo execução de comandos em lote. E o parâmetro "-x file" é o arquivo onde está os comandos a serem executados.

Por exemplo: veja o seguinte arquivo chamado disassmain.

disassemble main

disassemble é o comando do gdb que desassembla uma função

Agora execute o seguinte comando (supondo um programa chamado prog):

$ gdb -batch -x disassmain prog

Observe o resultado e veja que maravilha! ;-)

Agora eu fiz um script muito simples, porém interessante, que recebe como parâmetros na linha de comando o nome da funcao a ser "desassemblada" e o nome do programa. Chamei-o carinhosamente de mdisasm (meleu's disassembler):

#!/bin/bash
TMPFILE=/tmp/mdisasm.$$     # este '$$' retorna o PID do script em execucao

if [ $# -ne 2 ]; then       # $# eh o numero de argumentos (tem que ser 2)
   echo
   echo "uso: `basename $0` funcao programa
   echo
   exit 1
fi

cat << _EOF_ > $TMPFILE     # abaixo daqui ateh _EOF_ vai para $TMPFILE
disassemble $1
_EOF_

gdb -batch -x $TMPFILE $2

rm -f $TMPFILE

Isso é útil quando queremos ver o endereço de uma determinada instrução, seu tamanho e o seu mnemônico.

Agora para "desassemblar" uma única função e ver as instruções em hexadecimal (útil para escrita de shellcodes) eu ainda não achei uma solução. Ainda continuo usando 'objudump -d prog > arquivo.out' e depois lendo arquivo.out procurando a função desejada. Fica lançado um desafio pra mim mesmo. Queria uma solução simples, mas acho que terei que apelar para o grep+sed...


[Desafio vencido: http://mdicas.blogspot.com/2007/07/desassemblando-para-hexadecimal.html]

tags