$ ./rce.sh
[+] Checking credentials: Anders Kusk
[+] OSCP Cert loaded
[+] OSCE Cert loaded
[+] Parsing cv.bin
0x00002007: 4461 6e69 7368 2050 6f6c 6963 652c 204f 6666 6963 6572 2020 2020 2020 2020 200a Danish Police, Officer .
0x00002018: 5444 432c 2049 6e74 6572 6e61 6c20 5065 6e74 6573 7465 7220 2020 2020 2020 200a TDC, Internal Pentester .
0x00002019: 496d 7072 6f73 6563 2c20 5365 6375 7269 7479 2041 6476 6973 6f72 2020 2020 200a Improsec, Security Advisor .
[=] Loading externals
-> mutt -s "Hello" a@rce.sh < /dev/null
-> curl -v https://www.linkedin.com/in/anders-kusk
-> curl -v https://github.com/kusk/
-> curl -v https://twitter.com/anderskusk
^C
$ echo return to root
$ cat ./ctf/NC3CTF2017 – Opgave 4 – Tys Tys.md

NC3CTF2017 – Opgave 4 – Tys Tys

> 05/05/18

Lavet af undertegnede

Fredag morgen kl. 7 mødte professor Tournesol ind på laboratoriet, hvor han arbejdede. Bag arbejdsbordet med softice-centrifugen fandt han en stærkt blødende professor Lennardo. Lennardo var såret, og gerningsmanden var flygtet. Før Lennardo udåndede, nåede han at remse en hemmelig cifferkode op: 3,2,0,4,2,2,5,0,6,7,10,9,11,2,1,11,0,7,10,6,10,8,9,0,6,7,10,9,11,2,1,11. Og med sit livs sidste kræftanstrengelser pegede han mod skuffe 3, hvor et USB-medie lå gemt. I skuffen lå ligeledes en seddel med teksten: “Jeg har for en sikkerhedsskyld nullet programmet.”

På USB-mediet fandt Tournesol et program, og programmet gemte på en besked(flaget), der kunne redde verdenen!

Anvendt software: gdb

Indledende tog jeg et kig på filen med file. En stripped 64-bit linux binær ELF(program) fil.

Eksekverer vi filen får vi 32 “_” tegn printet til terminalen. Kigger vi på opgaveteksten ser vi, at der i den hemmelige cifferkode er 32 tal. Så allerede her kan vi begynde at gætte os til hvad programmet måske gør.

Lad os starte programmet i GDB og eftersom vi ved, at programmet printer de 32 “_”‘er til skærmen kan vi jo sætte et catchpoint på netop dette syscall. Et printf syscall har under 64bit Linux nummeret “1”.

Lidt om syscalls:

Når et program skal eksekverer et syscall, f.eks. sys_write(printf) vil det før kaldet sætte visse CPU-registre op. F.eks. vil selve syscall nummeret(1) bliver flyttet til rax/eax via “mov eax, 0x1”. Hvilket output(stdout 1) bliver flyttet til rdi/edi via “mov edi, 0x1”, hvad der printes bliver sat i esi/rsi via “mov esi, msg”, osv.

Når vi eksekverer programmet i GDB stopper det ved første catchpoint. Her kan vi se, at programmet vil printe “_” 32 gange(rsi/esi) til stdout(rdi/edi) og at syscall nummeret bliver sat med “mov eax,0x1”.

Tager vi et kig i stacken ved vores catchpoint kan vi se noget data der ser lidt anderledes ud: “_L3WNDPRATEZ_L3WNDPRATEZ”.

Vi kan ligeledes se et loop i assemblykoden før syscall. Så måske denne tekst skal køres op imod vores cifferkode? Hvis vi antager at programmet af ukendte årsager har placeret teksten to gange efter hinanden i stacken kan vi nøjes med halvdelen af teksten: “L3WNDPRATEZ”. I cifferkoden kan vi se tal mellem 0 og 11(12 forskellige) hvilket også er antallet af tegn i vores tekst i stacken. Så et “0” er lig med tekst[0] = “”, “1” bliver tekst[1]=”L”, osv.

Med denne viden kan vi finde frem til flag: W3_N33D_PRETZ3LZ_REPEAT_PRETZ3LZ