Tokyo Westerns CTF 3rd 2017 WriteUp
team Harekaze で参加しました.
チームとしては940pts,33rd.
個人的には自明Crypto一問を通して64ptsを入れました.
BabyDLP
解法:1bitづつ特定できるのでやる.
最後はwhileの終了条件で格好よく抜けたかったけどなぜか上手くいかないのでbreakとか書き足したり,途中まで取れた結果をコード中に書いてみたりした.
#!/usr/bin/env python3 import socket import time import Crypto.Util.number soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) soc.connect(("ppc2.chal.ctf.westerns.tokyo", 28459)) flg = 0 p = 160634950613302858781995506902938412625377360249559915379491492274326359260806831823821711441204122060415286351711411013883400510041411782176467940678464161205204391247137689678794367049197824119717278923753940984084059450704378828123780678883777306239500480793044460796256306557893061457956479624163771194201 g = 2 soc.send("0\n".encode('ascii')) time.sleep(0.1) prev = int(soc.recv(300).decode('ascii').rstrip(), 16) print(prev) add = 1 it = 0 while prev != g : soc.send((hex(flg + add)[2:]+'\n').encode('ascii')) time.sleep(0.1) tmp = int(soc.recv(300).decode('ascii').rstrip(), 16) print("iter : ", it, " ,recv : ", tmp) if tmp == (prev*pow(2,add,p)) % p : # 0 -> 1 pass elif tmp == (prev*pow(pow(2,add,p),p-2,p)) % p: # 1 -> 0 flg = flg + add prev = tmp else : break # assert(0) add *= 2 it += 1 #flg = 50708000582382096636610604573295443076056584710334161094159154216560653240031124059562811961899120099043361370237 print(flg) print(Crypto.Util.number.long_to_bytes(flg).decode('ascii'))