Sårbarheter i formatsträngar
Exploatera printf-formatsträngar för att läsa godtyckligt minne och skriva till godtyckliga adresser.
Sårbarheter i formatsträngar är en gratis lektion i Cyber Security Academy på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Cyber Security Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.
Vad är en sårbarhet i formatsträngar?
En sårbarhet i formatsträngar uppstår när användarindata skickas direkt som formatsträngsargument till printf() eller liknande funktioner. Angriparen kan läsa minne, läcka stackadresser och skriva godtyckliga värden.
Det sårbara mönstret
Sårbart kontra säkert:
// VULNERABLE - user controls the format string:
printf(user_input);
fprintf(stderr, user_input);
// SAFE - user input is a data argument:
printf("%s", user_input);Läsa minne med %x och %p
Formatspecifikationer utan motsvarande argument läser värden från stacken:
# Input: %p.%p.%p.%p.%p
# Output: 0x7ffd12345678.0x400580.0x0.0x1.0x7f3a...
# Each %p prints the next value off the stack - leaking addresses!Kringgå ASLR med formatsträngsläckor
Stacken innehåller ofta pekare till libc, stacken och binärfilen. Genom att läcka dessa med formatspecifikationerna %p eller %lx kan en angripare beräkna basadresser och kringgå ASLR — även utan någon annan sårbarhet.
Läsa godtyckligt minne med %s
%s tolkar stackvärdet som en pekare och skriver ut strängen på den adressen. Genom att placera måladdressen på rätt position i stacken och använda parameteråtkomst (%7$s) kan en angripare läsa godtyckliga minnesadresser.
# Direct parameter access:
printf("%7$s") # prints string at 7th stack parameter
# If 7th param is an address you control, reads that memorySkriva minne med %n
%n skriver antalet tecken som hittills har skrivits ut till den adress som motsvarande argument pekar på. Detta gör det möjligt att skriva kontrollerade värden till godtyckliga adresser — vilket potentiellt kan skriva över funktionspekare eller returadresser.
Praktisk skrivteknik
Så här skriver man ett specifikt värde med %n:
- Kontrollera en pekare på stacken som pekar på måladdressen
- Använd
%Xc%N$nför att skriva X tecken och skriv sedan antalet till den N:te parametern (måladdressen)
Verktyg som pwntools automatiserar konstruktionen av formatsträngsexploitar.
Hitta formatsträngsbuggar
Testa om det finns sårbarheter i formatsträngar:
# 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)" | ./vulnFörsvar: korrigera koden
Lösningen är trivialt enkel: skicka alltid användarindata som ett dataargument, aldrig som formatsträngen.
// WRONG:
printf(buffer);
// RIGHT:
printf("%s", buffer);
// Compiler warning:
// gcc -Wformat-security will flag thisFormatsträngar i andra språk
Sårbarheter i formatsträngar förekommer i många språk:
- C:
printf(input) - Python: inte samma sak — men formatering med
%och dict-indata kan exponera variabler - Java:
String.format(input)— mindre farligt, ingen minnesåtkomst
Exempel från verkligheten
Formatsträngsbuggar har påverkat:
- ProFTPD — möjliggjorde fjärrkörning av kod via FTP-kommandon
- WU-FTPD — möjliggjorde en fjärrinriktad root-exploit via formatsträngar
- Olika Linux-daemoner före 2000-talet
Moderna kompilatorer och FORTIFY_SOURCE hjälper, men eliminerar inte sårbarhetsklassen helt.
Snabbkontroll: formatsträngar
Vilken formatspecifikation kan användas för att skriva till en godtycklig minnesadress i en formatsträngsattack?
Sammanfattning av lektionen
Sårbarheter i formatsträngar uppstår när användarindata används direkt som formatsträng i printf. %p/%x läcker stackminne; %s läser godtyckliga adresser; %n skriver till godtyckliga adresser. Lösningen är ett enda tecken: printf("%s", input). Aktivera -Wformat-security i kompilatorflaggorna för att upptäcka dessa problem.
Lär dig Cyber Security Academy med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 76
- Lektioner
- 303
Vanliga frågor
Är lektionen ”Sårbarheter i formatsträngar” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Cyber Security Academy, inklusive ”Sårbarheter i formatsträngar”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Cyber Security Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Sårbarheter i formatsträngar”?
Exploatera printf-formatsträngar för att läsa godtyckligt minne och skriva till godtyckliga adresser. Ni övar på Cyber Security Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Cyber Security Academy?
Du behöver inga förkunskaper. Utbildningen i Cyber Security Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Sårbarheter i formatsträngar”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Cyber Security Academy-lektionen?
Ja. Varje Cyber Security Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Stackbaserade buffertöverflöden
- Return-Oriented Programming (ROP)
- Sårbarheter i formatsträngar
- Heapexploatering: use-after-free och heap spraying