Filer: Download challenge files
Writeup: Fear of long words
Indledende Observationer
Jeg fik udleveret en 32-bit ELF binær samt kildekoden. Servicen kunne tilgås via:
| |
Ved første forbindelse blev følgende interface præsenteret:
| |
Programmet fungerede som en simpel ordbog hvor man kunne:
add <length>– tilføje et ordshow– vise alle gemte ordexit– afslutte programmet
Binæren var:
ELF32
x86
Dynamisk linket
Kompileret med GCC
Recon / Kortlægning
Ved gennemlæsning af koden fandt jeg følgende funktion:
| |
Her allokeres en lokal stack-buffer:
| |
Men input-længden styres fuldstændigt af brugeren:
| |
Der blev ikke foretaget bounds-check på length.
Dette betyder, at hvis length > 64, vil vi overskrive stacken.
Analyse
Stack-layout (forenklet):
| |
Ved at give en længde større end 64 kan vi:
Overwrite buffer
Overwrite saved EBP
Overwrite return address (EIP)
Disassembly viste at buffer lå på:
| |
Return address ligger på:
| |
Offset til EIP:
| |
Så:
- vi kan overwrite EIP med 80 bytes padding
Identifikation af win()
I binæren fandtes en funktion:
| |
Adresse:
| |
Little-endian repræsentation:
| |
Funktionen printer flaget direkte.
Angrebet
Payload-konstruktion:
| |
Da programmet kræver:
| |
skal length svare til payloadens størrelse.
Endelig exploit:
| |
Flaget
Ved kørsel af exploit fik jeg:
| |
Konklusion
Sårbarheden var en klassisk stack buffer overflow i en 32-bit ELF binær, hvor brugerinput blev læst ind i en fast stack-buffer uden bounds-check.
Ved at beregne korrekt offset (80 bytes) kunne jeg overskrive returadressen og redirecte execution til win()-funktionen.
Exploiten var en simpel ret2win uden behov for ROP eller bypass af stack protection.