この記事は setodaNote CTFのProgrammingジャンルのWriteupです。
- ZZZIPPP (80pts, 263solves)
- echo_me (120pts, 147solve)
- EZZZIPPP (150pts, 180solves)
- deep_thought (250pts, 140solves)
ZZZIPPP (80pts, 263solves)
問題ファイルはflag1000.zip
という名前のZIPファイル。
zipinfoで中身を見てみると、fla999.zip
というファイルが圧縮されている。
$ zipinfo flag1000.zip Archive: flag1000.zip Zip file size: 171803 bytes, number of entries: 1 -rw-r--r-- 3.0 unx 171631 bx stor 21-Aug-01 19:00 flag999.zip 1 file, 171631 bytes uncompressed, 171631 bytes compressed: 0.0%
zipの展開を1000回やれば良さそう。
Linuxコマンドのonlinerで1000回zipを展開する。
for ((i=1000;i>0;i--)); do unzip "flag${i}.zip"; rm -f "flag${i}.zip"; done
flag{loop-zip-1989-zip-loop}
ちなみにCyberChefでも、以下のようなレシピでzipを展開できる。
Label('loop') Unzip('',true) Jump('loop',999)
https://gchq.github.io/CyberChef/#recipe=Label('loop')Unzip('',true)Jump('',10)
echo_me (120pts, 147solve)
WebブラウザからアクセスできるLinuxターミナルにアクセスして解く問題。
ncで問題サーバにつなぐと数字が降ってきて、その数字をそのまま返すと正解になる。
user@81d81c2295af:~$ nc 10.1.1.10 12020 ========== echo me: 18033524 ========== 18033524 Correct! ========== echo me: 87673700 ==========
毎回手動で返すのは骨が折れるので、プログラム書いて返すようにする。(Pwntools使えるのに後で気づいたので、socketを使って書いてる
import socket import re import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('10.1.1.10', 12020)) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) i=1 while True: print(i) msg = b'' while True: buf = s.recv(2048) print(buf.decode()) msg += buf if b'echo me:' in msg or buf == b'': break if buf == b'': break res = re.findall(r'(\d+)', msg.decode())[0] print(res) res = res+'\n' s.send(res.encode()) i=i+1 s.close()
100回数字を返すとFLAGが表示された。
flag{Hellow_yamabiko_Yoo-hoo!}
EZZZIPPP (150pts, 180solves)
問題ファイルとしてZIPファイルと、ZIPファイルのパスワードが書かれたファイル (pass.txt) が配布される。
zzzipppと同じように1000回zipを展開する必要があるのだが今度はパスワード付き。 同様にLinuxコマンドのonlinerで展開するが、unzipで展開するときに以下の引数を追加した。
-P
: パスワード文字列を渡す。pass.txtをcatした結果を渡す。-o
: 同じファイル名のファイルが作成される場合でも自動で上書きされるようにする。pass.txtが毎回同じ名前で生成されるため
for ((i=1000;i>0;i--)); do unzip -o -P `cat pass.txt` "flag${i}.zip"; rm -f "flag${i}.zip"; done
flag{bdf574f15645df736df13daef06128b8}
deep_thought (250pts, 140solves)
echoと同じくWebブラウザからアクセスできるLinuxターミナルにアクセスして解く問題。
ncで問題サーバにつなぐと今度は計算式が降ってきて、計算した答えを返す問題。
user@81d81c2295af:~$ nc 10.1.1.10 12010 [ Q1 ] 2 + 2 4 Correct! [ Q2 ] 3 + 7
echoと同様にプログラムを書いて自動化する。(ここでPwntoolsが使えることに気づいたのでPwntoolsを使って書く
ポイントは、受信した計算式の文字列をeval()
に渡すとよしなに計算してくれること。
from pwn import * io = remote('10.1.1.10', 12010) while True: msg = io.recvrepeat(0.5) print(msg.decode()) if msg == b'': break formula = msg.decode().split('\n')[-2] res = eval(formula) print(res) res = str(res)+'\n' io.send(res.encode()) io.close()
50問解くとFLAGが表示された。
flag{__42__}