Skip to content

Instantly share code, notes, and snippets.

@math314
Created September 22, 2014 14:06
Show Gist options
  • Save math314/754ee5d2dd5092094d06 to your computer and use it in GitHub Desktop.
Save math314/754ee5d2dd5092094d06 to your computer and use it in GitHub Desktop.
CSAW 2014 crypto 200
#coding=utf-8
import os
import socket
import select
from time import sleep
import binascii
from subprocess import Popen,STDOUT,PIPE
import os
from math import *
import string
from fractions import gcd
def next_line(stdout):
line = ""
while True:
r = stdout.read(1)
if r == '\n':
break
line += r
print "<read> : " + line
return line
def write(stdin,val):
stdin.write(val)
print "<write> : " + val
def solve1(s):
diff = (ord('t') - ord(s[0])) % 26
x = string.ascii_lowercase
x = x[diff:] + x[:diff]
ans = string.translate(s,string.maketrans(string.ascii_lowercase,x))
return ans.split()[-1]
def solve2(s):
for w in xrange(2,len(s)):
decode = ['0'] * len(s)
decode_id = 0
gap = 0
for i in xrange(len(s)):
decode[decode_id] = s[i]
decode_id += w
if decode_id >= len(s):
gap += 1
decode_id = gap
decode = "".join(decode)
if "I hope you don't have a problem with this challenge." not in decode: continue
return decode.split('"')[1]
def solve3(s):
s = s.replace(" ","")
keys = []
for i,cry in enumerate(s):
key_part = ((ord(cry) - ord('A')) - (ord("thistimewewillgiveyou"[i]) - ord('a')) ) % 26
key = chr(key_part % 26 + ord('a'))
keys.append(key)
if len(keys) >= 6 and "".join(keys[:5]) == "".join(keys[-5:]):
keys = keys[:-5]
break
keys = "".join(keys)
print "key is '%s' " % keys
ans = []
for i,cry in enumerate(s):
val = (ord(cry) - ord('A') - (ord(keys[i % len(keys)]) - ord('a'))) % 26 + ord('A')
ans.append(chr(val))
return "".join(ans)[296:-526]
def main():
cmdline = "nc 54.209.5.48 12345"
p = Popen(cmdline, shell=True, cwd="./", stdin=PIPE,
stdout=PIPE, stderr=STDOUT,close_fds=True)
print "-" * 80 # 区切り表示(開始)
def nl(): return next_line(p.stdout)
def wr(val): write(p.stdin,val)
def ntext():
line = ""
while "psifer text:" not in line:
line = nl()
return line[len("psifer text:") + 1:]
while True:
text = ntext()
ans = solve1(text)
wr(ans + '\n')
text = ntext()
ans = solve2(text)
wr(ans + '\n')
text = ntext()
ans = solve3(text)
wr(ans + '\n')
print "-" * 80
ret = p.wait()
print "Return code: %d" % ret
# A = "THISTIMEWEWILLGIVEYOUMOREPLAINTEXTTOWORKWITHYOUWILLPROBABLYFINDTHATHAVINGEXTRACONTENTTHATISASCIIMAKESTHISONEMORESOLVABLEITWOULDBESOLVABLEWITHOUTTHATBUTWEWILLMAKESURETOGIVELOTSOFTEXTJUSTTOMAKESURETHATWECANHANDLEITIWONDERHOWMUCHWILLBEREQUIREDLETSPUTTHEMAGICPHRASEFORTHENEXTLEVELINTHEMIDDLERIGHTHERENOTHINGTRICKYOKNOWMORETEXTTOMAKESURETHATITISSOLVABLEISHOULDPROBABLYJUSTPUTINSOMENURSERYRHYMEORSOMETHINGMARYHADALITTLELAMBLITTLELAMBLITTLELAMBMARYHADALITTLELAMBWHOSEFLEEZEWASWHITEASSNOWIDONTWANTTOMAKETHISHARDERTHANITNEEDSTOBEIFYOUVESOLVEDALOTOFSIMPLECRYPTOCHALLENGESYOUPROBABLYALREADYHAVETHECODEANDWILLBREEZERIGHTTHROUGHITIFITHELPSMOSTOFTHEPLAINTEXTISSTATICATEACHOFTHELEVELSIMNOTAMASOCHISTTHEFUNNYTHINGISTHATDEPENDINGONWHICHRANDOMKEYYOUGETTHATPOEMMIGHTBEEXACTLYTHERIGHTOFFSETTOSUCCESSFULLYMOUNTANATTACKWELLSEELITTLEBITMORELITTLEBITMORETHERE"
# B = "THISTIMEWEWILLGIVEYOUMOREPLAINTEXTTOWORKWITHYOUWILLPROBABLYFINDTHATHAVINGEXTRACONTENTTHATISASCIIMAKESTHISONEMORESOLVABLEITWOULDBESOLVABLEWITHOUTTHATBUTWEWILLMAKESURETOGIVELOTSOFTEXTJUSTTOMAKESURETHATWECANHANDLEITIWONDERHOWMUCHWILLBEREQUIREDLETSPUTTHEMAGICPHRASEFORTHENEXTLEVELINTHEMIDDLERIGHTHEREBLAHLAHOKNOWMORETEXTTOMAKESURETHATITISSOLVABLEISHOULDPROBABLYJUSTPUTINSOMENURSERYRHYMEORSOMETHINGMARYHADALITTLELAMBLITTLELAMBLITTLELAMBMARYHADALITTLELAMBWHOSEFLEEZEWASWHITEASSNOWIDONTWANTTOMAKETHISHARDERTHANITNEEDSTOBEIFYOUVESOLVEDALOTOFSIMPLECRYPTOCHALLENGESYOUPROBABLYALREADYHAVETHECODEANDWILLBREEZERIGHTTHROUGHITIFITHELPSMOSTOFTHEPLAINTEXTISSTATICATEACHOFTHELEVELSIMNOTAMASOCHISTTHEFUNNYTHINGISTHATDEPENDINGONWHICHRANDOMKEYYOUGETTHATPOEMMIGHTBEEXACTLYTHERIGHTOFFSETTOSUCCESSFULLYMOUNTANATTACKWELLSEELITTLEBITMORELITTLEBITMORETHERE"
# def f(A,B):
# for i in xrange(min(len(A),len(B))):
# if A[i] != B[i]: return i
# print A[296:-526]
# x = f(A,B)
# print x
# A = A[x:][::-1]
# B = B[x:][::-1]
# x = f(A,B)
# print x
# A = A[x:][::-1]
# B = B[x:][::-1]
# print A,B
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment