[클라우드 바우처] 80% 할인된 금액으로 드림핵 엔터프라이즈를 도입해 보세요. 자세히 알아보기
LEVEL 3

Textbook-DH

crypto
  • 문제 정보
  • 풀이 47
  • 난이도 투표 47
  • 질문 7
  • 최근 풀이자 626
  • 댓글 38
해당 문제는 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분 만에 풀이 완료!

난이도 투표 47

질문 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 아르단위드

최근 풀이자 626

juhwisang
워게임 고인물
beaverx00
강의 수강: 10
GID
대표 업적 없음
wooze
대표 업적 없음
le0s1mba
대표 업적 없음
화라기
대표 업적 없음
avatar
빵선
대표 업적 없음
TTAOGI
강의 수강: 1
파란다시마
대표 업적 없음
rootxdwt
대표 업적 없음

댓글 38

avatar
buaii
워게임 고인물
어려워....
avatar
yoobi
워게임 고인물
Vamos~
avatar
Erny
대표 업적 없음
good
avatar
스카이넷
강의 수강: 10
ez
l000wk3y
공부벌레
기존에 주어지는 코드 수정해서 해결
avatar
Sechack
CTF First Place
뭐야 왜이렇게 쉬움;;
avatar
호야
대표 업적 없음
헤헤 재밌당
avatar
Annoying_Dog
대표 업적 없음
드뎌풀었다히히ㅣ히힣힣
imsi file
워게임: 1
너무 강력한 꼼수
avatar
re-evokE
워게임: 20
응애