学習の栞

学びたいことと、学ぶべきことと、学べることの区別がついてない人間の進捗管理

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'))