검색해서 넷켓으로 플래그 가져와서 복호화하는건 어찌저찌 되었는데
파이썬프로그램으로 바로 들어가서 플래그만 싹뽑아내는걸 해보려는데 자꾸 에러가 나오네요
오류라고 하는 지점??
#!/usr/bin/python3
from pwn import *
from Cryptodome.Util.number import getPrime
from Cryptodome.Util.Padding import pad, unpad
from Cryptodome.Cipher import AES
import hashlib
import random
class Person(object):
def init(self, p):
self.p = p
self.g = 2
self.x = random.randint(2, self.p - 1)
def calc_key(self):
self.k = pow(self.g, self.x, self.p)
return self.k
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)
def encrypt(self, pt):
return self.cipher.encrypt(pad(pt, 16)).hex()
def decrypt(self, ct):
return unpad(self.cipher.decrypt(bytes.fromhex(ct)), 16)
p = remote("host3.dreamhack.games",20137)
p 받아옴
p.recvuntil(b"Prime: ")
prime = int(p.recvline()[:-1],16)
클래스 생성
attacker_a = Person(prime)
attacker_b= Person(prime)
Alice의 공개키 탈취
p.recvuntil(b"Alice sends her key to Bob. Key: ")
alice_k = int(p.recvline()[:-1],16)
attacker_a.set_shared_key(alice_k)
p.sendafter(b">> ",b'32\n')
Bob의 공개키 탈취
p.recvuntil(b"Bob sends his key to Alice. Key: ")
bob_k = int(p.recvline()[:-1],16)
attacker_b.set_shared_key(bob_k)
p.sendafter(b">> ",b'32\n')
flag 복호화
p.recvuntil(b"Alice: ")
alice_encrypt_message = p.recvline()[:-1].decode()
p.recvuntil(b"Bob: ")
bob_encrypt_message = p.recvline()[:-1].decode()
flag = ''
flag = attacker_a.decrypt(alice_encrypt_message)
flag += attacker_b.decrypt(bob_encrypt_message)
print("FLAG : {}".format(flag))
인터넷에있는것 가져왔는데
호스트아이디랑 포트만 바꿔서 사용했습니다
p = remote("host3.dreamhack.games",20137) 이부분
Pycryptodome의 Incorrect Padding 에러는 일반적으로 unpad 과정에서 bytes([k] * k)의 패딩으로 끝나지 않을 경우 발생합니다.
unpad 함수는 복호화 이후 다시 원본 스트링을 되돌리기 위해 패딩을 삭제할 때 사용됩니다.
아마 복호화 과정에서 오류가 생겨 잘못된 패딩된 평문을 내보낸 것으로 보입니다.
또한, 풀이를 검색하여 바로 솔브를 시도하는 행위, 특히 코드에 대한 이해가 확실하지 않은 상태에서 남의 풀이를 이용해 문제를 해결하는 것은 금지되어 있습니다.
스스로 공부 후 다시 한 번 도전해보시길 바랍니다.