- Dreamhack - Textbook-DH
문제에서 제공된 파일을 다운로드 받으면 challenge.py 파일을 확인할 수 있다.
공통으로 사용할 소수 p를 뽑은 후, 2 이상 p미만의 수 x를 Alice와 Bob이 각각 뽑는다.
그리고 2의 x승을 이용하여키를 교환하는 방식이다.
이는 x의 값을 드러내지 않고 2^x mod p만을 상대에게 교환하여 서로의 비밀키 x를 드러내지 않는 장점을 지닌다. 그런데 문제에서는 g 대신 사용할 수를 사용자에게 받는다. 따라서 우리가 알지 못하는 x의 값에 관계없이 g^x mod p의 값을 알아낼 방법을 찾으면 된다.
이를 알아낼 경우 AES의 key로 사용되는 md5(g^x mod p)의 값을 알아내어 문제의 마지막 flag의 값을 복호화해낼 수 있다.
입력값으로 1을 입력해보았다. 1은 x의 값에 관계없이 1^x mod p의 값을 1로 만들어준다.
이를 통해 구현한 익스코드는 다음과 같다.
실행해보면 다음과 같은 결과를 얻을 수 있다.
- HackCTF - 세상에서 잊혀진 날 찾아줘!
문제에 첨부된 파일을 다운로드 받으면 다음과 같은 pdf파일을 얻을 수 있다. HexEdit을 이용해서 살펴봤지면 flag값을 찾을 수 없었다.
이미지를 막 클릭하다보니 아래 박스 부분에 텍스트가 존재함을 알게 되었다.
바로 flag값을 찾을 수 있었다.
HackCTF{y0u_4re_my_h3r0!}
- HackCTF - classic Cipher 2
Hint : Key is Number
전치 암호 이용
글의 알파벳의 순서로 찾아낸다.
python의 경우 제일빠른 H,N,O,P,T,Y
-->465132
hreCp1 _ev_s1 17nr_y s17eer 132n_5
위 텍스트를 위 순서대로 바꾸면
HackCTF{C1pher_1s_very_1n7eres71n5_123}
- HackCTF - magic PNG
magic png
PNG의 시그니쳐 89 50 4E 47 0D 0A 1A 0A
IHDR (49 48 44 52) iHDR은 말 그대로 헤더 즉 PNG의 여러 메타 데이터가 저장된다.
IDAT (49 44 41 54) 실제로 이미지에 대한 데이터가 저장된다.
IEND (49 45 4E 44) 파일의 끝을 알려주는 청크
png 시그니처
IDAT이 소문자로 나타나있는 걸 확인
변경하면
flag
: HackCTF{c@n_y0u_$ee_m3?}
- Dreamhack - Textbook-RSA
TEXTBOOK
CCA기법 사용
#!/usr/bin/python3
from Crypto.Util.number import getStrongPrime, bytes_to_long, inverse
class RSA(object):
def __init__(self):
self.p = getStrongPrime(512)
self.q = getStrongPrime(512)
self.N = self.p * self.q
self.e = 0x10001
self.d = inverse(self.e, self.N - self.p - self.q + 1)
def encrypt(self, pt):
return pow(pt, self.e, self.N)
def decrypt(self, ct):
return pow(ct, self.d, self.N)
rsa = RSA()
FLAG = bytes_to_long(open("flag", "rb").read())
FLAG_enc = rsa.encrypt(FLAG)
print("Welcome to dream's RSA server")
while True:
print("[1] Encrypt")
print("[2] Decrypt")
print("[3] Get info")
choice = input()
if choice == "1":
print("Input plaintext (hex): ", end="")
pt = bytes_to_long(bytes.fromhex(input()))
print(rsa.encrypt(pt))
elif choice == "2":
print("Input ciphertext (hex): ", end="")
ct = bytes_to_long(bytes.fromhex(input()))
if ct == FLAG_enc or ct > rsa.N:
print("Do not cheat !")
else:
print(rsa.decrypt(ct))
elif choice == "3":
print(f"N: {rsa.N}")
print(f"e: {rsa.e}")
print(f"FLAG: {FLAG_enc}")
else:
print("Nope")
코드는 암호화, 복호화 코드가 모두 깔려있음
따라서
평문M을 구하기 위해
암호문 C * (임의의 숫자, 2)^e 를 하면 (M*2)^e 가 된다.
이때 이것을 복호화 하면
M*2 가 나온다. 따라서 복호화 한 값의 /2를 하면 평문이 튀어나온다.
Python 코드 작성이 헷갈려 아래 사이트 참고하여 작성.
다음과 같이 작성
Flag = DH{6623c33be90cc27728d4ec7287785992}
- HackCTF - secret Document
암호화 체크해주는 flag
이쪽을 0809à 0000으로 변경.
HackCTF{N0n3_9@$$w0rd}
- HackCTF - classic Cipher 1
압축 해제 후 실행
압축을 해제하니 txt 파일이 하나 있었음, 해당 파일을 열어보니 아래와 같은 문자열이 저장되어 있었음
문제에 주어진 Hint가 파이썬 배열 형식과 유사하여 파이썬으로 힌트를 그대로 작성함
결과로 나온 출력물도 flag 형식이 아니었기에 가장 단순한 카이사르 암호화 방식으로 복호화해봄
7씩 자릿수를 이동해 복호화 한 결과, flag 값을 확인할 수 있었음
(https://www.dcode.fr/caesar-cipher)
flag: HackCTF{D0_y0u_kn0w_C4es4r?}
- HackCTF - 나는 해귀다
압축 해제 후 문제 확인
주어진 파일을 확인하니 ‘waytogo.png’ 이름의 그림 파일이 하나 있었음, 해당 파일을 확인하니 hex 값을 뒤집어 놓았다는 힌트를 확인할 수 있었음
이에 hex 값을 확인하기 위해 HxD에서 해당 파일을 열어 hex 값을 살펴봄
값을 살펴보던 중, 맨 마지막 부분의 png 시그니처가 반대로 기입된 것을 확인함
즉, 다른 그림 파일 하나의 hex 값이 waytogo.png 파일 마지막 부분에 역순으로 저장되어 있음을 짐작할 수 있었음
이에 파일간의 경계를 찾기 위해 PNG 파일의 footer 값을 탐색함
(PNG의 footer 값은 49 45 4E 44 AE 42 60 82)
위와 같이 역순의 footer 값을 찾을 수 있었음
이후 해당 부분부터 마지막까지를 새로운 텍스트 파일로 저장하고, 파이썬 코드를 이용해 hex 값을 다시 역전시킴
(코드 참고: https://snwo.tistory.com/77)
flag 값까지 역전되어 있는 것을 확인할 수 있었음
flag: HackCTF{Y0u_tu2n3d_th3_$t@ge_u95ide_d0wn!}
'4-7. 2021-2 심화 스터디 > CTF' 카테고리의 다른 글
[2021.11.13] dreamhack, HackCTF 풀이 (0) | 2021.11.13 |
---|---|
[2021.11.06] dreamhack, HackCTF reversing, CTF문제풀이 (0) | 2021.11.06 |
[2021.10.09] HackCTF 풀이 (0) | 2021.10.09 |
[2021.09.25] HackCTF풀이 (0) | 2021.10.08 |
[2021.09.18] Dreamhack rev-basic 외 풀이 (0) | 2021.09.18 |