일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- disk
- ZIP
- 침해사고대응
- Android
- ctf-d
- crack
- 파일해시생성
- 모바일프로그래밍
- swing
- John the ripper
- SW에듀서포터즈
- 써니나타스
- Interceptor
- shadow
- Reversing
- 안티디버깅
- upx
- K-sheild Jr
- 케쉴주
- tar
- Mobile
- K-shield Jr 10기
- Frida
- CodeEngn
- Multimedia
- 리버싱핵심원리
- Autoware
- 디스크
- 포렌식
- Today
- Total
물먹는산세베리아
[ctf-d] d4rth는 더러운 방법을... 본문
문제
풀이
[ 사용 도구 ]
Diffimg
겉으로 보기에는 똑같이 생긴 사진 파일이 주어졌다.
리눅스에서 cmp로 돌려봤지만 너무 많은 Hex 값들이 나왔다.
cmp
diff, comm와 함께 두 파일을 비교할 때 많이 쓰는 명령어이다.
리눅스에서 사용 가능하다.
이렇게 푸는 건 아닌 것 같아서 좀 더 구글링을 해본 결과
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
정답
'Waregame & CTF > Forensic' 카테고리의 다른 글
[ctf-d] 저희는 디스크 이미지를 찾았습니다. (0) | 2022.02.24 |
---|---|
[ctf-d] Tommy는 프로그램을 작성했습니다. (0) | 2022.02.24 |
[논문] 클라우드 (0) | 2022.02.23 |
[ctf-d] 내 친구는 이것이 특별한... (0) | 2022.02.22 |
[ctf-d] 판교 테크노밸리 K기업에서… #2 (0) | 2022.02.22 |