CTFs and solutions
This commit is contained in:
47
guess-mode-double-shot/attack.py
Normal file
47
guess-mode-double-shot/attack.py
Normal file
@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
from pwn import *
|
||||
|
||||
HOST = "130.192.5.212"
|
||||
PORT = "6532"
|
||||
|
||||
server = remote(HOST, PORT)
|
||||
sleepT = 0.5
|
||||
# Different IV when CBC therefore different encryption?
|
||||
for i in range(128):
|
||||
print('-'*20)
|
||||
print(server.recv(1024))
|
||||
payload = (b'A'*32).hex()
|
||||
server.send(payload)
|
||||
server.send('\n')
|
||||
sleep(sleepT)
|
||||
enc = server.recv(1024).split(b":")[1].split(b'\n')[0].strip()
|
||||
print(f"Encryption1:{enc}")
|
||||
enc = bytes.fromhex(enc.decode('utf-8'))
|
||||
sleep(sleepT)
|
||||
#payload2 = bytes([d1 ^ e1 for d1, e1 in zip(b'A'*32, enc)])
|
||||
payload2 = (b'A'*32).hex()
|
||||
#print(payload2)
|
||||
|
||||
#payload2= (b'B'*32).hex()
|
||||
server.send(payload2)
|
||||
server.send('\n')
|
||||
sleep(sleepT)
|
||||
enc2 = server.recv(1024).split(b":")[1].split(b'\n')[0].strip()
|
||||
#print(enc)
|
||||
print(f"Encryption2:{enc2}")
|
||||
enc2 = bytes.fromhex(enc2.decode('utf-8'))
|
||||
sleep(sleepT)
|
||||
if(enc==enc2):
|
||||
print("ECB")
|
||||
server.send(b"ECB")
|
||||
server.send("\n")
|
||||
else:
|
||||
print("CBC")
|
||||
server.send(b"CBC")
|
||||
server.send("\n")
|
||||
sleep(sleepT)
|
||||
#print(server.recv(1024))
|
||||
sleep(sleepT)
|
||||
|
||||
print(server.recv(1024))
|
||||
61
guess-mode-double-shot/chall.py
Normal file
61
guess-mode-double-shot/chall.py
Normal file
@ -0,0 +1,61 @@
|
||||
from Cryptodome.Cipher import AES
|
||||
from Cryptodome.Random import get_random_bytes
|
||||
#from secret import flag
|
||||
import random
|
||||
flag="puppa"
|
||||
modes_mapping = {
|
||||
"ECB": AES.MODE_ECB,
|
||||
"CBC": AES.MODE_CBC
|
||||
}
|
||||
|
||||
|
||||
class RandomCipherRandomMode():
|
||||
def __init__(self):
|
||||
modes = [AES.MODE_ECB, AES.MODE_CBC]
|
||||
self.mode = random.choice(modes)
|
||||
self.key = get_random_bytes(32)
|
||||
if self.mode == AES.MODE_ECB:
|
||||
self.iv = None
|
||||
self.cipher = AES.new(key=self.key, mode=self.mode)
|
||||
else:
|
||||
self.iv = get_random_bytes(16)
|
||||
self.cipher = AES.new(key=self.key, iv=self.iv, mode=self.mode)
|
||||
|
||||
def encrypt(self, data):
|
||||
return self.cipher.encrypt(data)
|
||||
|
||||
def decrypt(self, data):
|
||||
return self.cipher.decrypt(data)
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
for i in range(128):
|
||||
cipher = RandomCipherRandomMode()
|
||||
|
||||
print(f"Challenge #{i}")
|
||||
|
||||
data = b"\00"*32
|
||||
|
||||
otp = get_random_bytes(len(data))
|
||||
#I dont know the OTP generated
|
||||
for _ in range(2):
|
||||
print(f"The otp is:{otp.hex()}")
|
||||
#data = bytes.fromhex(input("Input: ").strip())
|
||||
if len(data) != 32:
|
||||
print("Data must be 32 bytes long")
|
||||
return
|
||||
data = bytes([d ^ o for d, o in zip(data, otp)])
|
||||
print(f"Output: {cipher.encrypt(data).hex()}")
|
||||
mode_test = input(f"What mode did I use? (ECB, CBC)\n")
|
||||
if mode_test in modes_mapping.keys() and modes_mapping[mode_test] == cipher.mode:
|
||||
print("OK, next")
|
||||
else:
|
||||
print("Wrong, sorry")
|
||||
return
|
||||
|
||||
print(f"The flag is: {flag}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user