Esta discussão foi arquivada. Não se pode acrescentar nenhum comentário. | | | Básicamente, o que isto significa é que estás a usar mais memória que aquela que te foi destinada. Se tiveres em atenção que a memória é uma coisa continua, apartir do momento em que escreves para além da tua área estás a escrever numa zona de memória de que nada conheces. Dependendo das permissões que tens, das permissões do processo que usa essa zona de memória que acedes que até pode ser o teu processo, tens resultados diferentes. Se calhar escreveres por cima do código do teu programa é fácil de perceber o que acontece, tudo que escreveres, será interpretado como código a executar. Agora, como explorar isso é que é mais complicado. Normalmente isso acontece quando guardas um tamanho fixo (por muito grande que possa parecer) para receber uma informação, como por exemplo 1000 bytes (ou letras) para guardar o primeiro nome de uma pessoa, deve chegar não achas? Mas, se alguém der conta que existe um limite e, que o que está depois desse bloco de dados é o bloco de código do teu programa, tudo que tem a fazer é escrever 1000 bytes de informação qualquer para preencher essa zona de dados que reservaste. Agora, se o programa for bem feito, não deixa ler mais dados, se tiver um erro (ou bug) vai deixar continuar a ler (pk provavelmente alguém nunca pensou na situação de ter mais de 1000 letras o nome de uma pessoa), e tudo que vier a seguir é código a ser executado, a ser executado com as permissões que este programa tem, o que se estiver como root ou, num sistema operativo sem distinção de privilégios (windows 9x) básicamente significa, poder fazer qualquer coisa. |
| | | | Nao percebo porque e' que o pessoal nao faz alguma pesquisa antes de ir perguntar coisas basicas para um forum geral: buffer+overflow+tutor ial echo '[dO%O+38%O+PO/d00]Fi22os0CC4BA64E418CE7l0xAP'|dc
|
| | | | por Anonimo Cobarde em 01-05-02 13:38 GMT (#5) |
| O comentario anterior foi moderado como "despropositado" ? Nao sei porque! Ca em Portugal continua a alimentar-se a politica do facilitismo e do menor esforco - NINGUEM se da ao trabalho de fazer qualquer tipo de pesquisa ou ter qualquer tipo de trabalho, as coisas tem de aparecer miraculosamente 'a frente dos olhos. "eu nao quero trabalhar, quero e' que os outros facam a pesquisa por mim e me facam resumos sublinhados depois. E isso DEPRESSA, pq sou um gajo mto ocupado e nao tenho tempo a perder. Afinal de contas, e' para isso que o resto do mundo existe, nao e'? Para trabalhar por mim." Well... DUH! |
| | | | hammm... da proxima nao incluo o link com a pesquisa do google -- poupei o gajo de escrever o URL e a pesquisa ;-)
echo '[dO%O+38%O+PO/d00]Fi22os0CC4BA64E418CE7l0xAP'|dc |
| | | | Concordo plenamente com o comentario ter sido despropositado pois revelaste a tua maravilhosa alma caridosa quando alguem te pergunta alguma coisa. Esse tipo de coisas pode ser banal para um programador comum, mas para um utilizador/programador principiante simplesmente não faz sentido. Acho que a pergunta "O que é um buffer overflow?" é uma pergunta perfeitamente valida e qualquer programador que se preze terá todo o prazer em explicar a quem pergunta, em português e trocado por miúdos; coisa que és capaz de não encontrar assim com tanta facilidade na net. Se não queres ajudar, não mandes abaixo só por gozo.
------------------------------------------ "You got to make it right this time, 'cause this time is all you have." prot , in K-PAX |
| | | | Se reparares ate' inclui o link com a pesquisa correcta no google -- tambem queres que o pessoal traduza as paginas para portuges ?
echo '[dO%O+38%O+PO/d00]Fi22os0CC4BA64E418CE7l0xAP'|dc |
| | | | Giro e' fazer essa pesquisa no Google, pedindo-a via translator do Babelfish.
Um exemplo: Excesso Do Amortecedor: Impeça excessos sabidos e desconhecidos do amortecedor (original: Buffer Overflow: Prevent known and unknown buffer overflows) Link ehehehe :-) -- Reading the FM |
| | | | Boa... :-)
echo '[dO%O+38%O+PO/d00]Fi22os0CC4BA64E418CE7l0xAP'|dc |
| | | | Apesar de concordar que, muitas vezes, as pessoas não tentam recolher informação antes de disparar com perguntas, não me parece que se possa aplicar da mesma forma a este caso, por dois motivos principais:
1 - não é trivial para alguem de fora da área informática compreender o principio de um buffer overflow, o problema das buscas, no google ou qq outro sitio, é a de obteres excesso de informação, não compilada. A partir do momento que se conhece por alto um assunto é extraordinariamente mais facil procurar coisas sobre ele em qq lado!
2 - Uma pergunta sobre um assunto interessante como é o dos buffer overflows poderia/deveria degenerar numa interessante discussão sobre o caso, emq ue todos, até os que já sabem tudo, poderiam apreender. Apesar de utopico parece-me que é esse um dos grandes objectivos do gildot!
Enfim, isto se calhar sou só eu que ainda não percebi para que serve esta coisa!!! Numa discussão de um assunto, apaixonante acho eu, como é o dos buffer overflows, temos 15 threads, 7 das quais (onde incluo a minha) não teem nada a haver com o assunto! Cumprimentos! zp |
| | | | Existem vários tipos de buffer overflows. Stack e Heap overflow por exemplo. O mais conhecido é mais fácil de "exploitar" são normalmente os Stack Overflows. O objectivo é alocar na memória reservada da variavél/função/you name it muita mais informação do que ele pode gerar.Por exemplo: Toma por exemplo o seguinte programa em C: ----- void main() { char big_string[100]; char small_string[50]; memset(big_string,0x41,100); strcpy(small_string,big_string); } ------ Caso compiles este programa e o corras irás obter o famoso erro "SEGMENTATION FAULT (Core dumped)" . E porque ? Porque copiamos (strcpy(small_string,big_string);) o buffer da variavel big_string cheia de 'A'(41 em hex) até 100(memset(big_string,0x41,100); ) para o vector small_string que apenas "aguenta" 50..e o erro segmentation fault ocorre. Devo admitir que secalhar isto poderá um bocado confuso,também nunca fui bom professor hehe :).Mas a beleza disto é transformar o lixo em shellcode que irá dar instruções a máquina sobre o que possamos querer fazer (entre aspas). Isto não é nenhum tutorial portanto não irei mais longe. No entanto já existem ferramentas bastantes boas , librarias para Linux e não só que impedem a ocorrência de utilização de exploits,normalmente estão a "vigiar" a memória para qualquer tentativa de execução de comandos arbitrários. Existe um bom artigo na www.phrack.com~nº 56 : http://www.phrack.org/show.php?p=56&a=14 para entrar em mais detalhes sobre este assunto.
"..UNIX was not designed to stop you from doing stupid things, because that would also stop you from doing clever things..." |
| | | | | A tradução correcta de "libraries" para português é "bibliotecas" e não "librarias" (que não existe sequer... quanto mais poderia ser "livrarias" o que também estaria errado). É frequente traduzir os termos em inglês para palavras do português parecidas foneticamente com as inglesas, e esquece-se o significado das palavras. Por um lado ajuda a associar mais facilmente os termos em portugues com os ingleses, mas por outro lado estamos a alterar o significado das palavras o que não é muito correcto... Um dos erros mais frequentes é a tradução de "default" para "por defeito", quando o mais correcto é "por omissão". Cumprimentos, Bruno Gravato. |
| | | | Falando nisso, tb é off-topic, mas não há nenhum dicionário com os termos correctos por aí à solta? Por várias vezes, a comentar código recorro às palavras em inglês pq simplesmente algumas coisas são mesmo difíceis de traduzir. Só para me habituar a dizer disco rígido em vez de disco duro... ---- //\anuel /|zevedo |
| | | | | A linguagem C (e muitas outras) são fundamentalmente linguagens procedimentais. Permitem o uso de funções para decompor uma tarefa em várias tarefas mais simples. Quando um programa está a executar e chama uma função para executar uma tarefa, precisa de saber o sítio do programa para onde voltar após executar a função. Precisa também de passar parâmetros que sejam necessários para essa função realizar a sua tarefa. Uma das formas de o fazer é utilizar uma área da memória, que podemos chamar de stack, onde essas informações são guardadas. Acontece que o stack é também utilizado pelos programas como uma área de armazenamento de dados temporários (variáveis locais), que pode ser usada para tratamento de dados fornecidos pelo utilizador. Quando o programa não gere bem esse espaço e os dados do utilizador, estes podem sobrepôr-se aos dados com informação sobre o fluxo de controlo do programa (a tal informação que diz para onde o programa regressa após ter executado a função). Um utilizador pode introduzir dados com um formato que alteram essa informação, e indicam ao programa um local onde se deve continuar a executar. E pode ser qualquer local, inclusive a área do stack onde estão os dados introduzidos pelo utilizador :) Código e dados são basicamente o mesmo: informação. Os dados que o utilizador introduz e que aparentam ser lixo, podem representar um programa válido quando executados. Agora surge outro problema: quando esse código é executado corre com as permissões que o sistema operativo impõe, geralmente as permissões do utilizador. Tudo o que o utilizador pode fazer, o código malicioso também pode. As possibilidades são ilimitadas :) Isto foi uma explicação algo básica, porque existem várias formas de fazer o mesmo, variações entre arquitecturas de sistema, e vários detalhes que precisam de ser contornados para isto funcionar, mas acho que dá uma ideia geral de como funciona. Para uma explicação mais detalhada podes ler este texto, mas precisas de ter conhecimentos de programação e assembly. |
| | | | | Alguém pode mandar este texto para a Microsoft?
"No comments" |
| | | | Cumprimentos, O dia foi longo, e o sono aperta, mas penso que consegui ilustrar um pouco o que disseste, em https://mail.projecto-oasis.cx/Lists/seguranca/Message/241.html. Cordialmente, Sérgio Araújo 3G - NetWorks Projecto Oásis "All things being equal, the simplest answer is the correct one." |
| |
|