Como desativar a otimização do compilador gcc para ativar o estouro de buffer

Estou trabalhando em um problema de lição de casa que requer a desativação da proteção de otimização do compilador para que ele funcione. Estou usando o gcc 4.4.1 no Ubuntu Linux, mas não consigo descobrir quais são os sinalizadores certos. Eu percebo que é dependente de arquitetura – minha máquina roda com processador Intel de 32 bits.

Obrigado.

    Isso é um bom problema. Para resolver esse problema, você também terá que desabilitar o ASLR, caso contrário o endereço de g () será imprevisível.

    Desativar ASLR:

    sudo bash -c 'echo 0 > /proc/sys/kernel/randomize_va_space' 

    Desativar canários:

     gcc overflow.c -o overflow -fno-stack-protector 

    Depois que canários e ASLR são desativados, deve ser um ataque direto como os descritos em Smashing the Stack for Fun e Profit

    Aqui está uma lista de resources de segurança usados ​​no ubuntu: https://wiki.ubuntu.com/Security/Features Você não precisa se preocupar com NX bits, o endereço de g () sempre estará em uma região executável de memory porque está dentro do segmento de memory TEXT. Os bits do NX só entram em ação se você estiver tentando executar o shellcode na pilha ou no heap, o que não é necessário para essa atribuição.

    Agora vá e espante esse EIP !

    Urm, todas as respostas até agora foram erradas, com a resposta de Rook sendo correta.

    Entrando:

     echo 0 | sudo tee /proc/sys/kernel/randomize_va_space 

    Seguido por:

     gcc -fno-stack-protector -z execstack -o bug bug.c 

    Desabilita ASLR, SSP / Propolice e NoneXec do Ubuntu (que foi colocado em 9.10, e bastante simples de contornar, veja a técnica mprotect (2) para mapear páginas como executáveis ​​e jmp) deve ajudar um pouco, entretanto esses “resources de segurança” são não significa infalível. Sem o sinalizador “-z execstack”, as páginas têm marcações de pilha não executáveis.

    Em distros mais novas (a partir de 2016), parece que o PIE está habilitado por padrão, então você precisará desativá-lo explicitamente durante a compilation.

    Aqui está um pequeno resumo dos comandos que podem ser úteis ao jogar localmente com exercícios de estouro de buffer em geral:

    Desativar canário:

     gcc vuln.c -o vuln_disable_canary -fno-stack-protector 

    Desativar DEP:

     gcc vuln.c -o vuln_disable_dep -z execstack 

    Desativar TORTA:

     gcc vuln.c -o vuln_disable_pie -no-pie 

    Desative todos os mecanismos de proteção listados acima (aviso: somente para testes locais):

     gcc vuln.c -o vuln_disable_all -fno-stack-protector -z execstack -no-pie 

    Para máquinas de 32 bits, você precisará adicionar o parâmetro -m32 também.

    Tente o -fno-stack-protector .

    Eu sei que é um segmento antigo, mas quero salientar que você não precisa desabilitar o ASLR para fazer um estouro de buffer! Embora o ASLR esteja Enabled (kernel_randomize_va_space = 2), ele não entrará em vigor a menos que o executável compilado seja PIE, portanto, a menos que você tenha compilado seu arquivo com o sinalizador -fPIC -pie, o ASLR não entrará em vigor.

    Eu acho que apenas desabilitar os canários com -fno-stack-protector é suficiente. Se você quiser verificar se o ASLR está funcionando ou não (o código independente de posição deve ser definido), use: hardening-check executable_name

    Não citarei a página inteira, mas todo o manual sobre otimização está disponível aqui: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#Optimize-Options

    Dos sons que você quer, pelo menos, -O0 , o padrão e:

    -fmudflap -fmudflapth -fmudflapir

    Para front-ends que o suportam (C e C ++), instrumentam todas as operações de desreferenciamento de ponteiro / matriz arriscadas, algumas funções de cadeia / heap de biblioteca padrão e algumas outras construções associadas com testes de intervalo / validade. Módulos assim instrumentados devem ser imunes a estouro de buffer, uso de heap inválido e algumas outras classs de erros de programação C / C ++. A instrumentação depende de uma biblioteca de tempo de execução separada (libmudflap), que será vinculada a um programa se -fmudflap for fornecido no momento do link. O comportamento em tempo de execução do programa instrumentado é controlado pela variável de ambiente MUDFLAP_OPTIONS. Veja env MUDFLAP_OPTIONS = -help a.out para suas opções.