Um arquivo "core" é gerado automaticamente pelo sistema. Seria uma representação do conteúdo de memória quando ocorre o erro. Se o buffer não foi estourado, limite ele com comando:
ulimit -c 99999
e tente provocar a falha novamente...
Estourado o buffer vamos ler o core, isso pode ser feito com GDB. Se não estiver instalado no seu sistema, pode ser obtido com apt-get, emerge, pacman, yum ou seu gerenciador de pacotes predileto. Depende da sua distro, no meu caso o GDB veio como padrão no Slackware, instalei a versão "full".
Continuando, dê o comando:
gdb programa core
Feito isso ele mostrará várias informações, entre elas um "Main":
#0 0x080483ff in main()
É o que nos interessa, pois esta linha nos mostra o primeiro ponteiro ou registrador fora do segmento de memória do buffer afetado, no nosso caso o registrador "EIP".
O endereço pode variar dependendo do sistema e de como o código foi escrito...
[3] Comentário enviado por DSerafim em 04/09/2008 - 14:29h
O artigo está muito bom. :-)
Eu no final do artigo encontrei uma coisa que acho que não está bem. Posso estar enganado, mas o código ASCII do carácter A acho que não é 41 e sim 65.
Eu experimentei fazer tudo como disses-te e a mim aparece sempre esta linha:
#0 0x32313039 in ?? ()
Nunca me apareceu uma linha idêntica à tua:
#0 0x080483ff in main()
O SO que experimentei foi slackware também, será que alguém me podia explicar porque acontece isto, gostava de perceber um pouco mais deste assunto.