Buffer Overflow: Entendendo e explorando
Neste artigo venho explicar de forma direta e com exemplos práticos como funciona um buffer overflow.
Parte 3: Tentando estourar o buffer com chutes
Vamos tentar estourar o buffer com chutes:
./programa (executando o programa)
0123456789 (dê estes números para o programa)
Deu em nada, que coisa não? Vamos chutar um número maior:
./programa
$ 012345678901234567891234 (24 caracteres)
Deu um erro no programa -> (Core Dumped)
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...
./programa (executando o programa)
0123456789 (dê estes números para o programa)
Deu em nada, que coisa não? Vamos chutar um número maior:
./programa
$ 012345678901234567891234 (24 caracteres)
Deu um erro no programa -> (Core Dumped)
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...