SSTF My Stego

2020. 8. 18. 16:300x0C Forensic

728x90

회사에 휴가 내고 SSTF 컨퍼런스를 보다가 CTF도 있다는 것을 듣고 문제를 풀어보았다. 

데드라인 조차 관심이 없었기에 마감하고 3분 뒤에 풀어버렸다. 못내 아쉽당 ㅎㅎ

밥은 아주 중요하다.. 밥먹고 생각을 잘못하고 있었던 것을 깨닫고 풀었다.

문제 유형 : ml 프로그래밍 코드 분석 

기술 : 스테가노그래피 

Hint :  Ocaml ,Pillow 

나의 약점 : Python 문법 

- 문법 뒤지는데만 40분 이상 쓴 거 같다. 

 

사진 관련 문제를 접해본게 손가락에 꼽히지만, 사진 관련 문제를 볼 때마다 사용한 모듈이 Pillow 였고, 문제 명 또한 스테고 이기 때문에 사진으로 장난을 쳐뒀을 거라는 생각을 할 수 있었다.

 

코드 분석은 여기만 하면 된다.

문제 풀 때 예전에는 문법 하나하나 다 찾아가며 분석했는데 아주 시간낭비라는 것을 깨닫고 그냥 느낌적으로 분석했다. 

즉 in이든 Some, Save_Quality 이런건 신경도 안썼다.

많이 해맸던 부분이 color.r - (color.r & 1) 부분을 어떻게 역연산 해야할까였는데 그림으로 그려보니까 뭔가 이렇게 풀면 될 거 같은데 라는 생각이 들었다.

color.r과 앤드연산 1을 취하게 되면 마지막 비트 값만 변한다. and 연산은 어차피 0과 1 둘중 하나가 나오게 된다.

 

df#read를 플래그라고 생각하면 

color.r - (color.r land 1) + ((color.g lxor color.b lxor flag) land 1)

 

스테가노에서 복잡한 연산이 나오지도 않을 거 같아서 color.r - (color.r land 1)을 color.r 자체로 생각하였다.

 

즉, flag = (color.r ^ color.g ^ color.b) & 0x1 

 

from PIL import Image 
import numpy as np
from Crypto.Util.number import long_to_bytes
img = Image.open(r"./challenge.bmp")
width, height = img.size
print(width)
print(height)

arr = np.array(img)
flag = "0b"

for x in range(height):
	for y in range(width):
		r,g,b = arr[x][y]

		# type <class 'numpy.uint8'> 
		#print(f"{type(r)} {type(int(g))} {b}")
		
		'''
		type error:
		can only concatenate str (not "numpy.int64") to str
		'''
		flag += str((int(r) ^ int(g) ^ int(b)) & 0x1)

#print(f"{flag}") 

f = open("flag","wb")
# string to hex 
'''
type error:
a bytes-like object is required, not 'str'

f.write(bytes.fromhex(flag).decode('utf-8'))
'''
flag_int = int(flag, 2)
flag_bytes = long_to_bytes(flag_int)
#print(flag_bytes)
f.write(flag_bytes)

f.close()


'0x0C Forensic' 카테고리의 다른 글

[Hack The Box] Obscure - Not finished yet  (0) 2022.07.20
cyberdefenders - MrRobot  (0) 2022.05.26
HackTheBox MarketDump  (0) 2020.07.29
H&M 19번  (0) 2020.07.05
H&M 32번  (0) 2020.07.05