Cryptohack 에서 제일 안되는 부분이
XOR 개념이였기 때문에 따로 정리를 할것이다
그리고 부족했던 ascii 개념을 더 정리해보자면 

                                           ASCII 코드표


ascii 코드 = 7bit 
영문 알파벳을 사용하는 대표적인 문자 인코딩이다 
chr() ord()
chr 함수는 ascii숫자를 대응하는 문자로 바꿔주고 
ord 는 문자를 ascii 값으로 변환해주는거임

 

print(type(chr(99)))

print(chr(99) == "c")

print(99 == ord("c"))


99를 ascii 코드에 대응하게 chr 을 써서 문자 "C" 로 바꾸었으니까 <class 'str'>
같은이유로 TRUE
C를 다시 ord를 사용해 ascii 코드로 변환시키면 99이니까  TRUE

# Favourite byte

For the next few challenges, you'll use what you've just learned to solve some more XOR puzzles.
I've hidden some data using XOR with a single byte, but that byte is a secret. Don't forget to decode from hex first.
73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d

다음 몇 가지 챌린지에서는 방금 배운 것을 사용하여 더 많은 XOR 퍼즐을 풀게 됩니다.
단일 바이트로 XOR을 사용하여 일부 데이터를 숨겼지만 해당 바이트는 비밀입니다. 
먼저 16진수에서 디코딩하는 것을 잊지 마십시오.

일단 문제를 먼저 바이트 형태로 바꿔서 디코딩을 해준뒤 
모든 경우의 수를 찾아 무차별적으로 1btyes에 xor 을 각각해줌으로써 플래그값을 알아낼 것이다.

from Crypto.Util.number import *
fl = bytes.fromhex("73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d")

for i in range(256):
    for char in fl:
        print(chr(char ^ i), end="")
    print()

계속 증가하는 변수인 i를 1bytes에 경우의 수를 다 넣는 것인데 
이때 1bytes = 8bit
1bit = 0과1을 나타내기 때문에 2⁸ = 256을 대응하는것이다.
그럼 char이라는 변수 안에 문제를 넣고 문제와 증가하는 변수 i를 xor 시켜서 chr 함수로 문자로 나오게 해보면

Þ
ß
Þ
±
ß
Û
± ....

이런식으로 나오기 때문에 end 함수를 써주면 많은 결과값중에 

nelhsg,d-,C-)CqeCz(j,in-+/C~e+ya
~odmirf-e,-B,(BpdB{)k-ho,*.Bd*x`
}lgnjqe.f/.A/+AsgAx*h.kl/)-A|g){c
|mfokpd/g./@.*@rf@y+i/jm.(,@}f(zb
crypto{0x10_15_my_f4v0ur173_by7e}
bsxqunz1y01^04^lx^g5w1ts062^cx6d|

이렇게 플래그를 찾을 수 있다 하지만
플래그만 딱 출력 하는, 더 좋은 코드를 짤 수 있는데  if 문을 사용해서
문제 첫글자, 1byte가 flag 포맷일때만 출력이 되게끔 코드를 짜보겠다 

from Crypto.Util.number import *
fl = bytes.fromhex("73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d")

for i in range(256):
    if fl[0] ^ i == ord("c"):
        for char in fl:
            print(chr(char ^ i),end="")

 

이 문제에서 flag 포맷은 crypto{}
만약 fl 변수의 0번째 i랑 xor 했을때가 c 일때만 다음 for문으로 넘어가게끔 코드를 짠것이다.
이때 C는 ord 함수를 사용해서 ascii 코드로 변환해 조건문을 작성해준다. 
만약 조건문이 성립이 되지않는다면 다음 for문으로 안넘어가기 때문에 결국 print 까지도달을 안해서 아무것도 출력이 되지 않을것이다.
crypto{0x10_15_my_f4v0ur173_by7e}
그럼  flag만 뽑아서 출력 해 줄 수 있다
flag 포맷을 잘이용하면 된다는 사실을 알았다.. 이 경험으로 ,, flag 포맷에 대한 설명도 세미콜론때  나름 잘했다 ㅋㅋㅋ

 

# SingleByteXor

dramhack에 비슷한 예제가 있다 

똑같이 단일 바이트라는 점을 이용해서 작성하면 된다 

from Crypto.Util.number import*

fl = bytes.fromhex("54586b6458754f7b215c7c75424f21634f744275517d6d")

for i in range(256):
    if fl[0] ^ i == ord("D"):
        for ch in fl:
            print(chr(ch ^ i), end="")

 

문제를 빼다 박아 놓은 수준으로 똑같이 풀었다 flag 포맷은 다르니까 그 점만 다른걸 제외하면 코드는 똑같다.
DH{tHe_k1LleR_1s_dReAm} 

 

글을 마치며 

xor 개념 자체도 나름 이해한거 같고 ascii에 대한 이해는 확실하게 되었다

 C+F 해서 flag 값을 찾아도 되는데 더 완벽한 코드를 짤 순 없을까 하면서 고민해보고 

이것저것 시도하는 과정이 나름 재미있었다 이런 경험으로 

코드작성할때 이거에는 이 함수 써야지, 이렇게 해야지 이런 생각 범위가 처음보다 확실히 늘어난거 같다 

 

+ Recent posts