0Pricing
Cyber Security Academy · Aula

Vulnerabilidades de Strings de Formatação

Explore strings de formatação do printf para ler memória arbitrária e escrever em endereços arbitrários.

Vulnerabilidades de Strings de Formatação é uma aula grátis de Cyber Security Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Cyber Security Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Cyber Security Academy inclui 4 aulas no total.

O que é uma vulnerabilidade de cadeia de formato?

Uma vulnerabilidade de cadeia de formato ocorre quando a entrada do usuário é passada diretamente como argumento da cadeia de formato para printf() ou funções semelhantes. O invasor pode ler a memória, vazar endereços da pilha e escrever valores arbitrários.

O padrão vulnerável

Vulnerável versus seguro:

// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);

// SAFE - user input is a data argument:
printf("%s", user_input);

Lendo a memória com %x e %p

Especificadores de formato sem argumentos correspondentes leem valores da pilha:

# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!

Contornando o ASLR com vazamentos de cadeias de formato

A pilha geralmente contém ponteiros para a biblioteca C, a pilha e o binário. Ao vazar esses ponteiros com os especificadores %p ou %lx, um invasor pode calcular os endereços base e derrotar o ASLR — mesmo sem nenhuma outra vulnerabilidade.

Lendo memória arbitrária com %s

%s trata o valor da pilha como um ponteiro e exibe a cadeia de caracteres nesse endereço. Ao posicionar o endereço-alvo na posição correta da pilha e usar o acesso a parâmetros (%7$s), um invasor lê locais arbitrários da memória.

# Direct parameter access:
printf("%7$s")  # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memory

Escrevendo na memória com %n

%n escreve o número de caracteres impressos até o momento no endereço apontado pelo argumento correspondente. Isso permite escrever valores controlados em endereços arbitrários — podendo sobrescrever ponteiros de função ou endereços de retorno.

Técnica prática de escrita

Para escrever um valor específico usando %n:

  1. Controle um ponteiro na pilha que aponte para o endereço-alvo
  2. Use %Xc%N$n para escrever X caracteres e, em seguida, escreva a contagem no N.º parâmetro (o endereço-alvo)

Ferramentas como pwntools automatizam a construção de explorações de cadeias de formato.

Encontrando falhas de cadeia de formato

Testando vulnerabilidades de cadeia de formato:

# Test inputs:
%x.%x.%x
%p.%p.%p
%s%s%s
AAAA.%p.%p.%p.%p (looking for 0x41414141 in output)

# Automated testing with fuzzer:
python3 -c "print('%p.' * 20)" | ./vuln

Defesa: corrija o código

A correção é simples: sempre passe a entrada do usuário como um argumento de dados, nunca como a cadeia de formato.

// WRONG:
printf(buffer);

// RIGHT:
printf("%s", buffer);

// Compiler warning:
// gcc -Wformat-security will flag this

Cadeias de formato em outras linguagens

Vulnerabilidades de cadeia de formato ocorrem em várias linguagens:

  • C: printf(input)
  • Python: não é igual — mas a formatação com % usando uma entrada de dicionário pode expor variáveis
  • Java: String.format(input) — menos perigosa, sem acesso à memória

Exemplos do mundo real

Falhas de cadeia de formato afetaram:

  • ProFTPD — permitia execução remota de código por meio de comandos FTP
  • WU-FTPD — exploração remota com privilégios de administrador por meio de cadeias de formato
  • Vários serviços do Linux anteriores aos anos 2000

Compiladores modernos e FORTIFY_SOURCE ajudam, mas não eliminam completamente essa categoria.

Verificação rápida: cadeias de formato

Qual especificador de formato pode ser usado para escrever em um endereço arbitrário da memória em um ataque de cadeia de formato?

Recapitulação da lição

Vulnerabilidades de cadeia de formato ocorrem quando a entrada do usuário é usada diretamente como uma cadeia de formato de printf. %p/%x vaza a memória da pilha; %s lê endereços arbitrários; %n escreve em endereços arbitrários. A correção consiste em um único caractere: printf("%s", input). Ative -Wformat-security nas opções do compilador para detectar esses problemas.

Perguntas Frequentes

A aula “Vulnerabilidades de Strings de Formatação” é grátis?

Sim — o texto completo de “Vulnerabilidades de Strings de Formatação” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Cyber Security Academy, atualize para CoddyKit PRO. O curso de Cyber Security Academy inclui 4 aulas no total.

O que vou aprender em “Vulnerabilidades de Strings de Formatação”?

Explore strings de formatação do printf para ler memória arbitrária e escrever em endereços arbitrários. Você pratica Cyber Security Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Cyber Security Academy?

Nenhuma experiência prévia é necessária. Cyber Security Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Vulnerabilidades de Strings de Formatação”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Cyber Security Academy?

Sim. Cada aula de Cyber Security Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Transbordamentos de Buffer na Pilha
  2. Programação Orientada a Retorno (ROP)
  3. Vulnerabilidades de Strings de Formatação
  4. Exploração do Heap: Use-After-Free e Heap Spraying
← Voltar para Cyber Security Academy