LEVEL 3

Textbook-DH

crypto
  • 문제 정보
  • 풀이 53
  • 난이도 투표 50
  • 질문 7
  • 최근 풀이자 719
  • 댓글 40
해당 문제는 Dreamhack CTF Season 1 Round #4 에 출제된 문제입니다.

문제 설명

Description

Alice와 Bob의 통신을 중간자 드림이가 엿보고 있습니다. 둘의 키교환 과정을 공격해 플래그를 획득해주세요 !

플래그 형식은 DH{...} 입니다.

References

https://dreamhack.io/lecture/courses/75

출제자 정보

avatar
Dreamhack
대표 업적 없음

First Blood!

avatar
ironore15
CTF Second Place
출제된 지 10분 만에 풀이 완료!

난이도 투표 50

질문 7

문제 풀이에 어려움이 있으신가요?
커뮤니티에서 문제에 대한 질문하고 답변 얻기
문제를 해결하는 방향이 있을까요? (?)
질문 제목이 조금 이상해서 죄송합니다만 저도 제가 문제를 풀면서 어디가 심각하게 막히는지를 느낌으로는 알 것 같으면서도 제대로 글로 쓰기가 어려워서 이렇게라도 쓰게 되었다는 점 양해 부탁드립니다ㅠㅠ;; 문제 코드를 보니 p는 서버에 접속하면 매번 랜덤하게 나오는 1024비트짜리 소수로 정해지는 것을 확인했습니다. 또한 해당 Diffie-hellman 교환 과정을 통해 키를 교환한 다음 플래그를 반쪽씩 나누어서 해당 키를 가지고 AES 암호화를 하게 되는데 이때 성공적으로 키를 훔쳤다면 그 키를 이용해 AES 복호화를 해서 플래그를 맞추는 것까지 짐작했습니다. (맞게 짐작했는지 확신은 안 가지만, 제공된 Python 코드에서 우연히 플래그에 임의의 문자열을 넣고 복호화 과정까지 추가해서 자체적으로 돌릴 수 있게 약간 고치는 과정에서 알게 되었습니다.) 문제 내용은 Alice - Bob 사이에 끼어서 키 교환 과정을 공격하는건데, 유튜브에 돌아다니는 다른 교수님 영상도 쭉 보고 해서 이론적으로는 이해가 가는 것 같지만 실제로 문제를 풀어보니 무언가가 자꾸 막히는 것 같습니다. 그렇다면 이 문제는 직접 Alice와 Bob사이에서 키 교환 과정을 공격하는 과정에서 Alice해커, 해커Bob 사이에 만들어지는 키 두개를 직접 계산한 다음 AES 복호화를 시행해서 키를 얻어내는 건가요? 실제로 직접 배운대로 계산해서 제공받은 Python파일을 약간 변형해서 시도를 해 보긴 했지만 Padding error 등 여러가지 에러가 뜨거나 키 값이 초과되었다는 등 별별 에러가 다 떠서 혹시 제가 아예 문제 요점을 잘못 파악하고 있거나 접근하는 방법이 잘못되었는지 궁금합니다..; 어떤 방향(?)으로 문제를 풀어가면 좋을까요? (질문을 최대한 나름대로 정리해서 썼지만 그래도 횡설수설한점 양해 부탁드립니다..)
avatar KnightChaser
Textbook-DH 패딩?? 에러인데 어떻게해야할까요
검색해서 넷켓으로 플래그 가져와서 복호화하는건 어찌저찌 되었는데 파이썬프로그램으로 바로 들어가서 플래그만 싹뽑아내는걸 해보려는데 자꾸 에러가 나오네요 오류라고 하는 지점?? #!/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) 이부분
avatar 아르단위드

최근 풀이자 719

Eager
대표 업적 없음
avatar
Yu_212
대표 업적 없음
서경대김재중
대표 업적 없음
16글자 이내
대표 업적 없음
sdrg12
대표 업적 없음
전설
강의 수강: 1
avatar
뚜비뚜바
대표 업적 없음
나이테
대표 업적 없음
avatar
IRev
주니어
Archied10
대표 업적 없음

댓글 40

LOBYI
대표 업적 없음
좀만 신경쓰면 풀만한 문제
n0ha
.HACK 2024 참가자
생각보다 쉬움
avatar
buaii
워게임 고인물
어려워....
avatar
yoobi
워게임 고인물
Vamos~
avatar
Erny
대표 업적 없음
good
avatar
스카이넷
워게임 고인물
ez
l000wk3y
공부벌레
기존에 주어지는 코드 수정해서 해결
avatar
Sechack
2024 Invitational Contenders
뭐야 왜이렇게 쉬움;;
avatar
호야
대표 업적 없음
헤헤 재밌당
avatar
Annoying_Dog
대표 업적 없음
드뎌풀었다히히ㅣ히힣힣