initial commit
This commit is contained in:
49
CTF/W1seGuy/W1seGuy.py
Normal file
49
CTF/W1seGuy/W1seGuy.py
Normal file
@@ -0,0 +1,49 @@
|
||||
import random
|
||||
import socketserver
|
||||
import socket, os
|
||||
import string
|
||||
|
||||
flag = open('flag.txt','r').read().strip()
|
||||
|
||||
def send_message(server, message):
|
||||
enc = message.encode()
|
||||
server.send(enc)
|
||||
|
||||
def setup(server, key):
|
||||
flag = 'THM{thisisafakeflag}'
|
||||
xored = ""
|
||||
|
||||
for i in range(0,len(flag)):
|
||||
xored += chr(ord(flag[i]) ^ ord(key[i%len(key)]))
|
||||
|
||||
hex_encoded = xored.encode().hex()
|
||||
return hex_encoded
|
||||
|
||||
def start(server):
|
||||
res = ''.join(random.choices(string.ascii_letters + string.digits, k=5))
|
||||
key = str(res)
|
||||
hex_encoded = setup(server, key)
|
||||
send_message(server, "This XOR encoded text has flag 1: " + hex_encoded + "\n")
|
||||
|
||||
send_message(server,"What is the encryption key? ")
|
||||
key_answer = server.recv(4096).decode().strip()
|
||||
|
||||
try:
|
||||
if key_answer == key:
|
||||
send_message(server, "Congrats! That is the correct key! Here is flag 2: " + flag + "\n")
|
||||
server.close()
|
||||
else:
|
||||
send_message(server, 'Close but no cigar' + "\n")
|
||||
server.close()
|
||||
except:
|
||||
send_message(server, "Something went wrong. Please try again. :)\n")
|
||||
server.close()
|
||||
|
||||
class RequestHandler(socketserver.BaseRequestHandler):
|
||||
def handle(self):
|
||||
start(self.request)
|
||||
|
||||
if __name__ == '__main__':
|
||||
socketserver.ThreadingTCPServer.allow_reuse_address = True
|
||||
server = socketserver.ThreadingTCPServer(('0.0.0.0', 1337), RequestHandler)
|
||||
server.serve_forever()
|
||||
38
CTF/W1seGuy/decrypt.py
Normal file
38
CTF/W1seGuy/decrypt.py
Normal file
@@ -0,0 +1,38 @@
|
||||
import itertools
|
||||
|
||||
def xor_decrypt(hex_encoded, key):
|
||||
data = bytes.fromhex(hex_encoded)
|
||||
decrypted = ''
|
||||
for i in range(len(data)):
|
||||
decrypted += chr(data[i] ^ ord(key[i % len(key)]))
|
||||
return decrypted
|
||||
|
||||
def recover_xor_key(hex_encoded, known_start="THM{", known_end="}"):
|
||||
data = bytes.fromhex(hex_encoded)
|
||||
|
||||
# Step 1: Recover partial key from known prefix
|
||||
partial_key = [chr(data[i] ^ ord(known_start[i])) for i in range(len(known_start))]
|
||||
|
||||
# Step 2: Brute-force remaining characters of 5-character key
|
||||
charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
||||
key_length = 5
|
||||
unknown_length = key_length - len(partial_key)
|
||||
|
||||
for combo in itertools.product(charset, repeat=unknown_length):
|
||||
key = ''.join(partial_key + list(combo))
|
||||
decrypted = xor_decrypt(hex_encoded, key)
|
||||
if decrypted.startswith(known_start) and decrypted.endswith(known_end):
|
||||
return key, decrypted
|
||||
|
||||
return None, None
|
||||
|
||||
if __name__ == "__main__":
|
||||
hex_encoded = "272f0549124206245c16361f3c731607532b590132093a01031f2b315a370113310217011f07401f"
|
||||
key, message = recover_xor_key(hex_encoded)
|
||||
|
||||
if key:
|
||||
print("✅ Found key:", key)
|
||||
print("🔓 Decrypted message:", message)
|
||||
else:
|
||||
print("❌ Key not found.")
|
||||
|
||||
Reference in New Issue
Block a user