Writeup: Flare On 11 - Frog
Tulisan ini sebenarnya tulisan lama yang sayang untuk ngga dipost tapi malu untuk dipost karena terlalu sepele. Semoga di challenge selanjutnya bisa konsisten untuk mengerjakan lebih jauh lagi, bukan hanya sekedar soal introduction.
Welcome to Flare-On 11! Download this 7zip package, unzip it with the password ‘flare’, and read the README.txt file for launching instructions. It is written in PyGame so it may be runnable under many architectures, but also includes a pyinstaller created EXE file for easy execution on Windows.
Your mission is get the frog to the “11” statue, and the game will display the flag. Enter the flag on this page to advance to the next stage. All flags in this event are formatted as email addresses ending with the @flare-on.com domain.
frog.7z
Soal pertama ini sangat mudah, mungkin kalau di CTF biasa, ini jenis soal untuk memperkenalkan kepada pemain bagaimana format flagnya, yang biasanya hanya tinggal copas dari deskripsi soal ke field untuk submit flag. Tetapi di Flare-On 11 ini agak beda, karena saya harus tetap melakukan reverse engineering.
Ekstrak file dengan menggunakan 7z
dan password flare
.
7za x frog.7z
Pada file README.md
, terdapat requirement untuk menginstall PyGame
di Python 3
. Untuk itu, saya membuat virtualenv agar tidak mengganggu Python di system saya.
pyenv virtualenv 3.12.0 flareon
pyenv activate flareon
pip install PyGame
Pada saat dijalankan menggunakan perintah python frog.py
, program akan menampilkan sebuah permainan yang tujuannya adalah membuat si katak ini mencapai di patung angka 11. Kendalanya adalah ada dinding pembatas.
Melihat challenge ini, saya teringat sewaktu kuliah pernah membuatkan game sederhana seperti ini untuk teman saya. Blok yang menjadi pembatas seharusnya dapat dengan mudah dibypass dengan menghilangkan kondisi untuk pengecekannya. Setelah melihat file frog.py
, terlihat fungsi yang mengatur pergerakan pemain.
def AttemptPlayerMove(dx, dy):
newx = player.x + dx
newy = player.y + dy
# Can only move within screen bounds
if newx < 0 or newx >= tiles_width or newy < 0 or newy >= tiles_height:
return False
# See if it is moving in to a NON-PASSABLE block. hint hint.
for block in blocks:
if newx == block.x and newy == block.y and not block.passable:
return False
player.move(dx, dy)
return True
Dari source yang telah ditemukan, saya langsung memasang comment pada bagian pengecekan dinding pembatas seperti ini:
def AttemptPlayerMove(dx, dy):
newx = player.x + dx
newy = player.y + dy
# Can only move within screen bounds
if newx < 0 or newx >= tiles_width or newy < 0 or newy >= tiles_height:
return False
# See if it is moving in to a NON-PASSABLE block. hint hint.
# for block in blocks:
# if newx == block.x and newy == block.y and not block.passable:
# return False
player.move(dx, dy)
return True
Dan kemudian menjalankan program dengan python frog.py
. Pemain kemudian bisa membypass dinding pembatas dan meletakan katak ke patung angka 11. Flag yang didapatkan adalah welcome_to_11@flare-on.com
.