Tahoo!!

自分の勉強していること(コンピュータ関連 / ネットワーク / セキュリティ / サーバ)や趣味について書いていきます

setodaNote CTF Writeup (Programming)

この記事は setodaNote CTFのProgrammingジャンルのWriteupです。

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)

f:id:takahoyo:20210905173541p:plain

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__}