오늘은 드림핵 문제 풀이
https://dreamhack.io/wargame/challenges/120/
참고로 요문제입니다!!
제일 먼저 문제파일을 다운 받았더니 안에 challenge.py가 들어있어요
외계어다...
겁먹지 말고 하나씩 뜯어보자
#!/usr/bin/python3
from Crypto.Util.number import getPrime
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
import hashlib
import random
#클래스 객체 생성
class Person(object):
# p를 전달받은 값으로 초기화, g는 2, x는 2와 p-1 사이의 랜덤값
def __init__(self, p):
self.p = p
self.g = 2
self.x = random.randint(2, self.p - 1)
# k = g^x (mod p) = 2^x (mod p) : A의 개인키
def calc_key(self):
self.k = pow(self.g, self.x, self.p)
return self.k
# shared key = k^x (mod p)
def set_shared_key(self, k):
self.sk = pow(k, self.x, self.p)
aes_key = hashlib.md5(str(self.sk).encode()).digest()
self.cipher = AES.new(aes_key, AES.MODE_ECB)
# 암호화 -> 16진수
def encrypt(self, pt):
return self.cipher.encrypt(pad(pt, 16)).hex()
# 복호화 -> 16진수
def decrypt(self, ct):
return unpad(self.cipher.decrypt(bytes.fromhex(ct)), 16)
# 소수 선택 및 초기화 진행
flag = open("flag", "r").read().encode()
prime = getPrime(1024)
print(f"Prime: {hex(prime)}")
alice = Person(prime)
bob = Person(prime)
# Alice의 공유키 전달
alice_k = alice.calc_key()
print(f"Alice sends her key to Bob. Key: {hex(alice_k)}")
print("Let's inturrupt !")
alice_k = int(input(">> "))
if alice_k == alice.g:
exit("Malicious key !!")
bob.set_shared_key(alice_k)
# Bob의 공유키 전달
bob_k = bob.calc_key()
print(f"Bob sends his key to Alice. Key: {hex(bob_k)}")
print("Let's inturrupt !")
bob_k = int(input(">> "))
if bob_k == bob.g:
exit("Malicious key !!")
alice.set_shared_key(bob_k)
print("They are sharing the part of flag")
print(f"Alice: {alice.encrypt(flag[:len(flag) // 2])}")
print(f"Bob: {bob.encrypt(flag[len(flag) // 2:])}")
중간자는 Alice의 공개키를 전달하는 과정에서 Alice 키 조작 가능 + Bob의 공개키를 전달하는 과정에서 Bob의 키 조작 가능
from Crypto.Util.Padding import pad, unpad
from Crypto.Cipher import AES
import hashlib
import random
# 소수 계산
prime = int(input("prime:"),16)
my_x=random.randint(2,prime-1)
my_key=pow(2, my_x, prime)
print("My Key:",my_key)
# Alice 키 조작
alice_k = int(input("Key From Alice:"),16)
a_sk= pow(alice_k, my_x, prime)
a_aes=hashlib.md5(str(a_sk).encode()).digest()
a_cipher=AES.new(a_aes, AES.MODE_ECB)
# Bob 키 조작
bob_k = int(input("Key From Bob:"),16)
b_sk= pow(bob_k, my_x, prime)
b_aes=hashlib.md5(str(b_sk).encode()).digest()
b_cipher=AES.new(b_aes, AES.MODE_ECB)
# Alice로부터 오는 메세지
a_ct=input("Message frome Alice:")
a_pt=unpad(a_cipher.decrypt(bytes.fromhex(a_ct)), 16)
# Bob으로부터 오는 메세지
b_ct=str(input("Message frome Bob:"))
b_pt=unpad(b_cipher.decrypt(bytes.fromhex(b_ct)), 16)
flag=a_pt.decode()+b_pt.decode()
print("flag:",flag)
둘이 주고 받는 메세지를 중간에서 탈취하여 flag 값 추출하면 됨!