[CCE2019] hwp Write up

2019-10-15

2019 사이버공격방어대회 예선에서 한문제를 풀었다.

삽질을 너무 많이 하긴 했지만 어쨌든 풀었기에 정리는 해 두려 한다 ㅎㅎ

내가 푼 문제는 hwp였다.

문제에서는 report.hwpx 파일 한개만 주어진다.

그런데 열어봐도 별다른 건 없어보였다.

그래서 그냥 확장자를 zip으로 바꾸고 압축을 풀어보았더니 BinData 디렉토리 아래에서 image1.ps라는 파일을 찾을 수 있었다.

ps 파일은 PostScript 파일이라고 한다.

포스트스크립트 - 위키백과

그런데 이 파일이 뭔가 한글 악성코드에 많이 쓰이나보다.

한글 악성코드로 검색하니까 Post Script를 분석 한 글을 쉽게 찾을 수 있었다.

어쨌든 스크립트 파일이라고 하니까 이를 텍스트 에디터에서 열어 보았다.

Sublimetext에 메모장에 VSCode로도 열어봤는데 여는데 오래걸리거나 결국 다 터져서 HxD랑 Notepad++로 겨우 확인할 수 있었다.

열면 이런식으로 엄청나게 많은 코드를 확인할 수 있다.

처음에는 이 아래의 코드를 다 분석했었다.

그런데 다 분석하고 보니 그냥 해쉬값 처럼 생긴 변수를 String으로 선언하고 하나씩 글자를 넣는 형태인데다가, 중간에 의미없는 1 sub1 add가 너무 많았다.

그리고 저 변수들에 다 값을 넣어서 파일 35를 만들었는데 아무리 봐도 실행파일도 아니고 스크립트 파일도 아니라서 반쯤 포기했었다.

그러다가 맨 상단에 /CCE2019 하고 아래처럼 선언 된 부분이 도대체 무슨 값인지 모르겠어서 얘를 HxD에서 열어 보았다.

/CCE2019 <2e39f57b3338326348657473b9966e64f665774c6f676963027567386164397d6363657b303832634c65747346696e644e65774c6f67696342756738d164397d6d7cdf75308c3bae6ddd753f8b483a0c2716573c1d080e112318475b000a57121743071e104a470d6c0c1a5302263d44230a1329416a6469667567386164397dd6e357a4c1d96eefbd8428ffb78832e8cbef2fc19f8635efc7ff39b5918565f1310a0613c1d96eef4c65747346696e641e20774c23666b63f68729656164397d6363657bd038306247647a67466b6e644e67774c6f676963426567386174397d6343657b303872634c757473466b6e644865774c6f676963447567386164397d6353657b303a32634c65747344692ee14e65674c6f776963427577386174397d6363657b203832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963425567387d64397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832636211110b32696e648d64774c6f776963427767386166397d6363657b303832634c65747366696e046017132d1b0669631e7567386144397d6361657b303c32634c65747346696e644e65774c2f676923427567386164397d36e88987d8b132634c05fd9677bb0aef1c55fc1e63ec3b77c9074f37d62e1f4c9c52a5d70c594e616045b5bc4b68a986be3720c73d77e2217e74b7b3211cbcbd172964ab60b37a7bc73d5472958a522dc551fc4db956965282d9a6f76c65fe45831691784dc0091e6810962bcd314a659d03fc4024ec317f43a6ec3cea65e9f4274741206b596b391d9a942b1933e576a5e32a2401021d632a020e5608eddf290b2f125d37c7e752b3322324113f065e181cd0b3ba8c0a3873bc36690b67682c0bd8647b306b620b1becebb5b9bc852b1754a51e07675bc3c627356a3036691588364b40cfedbba526752f1bc65a6e64c7851d483f0d76352a0021a6e79bec4c9c34322c676e5a4e4a7d0f8c93ecae116e2e78c812676963a9a48ea861643995cf9c9a841f707c2004001803680c16014e8e1c7daf383909401f65680b66537f340bbf8dea77cdb6df54b415fe6d6d4d8a31fa004b6f58a3f6763769370c2bebea819aaeb5f8464e14e0b40750036e301ee8336863373a0b6f22c9639eb1ba916788ab2858fea4e41e9aa119463e0655c50af0b3ba0d690bb2c0c56e9eb1d1ed9c9c9a337e7b7a0620155a163e0c6e8c4d9a88b30e131d02211e024a4f075610633ea67b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b84ca7c3e4c6574734b696e640e65774c734769635e7167386164397d6373657bf33932636211110b324d030a4e65774c6f4769635e7567384f165d1c1702657b2c1832630c657473681b0a053a045336151d0d01257567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d6363657b303832634c65747346696e644e65774c6f676963427567386164397d>

그랬더니 짜란~ flag가 나왔다…ㅂㄷㅂㄷ

난 이것도 모르고 3시간을 넘게 밑에 코드만 분석하고 있었다…ㅎㅎ

그래서 이 값을 인증했는데 또 인증 해 보니 flag가 아니라고 했다.

문제 디스크립션을 다시 읽어보니 flag의 값은 30초마다 변한다고 적혀 있었다…

그래서 아래와 같이 소스코드를 짜서 flag의 값을 구했다.

import requests
import os
import zipfile
import shutil

url = "http://hwp3.cstek.shop/report.hwpx"

r = requests.get(url, allow_redirects=True)
open("report.zip", "wb").write(r.content)

report = zipfile.ZipFile("./report.zip")
report.extractall()

f = open("./BinData/image1.ps")
data = f.readline()[0xbca:0xc0a]

flag = ""

for i in range(0, len(data), 2):
	flag = flag + chr(int(data[i:i+2], 16))

print flag

os.remove("report.zip")
os.remove("settings.xml")
os.remove("mimetype")
os.remove("version.xml")
shutil.rmtree("BinData")
shutil.rmtree("Preview")
shutil.rmtree("META-INF")
shutil.rmtree("Contents")

그 결과 앞서 구한 값과 가운데 문자열은 같고 앞의 4글자와 뒤의 4글자가 다른 flag 값을 얻어 인증할 수 있었다.

FLAG : cce{082cLetsFindNewLogicBug8ad9}

이번에는 삽질하느라 시간을 너무 허비했는데 다음에는 제발 삽질하지 않고 한문제만 더 풀 수 있었으면 좋겠다 ㅎㅎ