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 ved strcmp.

  • 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:

1
gdb -q ./call_me_maybe

I GDB:

1
2
3
info functions strcmp
b strcmp@plt
run

Da programmet spurgte om passphrase, skrev jeg en dummy værdi (aaa). Breakpointet ramte ved kaldet til strcmp, og jeg dumpede argumenterne:

1
2
x/s $rdi
x/s $rsi

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:

1
DDC{ltr4c3_my_l1br4ry_c4lls}

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.