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}