Filer: Download challenge files
Writeup: Call Me Maybe
Indledende Observationer
Jeg fik udleveret en fil ved navn call_me_maybe, som ved afvikling bad om en passphrase til en “NoTech Security Terminal”. Ved forkert input gav programmet en tydelig hint-tekst:
Hint: Maybe you should trace the calls...
Jeg åbnede binæren i Detect It Easy og så, at det var en ELF64 Linux-binary (AMD64), så den skulle køres og analyseres i et Linux-miljø (f.eks. via WSL/VM).
Recon / Kortlægning
Jeg startede med let reverse i IDA og fandt main()-logik:
Programmet læser input med
fgets, fjerner newline, og sammenligner med en intern streng vedstrcmp.Den interne streng blev konstrueret/det dekodet i runtime (bl.a. via SSE-load og XOR), men i praksis ender alt i et
strcmp(input, secret).
Det gjorde det oplagt at hente “secret” direkte fra runtime ved at breakpoint’e på strcmp.
Analyse
Den centrale “svaghed” (i CTF-forstand) er, at programmet i runtime har passphrasen i klartekst i memory og kalder:
strcmp(user_input, decoded_secret)
Derfor kan jeg med en debugger stoppe lige før sammenligningen og aflæse argumentet for den korrekte streng.
Angrebet
Binæren var stripped, så main var ikke tilgængelig som symbol i GDB. I stedet satte jeg breakpoint på strcmp@plt.
Kommandoer:
| |
I GDB:
| |
Da programmet spurgte om passphrase, skrev jeg en dummy værdi (aaa). Breakpointet ramte ved kaldet til strcmp, og jeg dumpede argumenterne:
| |
Outputtet viste:
$rdi= min input:"aaa"$rsi= den forventede passphrase/flag:
"DDC{ltr4c3_my_l1br4ry_c4lls}"
Flaget
Flaget blev læst direkte fra $rsi ved strcmp-kaldet:
| |
Konklusion
Jeg udnyttede at programmet sammenlignede brugerinput med en dekodet secret-streng via strcmp. Ved at breakpoint’e på strcmp@plt i GDB kunne jeg dumpe den hemmelige streng direkte fra process memory og dermed få flaget.