2023. 1. 15. 14:36ㆍCTF
UgraCTF 2023에서 제가 풀었던 문제의 Writeup 입니다.
<Stegano>
문제를 보면 엑셀 파일을 하나 주는데, 이 파일을 열어보면 웬 이상한 모눈종이(?)가 보인다.
각 셀들을 잘 살펴보면 그냥 숫자만 입력되어 있는 셀이 있고, 수식이 입력되어 있는 셀들이 있다.
일단 시험삼아 수식이 들어있는 셀에 색을 입혀봤더니....
플래그 포맷이 나오는 것을 볼 수 있었다.. 그럼 플래그를 얻기 위해서는 수식이 들어있는 모든 셀을 색칠해보면 알 수 있지만 하나하나 색을 입히기에는 너무 오래 걸릴 것이다.
이걸 해결할 수 있는 방법이 엑셀에 수식 찾기 기능이다. 이 기능을 활용해 색을 입히면 플래그를 얻을 수 있다.
<Reverse>
문제를 보면 checker.py 파일을 주는 데, 파일의 소스 코드를 먼저 살펴보자.
import base64
import hashlib
import sys
def abort():
print("Wrong flag!")
sys.exit(1)
flag = input()
if len(flag) != 29:
abort()
if flag[17] != 'u':
abort()
if flag[:5] != 'ugra_':
abort()
if flag[9:3:-2] != 'nta':
abort()
if flag[-2:-15:-3].encode().hex() != '6138656a67':
abort()
if int.from_bytes(flag[6:18:2].encode(), "little") != 104927802781555:
abort()
if sum(ord(x) * 1000 ** i for i, x in enumerate(flag[19:-4])) != 56099111101106056:
abort()
if base64.b64encode(flag[-4:].encode()) != b'amRhag==':
abort()
if hashlib.sha256(flag.encode()).hexdigest() != 'c0046a207f060a3ca5dcb4a65073a84ca1456b40a2992964396590fd725d3e1f':
abort()
print("OK!")
플래그를 입력받으면 여러 가지 검증 절차를 통해 플래그인지 검사를 하는 코드인 것 같다. 우리는 이 검증 절차를 역으로 따라가면서 플래그를 복구해야 한다.
우선, shs-256 해시값을 검사하는 부분을 제외한 나머지 검증 부분을 통해 복구한 플래그는 다음과 같다.
ugra_astoni+h-ng_uj8jeoc8jdaj
+, - 는 아직 복구하지 못한 부분이다. 이 2글자는 Brute Force를 통해 복구를 해야 할 것 같다.
다음 코드는 내가 짠 Brute Force 코드다.
import base64
import hashlib
def abort():
print("[-] Wrong flag!")
flag = 'ugra_astoni+h-ng_uj8jeoc8jdaj'
words = 'abcdefghijklmnopqrstuvwxyz1234567890_'
find_flag = False
for i in words:
for j in words:
flags = flag.replace('+', i)
flags = flags.replace('-', j)
if len(flags) != 29:
abort()
continue
if flags[17] != 'u':
abort()
continue
if flags[:5] != 'ugra_':
abort()
continue
if flags[9:3:-2] != 'nta':
abort()
continue
if flags[-2:-15:-3].encode().hex() != '6138656a67':
abort()
continue
if int.from_bytes(flags[6:18:2].encode(), "little") != 104927802781555:
abort()
continue
if sum(ord(x) * 1000 ** i for i, x in enumerate(flags[19:-4])) != 56099111101106056:
abort()
continue
if base64.b64encode(flags[-4:].encode()) != b'amRhag==':
abort()
continue
if hashlib.sha256(flags.encode()).hexdigest() != 'c0046a207f060a3ca5dcb4a65073a84ca1456b40a2992964396590fd725d3e1f':
abort()
continue
print("OK!")
print('[+] find flag! ==> ' + flags)
find_flag = True
break
if find_flag:
break
* 결과
[-] Wrong flag!
...
[-] Wrong flag!
OK!
[+] find flag! ==> ugra_astonishing_uj8jeoc8jdaj
<Forensic>
문제에서 주어진 pcap 파일을 열어보면 HTTP 통신으로 hacker.jpg라는 이미지 파일을 전송한 흔적이 있는 것을 알 수 있다.
hacker.jpg가 어떤 이미지인지 알아보기 위해 hacker.jpg를 export 해서 직접 살펴보겠다.
우선, ASCII로 되어 있는 내용을 export하기 전, Raw로 변경해준다.
그런 다음, Save as...로 hacker.jpg를 다운로드해주면 이미지 파일을 얻을 수 있다. ( 참고로 HxD 같은 Hex Editor로 HTTP Request 내용은 지워줘야 한다. )
export한 hacker.jpg의 모습이다.
<Crypto>
이 문제는 좀 간단한 문제였다...
그냥 ROT13으로 디코딩하면 플래그를 얻을 수 있다.
플래그 획득
'CTF' 카테고리의 다른 글
2022 ChristmasCTF Writeup - Programming (0) | 2023.01.01 |
---|---|
2022 ChristmasCTF Writeup - Web (0) | 2022.12.31 |
squareCTF writeup (0) | 2022.12.01 |