cryptohack을 공부하면서 얻은 지식들을 정리하려고 한다.
Finding Flags
flag 형식을 알려주는 문제이다.
crypto{y0ur_f1rst_fl4g}
Great Snakes
python3로 주어진 파일을 실행시키면 flag를 출력해 준다. python 파일은 주어진 리스트의 원소들을 0x32랑 XOR 시켜서 문자로 출력해 주는 프로그램이다.
crypto{z3n_0f_pyth0n}
ASCII
정수를 chr() 함수를 이용해 ascii 코드로 변환시키는 문제이다.
print(''.join([chr(i) for i in [99, 114, 121, 112, 116, 111, 123, 65, 83, 67, 73, 73, 95, 112, 114, 49, 110, 116, 52, 98, 108, 51, 125]]))
crypto{ASCII_pr1nt4bl3}
HEX
hexadecimal로 된 숫자들을 byte로 변환하는 문제이다. bytes.formhex() 함수를 사용하면 된다.
bytes.fromhex('63727970746f7b596f755f77696c6c5f62655f776f726b696e675f776974685f6865785f737472696e67735f615f6c6f747d')
crypto{You_will_be_working_with_hex_strings_a_lot}
Base64
hex로 된 값을 byte로, byte로 된 값을 base64 decode 해주면 된다.
import base64
base64.b64encode(bytes.fromhex('72bca9b68fc16ac7beeb8f849dca1d8a783e8acf9679bf9269f7bf'))
crypto/Base+64+Encoding+is+Web+Safe/
Bytes and Big Integers
이번엔 base 10, 즉 decimal을 byte로 바꿔주면 된다. long_to_bytes() 함수를 사용하려면 Crypto.Util.number을 import 해주면 된다.
from Crypto.Util.number import *
long_to_bytes(11515195063862318899931685488813747395775516287289682636499965282714637259206269)
crypto{3nc0d1n6_4ll_7h3_w4y_d0wn}
XOR Starter
주어진 label이라는 문자를 각각의 문자를 13과 XOR 해주면 된다.
'crypto{'+''.join([chr(ord(i)^13) for i in 'label'])+'}'
crypto{aloha}
XOR Properties
XOR의 특징들을 알려준다. 다음의 특징들은 매우 많이 쓰이고, 중요하기 때문에 잘 알아두는 것이 좋다.
Commutative: A ⊕ B = B ⊕ A
Associative: A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
Identity: A ⊕ 0 = A
Self-Inverse: A ⊕ A = 0
위의 XOR의 특징을 활용하여, 다음과 같이 주어졌을 때 FLAG를 구하면 된다.
KEY1 = a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf
KEY1 = 0xa6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
FLAG = 0x04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf ^ 0xc1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1 ^ KEY1
print(bytes.fromhex(hex(FLAG)[2:]))
crypto{x0r_i5_ass0c1at1v3}
Favorite byte
주어진 hex와 어떤 byte를 XOR 해서 flag를 구하면 된다. 문제를 풀면서 안 사실인데, bytes 객체를 for 문으로 반복하면 각 바이트의 정수 값이 반환된다.
a = bytes.fromhex('73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d')
for i in range(256):
b = ''.join([chr(j^i) for j in a])
if 'crypto' in b:
print(b)
crypto{0x10_15_my_f4v0ur173_by7e}
You deither know, XOR you don't
secret key로 flag를 encrypt 했다고 한다. 힌트에 플래그 포맷을 기억하라고 되어있으니 플레그 포맷에 맞춰서 출력을 해보자.
a = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
print(''.join([chr(i ^ ord(j)) for i,j in zip(a, 'crypto{')])) # myXORke
zip() 함수는 여러 개의 iterable 한 객체를 받아서 각 iterable에서 같은 위치의 요소들을 쌍으로 묶어준다. 각 객체의 길이가 다를 때는, 짧은 객체의 길이에 맞춰서 출력해 준다.
출력 결과를 보면, myXORke 이다. 뒤에 y를 붙여서 XOR 시켜보자.
a = bytes.fromhex('0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104')
print(''.join([chr(i ^ ord(j)) for i,j in zip(a, 'myXORkey'*10)]))
crypto{1f_y0u_Kn0w_En0uGH_y0u_Kn0w_1t_4ll}
암호학도 앞으로 꾸준히 공부할 예정이다. 그동안 CTF를 할 때만 수박 겉핥기식으로 공부했었는데 본격적으로 공부해서 잘해지고 싶다.
'cryptohack.org' 카테고리의 다른 글
[cryptohack.org] MODULAR ARITHMETIC (0) | 2024.10.04 |
---|