Created
September 22, 2014 14:06
-
-
Save math314/754ee5d2dd5092094d06 to your computer and use it in GitHub Desktop.
CSAW 2014 crypto 200
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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