ペンギン技術 blog

CTFのWriteupなどを記載していこうと思います

setodaNoteCTF Writeup [Programing]

Programing

ZZZIPPP

何重にも入れ子になったZIPファイルをわたされる。
スクリプトを作成するのが狙いと思われるが、 MACで解凍したら自動ですべて解凍されてしまったので、フラグが得られた。

echo_me

ncでつないでサーバと会話する問題
サーバから来た数値と同じ数値を回答するだけ
回数が多く、手作業ではつらいのでプログラムを組んで対応

$ nc 10.1.1.10 12020
==========
echo me: 36508326
==========
36508326
Correct!

==========
echo me: 22493224
==========

以前、似たようなプログラムを書いたことがあったのですぐに終わると思われたが、
python3対応と、うまく動作しないことから長時間かかった
(サーバに送信する回答に余計な文字が入っており、2回目から正解しなくなっていた)

プログラムはぐちゃぐちゃだが、以下

#!/usr/bin/python
import socket
import datetime
import re
import time

PORT=12020
IP='10.1.1.10'

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect((IP,PORT))

loop_count=0
answer=''
while True:
        res=client.recv(1024)
        res = res.decode("utf-8")
        print(res)

        q_match = re.search(r'echo me',res)
        flag_match = re.search(r'flag',res)

        if q_match:
                print ('---Question_match---')
                q_str = res[q_match.start():-3]
                print ("q_str:={}!!!".format(q_str))

                q_str2 = q_str.split(' ')
                print ("q_str2[2]={}!!!".format(q_str2[2]))

                answer = q_str2[2]
                print ("ans:" + answer.replace('=',''))
                answer = answer.replace('\r','')
                answer = answer.replace('\n','')
                answer = answer.replace('=','')
                answer = str(answer)+'\n'

                client.sendall(answer.encode("utf-8"))
                print ('send answer={}???'.format(answer))
                #time.sleep(1)

        if flag_match:
                print ('flag_match')
                client.close()
                break
        time.sleep(0.1)

実行例

send answer=31056776
???
Correct!

==========
echo me: 44313160
==========

---Question_match---
q_str:=echo me: 44313160
========!!!
q_str2[2]=44313160
========!!!
ans:44313160

send answer=44313160
???
Correct!

flag{xxxxx}

flag_match

EZZZIPPP

何重にも入れ子になったZIPファイルをわたされる。
今回はパスワードつきであり、ファイルごとにパスワードが異なる。
そのため、MACで解凍したも自動ですべて解凍されない。
(pass.txtにパスワードが書いてある)

スクリプトを作成するのが狙いと思われる。
以下のようなスクリプトで全て解凍した。

# extract password zip
import zipfile

filenameOut = "/home/pi/work/passZIP_test"
passStr = "lCfIpIq2Ka"

cnt = 1000
for i in range(999):
  filenameIn = "/home/pi/work/passZIP_test/flag{}.zip".format(str(cnt))

  path = "pass.txt" # password for zipfile
  with open(path) as f:
    for s_line in f:
      s_line = s_line.replace("\n","")
      print(s_line)
      passStr = s_line

  with zipfile.ZipFile(filenameIn) as pass_zip:
    pass_zip.extractall(filenameOut, pwd=passStr.encode("utf-8"))

  cnt -= 1
$ cat flag.txt
flag{xxxxx}

deep_thought

計算した数値を返す問題
手作業ではつらいのでプログラムを組んで対応

$ nc 10.1.1.10 12010
[ Q1 ]
4 - 2
2
Correct!

[ Q2 ]
2 + 3
5
Correct!

[ Q3 ]
13 + 10
#!/usr/bin/python
import socket
import datetime
import re
import time

PORT=12010
IP='10.1.1.10'

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.settimeout(1.0)

client.connect((IP,PORT))

loop_count=0
answer=''
while True:
    res_a = ''
    for i in range(2): # 繰り返してすべて受信
        try:
            res = client.recv(1024)
        except Exception as e:  # socket.timeout
            print(e)
            print(type(e))

        #print("i:{} / res={}=".format( i, str(res)) )
        print ("recv:"+str(i))

        res_a += res.decode("utf-8")
        print("{}res_a={}=".format( i,str(res_a)) )
        time.sleep(0.1)

    q_match = re.search(r' Q',res_a)
    flag_match = re.search(r'flag',res_a)

    if q_match:
        print ('---Question_match---')
        q_str = res_a[q_match.start():-1]
        print ("q_str:={}!!!".format(q_str))

        q_str2 = q_str.split('\n')
        eva_str = q_str2[1]
        print ("q_str2[1]={}!!!".format(eva_str) )

        answer = str(eval(eva_str)) #not secure!!

        answer = answer.replace('\r','')
        answer = answer.replace('\n','')
        answer = str(answer)+'\n'

        client.sendall(answer.encode("utf-8"))
        print ('send answer={}???'.format(answer))
        #time.sleep(1)

    if flag_match:
        print ('flag_match')
        client.close()
        break
    time.sleep(0.1)

実行例

---Question_match---
q_str:= Q50 ]
2183 + 1347
Correct!

[ Q50 ]
2183 + 1347!!!
q_str2[1]=2183 + 1347!!!
send answer=3530
???
recv:0
0res_a=Correct!

flag{xxxxx}