c = 'label'
e = ''
for i in c:
i = ord(i)
e += chr(i^13)
print(e)
c = 'label'
print("".join(chr(ord(i)^13) for i in c))
from pwn import *
c = 'label'
print(xor(c, 13))
앞의 설명과 같이 pwntool 모듈에서 xor()을 사용해 해결할 수도 있습니다. pwntool 모듈을 사용한 경우 결과가 바이트 문자열로 옴을 확인할 수 있습니다. (밑에 결과는 pwntool 모듈을 사용하지 않은 결과 입니다.)
from pwn import *
k1 = bytes.fromhex("a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313")
k23 = bytes.fromhex("c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1")
fk123 = bytes.fromhex("04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf")
print(xor(fk123, k1, k23))
from pwn import *
c = bytes.fromhex("73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d")
for i in range(256):
print(xor(c,i))
single byte이므로 00부터 FF까지 xor 연산을 해주는 코드를 실행하면 위와 같이 결과들이 나열이 됩니다. 이중 flag 형식을 가진 것을 찾으면 위와 같습니다.
from pwn import *
print(len("0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104")/2)
e = bytes.fromhex("0e0b213f26041e")
f = str.encode("crypto{")
print(xor(e,f))
e = bytes.fromhex("0e0b213f26041e480b26217f27342e175d0e070a3c5b103e2526217f27342e175d0e077e263451150104")
f = "myXORkey"*5+"my"
f = str.encode(f)
print(xor(e,f))
문제에서 암호화가 된 암호문과 xor연산으로 생성되었다고 기법을 알려주고 있지만 암호화에 사용된 키는 알려주고 있진 않습니다. 이때 문제 설명처럼 flag 형식을 이용하면 되는데 flag의 내용은 모르므로 내용이 나오기 전 정확하게 아는 부분은 "crypto{" 까지 입니다. 따라서 암호문 일부를 이 부분과 xor연산을 시키면 키의 부분을 알 수 있습니다. "myXORke" 가 생성되므로 "myXORkey"로 예상을 하고 암호문 길이만큼 늘려서 xor 연산을 시키면 flag를 구할 수 있습니다. ( xor()에서 길이가 암호문과 키의 길이가 달라도 자동으로 반복 되어서 늘릴 필요가 없었습니다... )
이렇게 해서 CryptoHack의 첫번째 course를 마쳤습니다. xor 연산과 형변환은 crypto에서 기본으로 보입니다. ( 또한 xor 연산 전 항상 bytes로 변환해줍니다. )
'security > crypto' 카테고리의 다른 글
[Dreamhack] ICM2022 풀이 (0) | 2023.12.17 |
---|---|
[CryptoHack] Modular Arithmetic (1) (0) | 2023.11.22 |
[CryptoHack] Introduction to CryptoHack (1) (0) | 2023.11.20 |
[Dreamhack] Textbook-DSA 풀이 (0) | 2023.11.15 |
[Dreamhack] Textbook-RSA 풀이 (0) | 2023.11.13 |