목록CTF (15)
Information Security Study

개인 키의 일부 비트가 누락됐다. 암호문을 재구성하고 해독할 수 있는가? from Crypto.PublicKey import RSA from Crypto.Util.number import bytes_to_long from Crypto.Util.number import long_to_bytes content = open("2048_key_original.priv", "rb").read() key = RSA.import_key(content) filecontent = open("plaintext_message", "rb").read() ct = pow(bytes_to_long(filecontent), key.e, key.n) open("ciphertext_message", "wb").write(long_to..

암호화된 플래그가 제공되었다. 암호화된 플래그: cG9jdGZ7dXdzcF80MTFfeTB1Ml84NDUzXzQyM184MzEwbjlfNzBfdTV9 플래그가 base64로 인코딩한 문자열 같이 보여서 base64 디코딩을 해주었다. 플래그 획득!

문제 코드를 작성하다가 키를 까먹었다고 한다. 암호문이 base64: LEs2fVVxNDMfNHEtcx80cB8nczQfJhVkDHI/Ew==로 제공되었다. #include "flag.h" #include #include #include int main() { _Static_assert(sizeof(key) == 7, "Invalid key size!"); char* output = malloc(sizeof(flag)); strncpy(output, flag, sizeof(flag)); int flag_len = strlen(flag); int key_len = strlen(key); for(int i = 0; i < flag_len - key_len + 1; i++) { for(int j = 0; j ..

- 서버는 256비트의 비밀 정보를 가지고 있다. - 서버는 이 비밀을 여러 조각으로 나눈다. (Shamir Secret Sharing 알고리즘을 사용) - 각 입력에 대해 서버는 여러 조각 중 n-1개를 제공한다. Shamir Secret Sharing은 비밀을 분할하고 나누어진 조각 중 일부를 가지고 있어도 원래 비밀을 복원할 수 있는 방법을 제공하는 암호학적인 기술이다. 이 경우 n-1개의 조각을 받고 나머지 하나를 알려주지 않는 서버로부터 비밀을 복원해야 한다. 약점은 다항식 계수를 생성하는 방법에 있다 getRandomRange(0, self.p - 1). getRandomRange(a, b)가 a와 b 사이의 숫자를 생성한다는 것을 알 수 있으므로 계수는 [a, b) 범위 내에 있을 것이다. ..

nc에 접속하여 어떤식으로 동작하는지 확인했다. 숫자를 입력해서 어딘가로 보내는 것 같다. 리눅스 다루는게 어려워서 어떤식으로 풀어야 하는지 감을 못잡았다.. 이 문제에는 Docker image가 제공된다. ctf 문제에 Docker image가 제공되는 이유에 대해 찾아보았다. Docker image가 제공되는 이유 1. 일관성 있는 환경 제공: Docker 이미지를 사용하면 대회 참가자들이 모두 동일한 환경에서 대회 문제를 풀 수 있다. 이것은 공정한 경쟁을 보장하며, 참가자들이 자신의 로컬 환경 설정으로 인한 문제로부터 면제된다. 2. 보안: Docker 컨테이너는 격리된 환경에서 실행되므로 대회의 보안을 강화할 수 있다. 대회 중에 문제 해결 과정에서 발생하는 잠재적인 보안 문제를 최소화한다. 3..

간단한 crypto 문제이다. 문제에 플래그가 인코딩 되어있다. Base64로 인코딩 된 것 같다. Base64 인코딩은 데이터를 텍스트 형식으로 표현하기 위한 방식 중 하나이다. 보통 이진 데이터를 텍스트로 변환하여 전송이나 저장할 때 사용한다. import base64 encoded_string = "cG9jdGZ7dXdzcF80MTFfeTB1Ml84NDUzXzQyM184MzEwbjlfNzBfdTV9" decoded_bytes = base64.b64decode(encoded_string) decoded_string = decoded_bytes.decode('utf-8') print(decoded_string) 파이썬으로 인코딩된 데이터를 디코딩했다. 플래그를 얻을 수 있었다!

Insecure Mode 1 문제이다. #!/usr/bin/python3 from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import os import signal def timeout(a1, a2): print("BYE ~") exit(-1) class InSecureCipher: def __init__(self, key): self.size = 16 assert len(key) == self.size self.key = key self.cipher = AES.new(key, 1) def encrypt(self, pt): return self.cipher.encrypt(pad(pt, self.size)) def decry..