물먹는산세베리아

[ctf-d] d4rth는 더러운 방법을... 본문

Waregame & CTF/Forensic

[ctf-d] d4rth는 더러운 방법을...

suntall 2022. 2. 23. 23:36
문제

풀이

[ 사용 도구 ]

Diffimg

 

겉으로 보기에는 똑같이 생긴 사진 파일이 주어졌다.

리눅스에서 cmp로 돌려봤지만 너무 많은 Hex 값들이 나왔다.

cmp

diff, comm와 함께 두 파일을 비교할 때 많이 쓰는 명령어이다.

리눅스에서 사용 가능하다.

 

리눅스 cmp, diff, diff3, comm - 파일 비교

파일을 비교하는 가장 간단한 방법은 cmp, 그리고 보다 자세한 파일비교를 할 때에는 diff, 세개의 파일을 비교하려면 diff3을 이용합니다. 두파일에 대하여 각 행단위 비교를 할 때에는 comm을 이용

webdir.tistory.com

 

이렇게 푸는 건 아닌 것 같아서 좀 더 구글링을 해본 결과

DiffImg 프로그램을 사용하면 된다고 한다.

 

좌측 상단에 노란색으로 뭔가가 칠해진 걸 볼 수 있다.

색이 칠해진 부분은 1로, 칠하지 않은 부분은 0으로 해서 나온 바이너리 값을 텍스트로 변환하면 flag를 구할 수 있을 것 같다. (혹은 그 반대거나)

 

이제 저 좌표를 구해서 바이너리 값으로 바꿔야 한다.

크기는 가로 49, 세로 7이다.

 

from PIL import Image

다른 풀이를 찾아보니까 다들 이미지 픽셀값을 가져오는 코드를 작성해서 두 파일의 값을 비교했다.

같으면 1을, 다르면 0을 문자열에 붙인 후 아스키 코드로 변환했다.

 

하지만 나는 코드 짜는 걸 굉장히 싫어하기 때문에 노가다 했다.(짤 걸..)

1110111101101110001101101110110110110011010111001
0111111111110001111111111111011011111111111101111
1000000000101001111010010101111101011010100110111
0100010001000100001000000010100100000100010011011
1010110100000000110101100111110110011110111110111
0000100100101001011001101001100110100010011010110
0010001101101010101010011101100100111011101011111

칸을 구분하는 게 생각보다 쉬워서 그냥 눈으로 보면서 노랑은 1, 검은색은 0으로 생각하고 적어봤다. (따라하지 마세요)

 

띄어쓰기, 엔터 상관없이 알아서 변환해주는 사이트가 있어서 바로 돌려봤다.

뭔가 대단히 잘못됐다.

 

다른 분의 풀이(파이썬 코드)를 보니 세로를 기준으로 숫자를 붙였어야 했다.

1010100

1101000

이런식으로 ..

그냥 냅다 왼쪽 -> 오른쪽으로 쭉 적었던 게 문제였다.

 

그래서 이번에는 세로 기준으로 몇개 적어봤더니 이상하게 나온다.

1010100(2) 는 84 즉, T이다. 엔터, 띄어쓰기를 알아서 인식해서 잘 ~ 하는 게 아니라 그냥 싹 다 붙여서 변환하는 것 같다. (툴 너무 믿지 말자. 남들이 코드 쓴 데는 다 이유가 있다.)

 

일단 필요한 모듈부터 설치하자.

이미지에서 픽셀 값을 추출하려면 Pillow 모듈을 불러와야 한다.

다음은 칼리리눅스(python3)에서 다운받는 과정이다. 

sudo apt install python3-pip
pip install --upgrade pillow

최신 버전으로 업그레이드도 시켜줬다.

from PIL import Image

im1 = Image.open('./encrypted.png')
im2 = Image.open('./original.png')

px1 = im1.load()
px2 = im2.load()
string = ''
for x in range(49):
    data = ''
    for y in range(7):
        if px1[x,y] == px2[x,y]:
            data += '0'
        else:
            data += '1'
    string += chr(int(data,2))
print(string)

SHA256로 돌리면

?????????????

 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ엔터가 문제였음 

또 안된다 ㅇ ㅏ...

대문자로 하니까 된다. ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ r

 

정답