Skip to content

Instantly share code, notes, and snippets.

@minhtt159
Created July 29, 2018 10:03
Show Gist options
  • Save minhtt159/fb76e7a6977450ab759f7a7b81243176 to your computer and use it in GitHub Desktop.
Save minhtt159/fb76e7a6977450ab759f7a7b81243176 to your computer and use it in GitHub Desktop.
ISITDTU CTF - XOR
enc_flag = '1d14273b1c27274b1f10273b05380c295f5f0b03015e301b1b5a293d063c62333e383a20213439162e0037243a72731c22311c2d261727172d5c050b131c433113706b6047556b6b6b6b5f72045c371727173c2b1602503c3c0d3702241f6a78247b253d7a393f143e3224321b1d14090c03185e437a7a607b52566c6c5b6c034047'.decode('hex')
# print len(enc_flag)
key = [i for i in range(10)]
flag = [chr(i) for i in range(len(enc_flag))]
m = []
for a in range(len(key)):
i = a
for b in range(len(flag)/len(key)):
if b % 2 != 0:
m.append(ord(flag[i]))
else:
m.append(ord(flag[i+len(key)-(a+1+a)]))
i += len(key)
# print m
block_length = len(flag) / len(key)
enc_flag = [enc_flag[i*block_length:(i+1)*block_length] for i in range(len(key))]
def repeatXOR(string, char):
return ''.join(chr(ord(x)^ord(y)) for (x,y) in zip(string,char*len(string)))
def descramble(cipher, positionMap):
plain = [0 for i in range(130)]
for i in range(len(cipher)):
plain[positionMap[i]] = cipher[i]
return ''.join(plain)
alpha = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%*+,._{}"
key = []
for block in enc_flag:
key_i = []
for char in alpha:
allASCII = True
for index in block:
if chr(ord(index)^ord(char)) not in alpha:
allASCII = False
break
if allASCII:
key_i.append(repeatXOR(block, char))
key.append(key_i)
for key_i in key:
print key_i
import itertools
for combo in itertools.product(*key):
plain_text = ''.join(combo)
plain_text = descramble(plain_text,m)
if 'ISITDTU{' in plain_text:
print plain_text
# ISITDTU{Welcome_to_ISITDTUCTF_C0ntest!_Hav3_a_g00d_day._Hope_y0u_w1ll_3nj0y_and_hav3_a_h1gh_rank_1n_0ur_F1rst_Ctf_C0nt3st._Thank5}
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flag import flag,key
assert len(key) == 10
if len(flag) % len(key) != 0:
n = len(key) - len(flag) % len(key)
for i in range(n):
flag += " "
m = []
for a in range(len(key)):
i = a
for b in range(len(flag)/len(key)):
if b % 2 != 0:
m.append(ord(flag[i]) ^ ord(key[a]))
else:
m.append(ord(flag[i+len(key)-(a+1+a)])^ ord(key[a]))
i += len(key)
enc_flag = ""
for j in range(len(m)):
enc_flag += "%02x" % m[j]
print enc_flag
#enc_flag = 1d14273b1c27274b1f10273b05380c295f5f0b03015e301b1b5a293d063c62333e383a20213439162e0037243a72731c22311c2d261727172d5c050b131c433113706b6047556b6b6b6b5f72045c371727173c2b1602503c3c0d3702241f6a78247b253d7a393f143e3224321b1d14090c03185e437a7a607b52566c6c5b6c034047
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment