티스토리 뷰

728x90
반응형

해당 문제도 hackthebox business ctf 에서 나왔던 문제와 매우 유사하였습니다. 그 당시에는 doc 파일이거나 ppt 파일이었다면 해당 문제는 hwp 파일 문제였습니다.

 

문제를 풀 때 당시에는 따로 hwp 파일을 분석해본 경험이 없고, 포렌식 분야도 잘 몰라서 그냥 냅다 hex editor 로 열어보았습니다. 처음 보는 file format 이었어서 검색을 해보았습니다.

https://filesignatures.net/index.php?page=search&search=D0CF11E0A1B11AE1&mode=SIG 

 

File Signature Database:: D0CF11E0A1B11AE1 File Signatures

 

filesignatures.net

그리고 동시에 strings 명령어로 문자열들을 추출해보았습니다.

strings "코로나바이러스 대응 긴급 조회.hwp" > test.txt

그리고 의미있는 문자열들을 추출하기 위해서 10글자 이상의 문자열만 추출해보았는데 결과는 아래와 같이 나왔습니다.

HWP Document File
9656E63203D2062797465617272617928290A090A09666F72206920696E2072616E6765286D73675F73697A65293A0A09096D73675F786F72203D206D73675B695D205E206B65795B69256D73675F73697A655D0A0909656E632E617070656E64286D73675F786F72290A090A0972657475726E20656E630A090A646566206D61696E28293A0A096D736728290A096B6579203D20223235363839220A090A09656E635F6D7367203D20656E635F786F72286D73672E656E636F646528292C206B65792E656E636F64652829290A0A2E2F7368656C6C636F64652835423542353535373432354337383330333134463639353535433732354534323543373833303332344135433645344629
64656620656E635F786F72286D73672C206B6579293A0A096D73675F73697A65203D206C656E286D7367290A096B65795F73697A65203D206C656E286B 6579290A09656E63203D2062797465617272617928290A090A09666F72206920696E2072616E6765286D73675F73697A65293A0A09096D73675F786F72203D206D73675B695D205E206B65795B69256D73675F73697A655D0A0909656E632E617070656E64286D73675F786F72290A090A0972657475726E20656E630A090A646566206D61696E28293A0A096D736728290A096B6579203D20223235363839220A090A09656E635F6D7367203D20656E635F786F72286D73672E656E636F646528292C206B65792E656E636F64652829290A0A2E2F7368656C6C636F64652835423542353535373432354337383330333134463639353535433732354534323543373833303332344135433645344629
	-8PGnMg#N
VbVq &l4boX
`;~3:xG^?f
GqP`GvAoZD[w
xsp{aJZ7tc
p@@}#p1i	DF.
OiCCPPhotoshop ICC profile
q\?<[$$\A4b
(e([/{[~"6:^
LwK3QznbbK

이상한 hex 값들이 쭉 나와서 ascii 변환을 해보았습니다. 그리고 의미있는 문자열들만 추출해본 결과 아래와 같이 나왔습니다.

def enc_xor(msg, key):
	msg_size = len(msg)
	key_size = len(key)
	enc = bytearray()
	
	for i in range(msg_size):
		msg_xor = msg[i] ^ key[i%msg_size]
		enc.append(msg_xor)
	
	return enc
	
def main():
	msg()
	key = "25689"
	
	enc_msg = enc_xor(msg.encode(), key.encode())

./shellcode(5B5B5557425C7830314F69555C725E425C7830324A5C6E4F)

간단하게 분석해보자면 enc_xor 이라는 함수가 있고 해당 함수는 xor 암호화 함수기 때문에 복화화도 동일한 방법으로 xor 하여 복호화할 수 있을 것으로 보였습니다. 그리고 암/복호화에 필요한 key 값은 main 함수에 정의되어 있는 것 같았습니다.

 

다만, msg 함수가 무엇인지 몰랐고, 유추해보기로는 shellcode 에 들어가 있는 값이 enc_xor 로 인한 cipher text 값으로 보였습니다. 해서 해당 값을 복호화를 해보았습니다.

 

def enc_xor(msg, key):
	msg_size = len(msg)
	key_size = len(key)
	enc = bytearray()
	
	for i in range(msg_size):
		msg_xor = msg[i] ^ key[i%key_size] 
		enc.append(msg_xor)
	
	return enc
	
def main():
	string = "5B5B5557425C7830314F69555C725E425C7830324A5C6E4F"
	byte_array = bytearray.fromhex(string)
	msg = byte_array.decode('unicode-escape')
	key = "25689"
	
	dec_msg = enc_xor(msg.encode(), key.encode())
	print(dec_msg.decode())

main()

결과는 아래와 같이 플래그 값이 나왔습니다.

C:\Users\domdomi\Desktop>python test.py
inco{3z_m4lw4r3}

 

728x90
반응형
댓글