HOLOGY mengangkat tema, “iTech : Evolve Innovative Thinking for Millenials to Face Technology Growth in 4.0 Industrial Era. Adapun Capture the Flag adalah sebuah kompetisi di bidang keamanan informasi. Istilah CTF juga digunakan dalam dunia komputer, yang merupakan event yang bersifat game dan edukasi di bidang teknologi sekuriti komputer.

Resource dan writeup lainnya dapat dilihat di sini

๐Ÿ”— Green Milky Ways

Jika fotografer bisa membuat beberapa foto tajam dari satu foto dan menjualnya secara personal. Ia akan melakukannya. Terkadang profit lebih penting dari value secara utuh. Bagaimana menurutmu?

Diberikan file attachment berupa alice.zip dan enc.pyc, dimana ZIP file memuat sekumpulan ImageFile hasil eksekusi dari program enc.py. Untuk mengetahui mekanisme yang terjadi, dilakukan proses dekompilasi dengan bantuan uncompyle6.

preview-7
$ uncompyle6 enc.pyc
from PIL import Image

def crop(image_path, coords, saved_location):
    image_obj = Image.open(image_path)
    cropped_image = image_obj.crop(coords)
    cropped_image.save(saved_location)
    cropped_image.show()


if __name__ == '__main__':
    l = 0
    for k in range(20):
        j = 0
        for i in range(20):
            image = 'Done.png'
            name = 'foto' + str(k) + '_' + str(i) + '.png'
            crop(image, (j, l, j + 80, l + 80), name)
            j += 80

        l += 80

Berdasarkan snippet-code tersebut, diketahui bahwa terdapat suatu ImageFile Done.png yang menjadi acuan pemrosesan dari ImageCropping dengan inisialisasi offset x,y=(0,0). Kemudian dilakukan nested-loops dengan total 400 iterasi untuk memotong instance image dengan dimensi 80x80. Adapun untuk masing-masing iterasi yang dijalankan, dilakukan filename assignment dengan format foto[i]_[k].png dengan i merupakan iterasi secara horizontal & k merupakan iterasi secara vertical.

Merujuk pada skema tersebut, dilakukan proses re-mapping untuk menyatukan keseluruhan potongan gambar yang ada. Adapun proses ini Kami lakukan dengan script sebagai berikut

# solve.py
#!/usr/bin/env python2
from numpy import *
from PIL import Image

imgOpen = lambda x : array(Image.open(x))
filename = 'alice/foto{}_{}.png'
images = []

for __ in range(20):
	instance = map(lambda _ : filename.format(__,_),range(20))
	images.append(hstack(map(imgOpen, instance))) 

full = vstack(images)
Image.fromarray(full).save('flag.png')
$ python2 solve.py

$ /bin/convert -flip -flop flag.png flag.png

Hasilnya diperoleh representasi image yang merupakan flag yang diminta

preview-1

FLAG : hctf{l3Ts_Mak3_a_Scr1pt_f0r_Thi5_ChalLange}

๐Ÿ”— Putra Petir dalam Gelombang I’eau

Negeri I’eau sangat terkenal dengan gelombang-gelombang pasang laut yang menakutkan. konon katanya, gelombang itu dapat merusak apa saja yang menghampirinya.
Anton mengirimkan suatu hal yang begitu rahasia menuju negeri tersebut. Namun, hal tersebut rusak dibuatnya. Bisakah kamu melihat hal rahasia tersebut?

Diberikan file attachment berupa Poetra_Petir.exe. Setelah ditelusuri lebih terlanjut, binary file yang diberikan merupakan sebuah audio file yang dapat dianalisis dengan bantuan Audacity

$ file Poetra_Petir.exe
Poetra_Petir.exe: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, mono 48000 Hz
preview-2

Akan tetapi, komposisi sample wave yang ada cenderung terkuantisasi & terdistribusi secara teratur. Hal yang sama juga berlaku ketika dilakukan pengecekan terhadap fmt CHUNK, dimana tidak terdapat keanehan pada hierarchy RIFF file.

Beberapa saat kemudian, panitia mengeluarkan hint berupa gelombang TV yang secara tidak langsung mendeskripsikan ragam dari Slow-scan television (SSTV). Setelah beberapa penelusuran, digunakan Virtual Cable driver sebagai dummy output untuk menerima transmisi penyiaran audio dari Music Player. Dalam konteks ini, Kami menggunakan VLC player sebagai media penyiaran & RX-SSTV sebagai media decipher transmisi sinyal. Adapun berikut ini merupakan hasil citra yang diperoleh

preview-3

Akan tetapi, tidak ditemukan flag yang diminta.

preview-4

FLAG : hctf{9undala_P0etra_po3tir_d232bfe98}

๐Ÿ”— Tetangga Amerika

Bukan Canada

Diberikan file attachment berupa packet-data Forensics3.pcapng. Kemudian akan dilakukan pengecekan terhadap informasi statistik protokol dengan bantuan tshark

$ tshark -r Forensics3.pcapng -q -z io,phs

===================================================================
Protocol Hierarchy Statistics
Filter:

frame                                    frames:13032 bytes:483413
  usb                                    frames:13032 bytes:483413
    usb.capdata                          frames:13032 bytes:483413
===================================================================

$ tshark -r Forensics3.pcapng -Tfields -e usb.device_address | sort | uniq
1
2

Tampak bahwa terdapat sekumpulan usb packet yang berasal dari buah device yang berbeda. Akan tetapi, dikarenakan packet.data cenderung truncated, maka tidak terdapat informasi mengenai DEVICE DESCRIPTOR. Oleh karena itu, Kami mengasumsikan kedua device tersebut sebagai Keyboard dengan prefiks 02 dan Wacom dengan prefiks 10.

Berdasarkan acuan tersebut, Kami menitikberatkan fokus analisis pada Wacom device dengan mengekstrak usb.capdata sebagai acuan plotting.

$ tshark -r Forensics3.pcapng -Y 'usb.capdata and usb.device_address==2'\
 -Tfields -e usb.capdata | awk -F: '{x=$3$4;y=$5$6}{z=$7}$1=="10"{print x,y,z}' > capdata

Selanjutnya dengan skema yang diuraikan pada tautan berikut, dilakukan penentuan koordinat (x,y) pada canvas.

#!/usr/bin/python
from pwn import *
from struct import pack

def parse(row):
    x,y,z = map(lambda x :  int(x,16), row.strip().split())
    if z > 0:
        print u16(struct.pack(">H", x)), u16(pack(">H", y))

file = open('capdata').read().split('\n')
for i in file[:-1]:
    parse(i)
$ python2 plot.py > plot-test

$ gnuplot -e "plot 'plot-test'; pause -1"

Hasilnya tidak diperoleh representasi citra yang memuat flag, melainkan sebagai berikut

preview-5

Untuk itu, Kami berinisiatif untuk menghilangkan proses pack u16() pada script. Adapun berikut ini merupakan snippet-code yang digunakan beserta citra hasil plotting

file = open('capdata').read().split('\n')[:-1]

for i in file:
	x,y,z = map(lambda x : int(x,16), i.split())
	if z > 0:
		print x,y*-1
$ python2 plot.py > plot.txt

$ gnuplot -e "plot 'plot.txt'; pause -1"
preview-6

FLAG : hctf{yUhe5B3h_w1tH_w1re$hark_4_n00bies}