[CTF] MISC 모음 ver.1

2018-10-02

제가 처음 CTF에 참여했을 때도 지금도 CTF 문제 목록에서 1~2순위로 보게 되는 분야가 MISC입니다. 리버싱, 포너블 등의 문제보다는 진입 장벽이 낮고 센스를 요구하는 문제들이 많기 때문이라고 생각됩니다. 정말 재미있는 문제도 있는가 하면 너무너무 게싱이 심한 경우도 있어서 난이도는 타분야와 마찬가지로 천차만별인 것 같아요. 그래서 저는 이번 포스팅에서 MISC에 대한 간단한 설명과 몇 가지 문제를 풀어보도록 하겠습니다. ver.1 이니까 다음도 있겠죠…???

MISC는 Miscellaneous(여러 가지 종류의,잡다한) 의 약어이고 CTF에서는 ‘기타’ 문제에 해당됩니다.


[TJCTF 2018] Moar Horses

문제 링크 : https://moar_horse.tjctf.org/

Moar Horses 문제 페이지에 들어가면 말이 있고, 스크롤을 내리면 계속 다리가 늘어난다.

<div id="horse" class="centered" style="padding-top: 222px">
    <h1>Scroll down to find the flag!</h1>
        <pre>   ,
_,,)\.~,,._
(()`  ``)\))),,_
 |     \ ''((\)))),,_          ____
 |6`   |   ''((\())) "-.____.-"    `-.-,
 |    .'\    ''))))'                  \)))
 |   |   `.     ''                     ((((
 \, _)     \/                          |))))
  `'        |                          (((((
            \                  |       ))))))
             `|    |           ,\     /((((((
              |   / `-.______.&lt;  \   |  )))))
              |   |  /         `. \  \  ((((
              |  / \ |           `.\  | (((
              \  | | |             )| |  ))
               | | | |             || |  '</pre>
<a href="/legs"></a>

코드를 보면 맨 아래 /legs로 이동하는 링크가 있다. 그냥 페이지에선 아무리 내려도 보이지 않는다.

Oops, you couldn't get the flag 를 눌러도 <a href="/legs"> 태그이기 때문에 계속 같은 페이지가 로드된다.

파이썬 requests를 이용해서 Oops, you couldn't get the flag 가 뜨지 않는 경우를 찾을 것이다.

import requests

url = "https://moar_horse.tjctf.org/legs"

while True:
        result = requests.get(url).text
        if "Oops" not in result:
                print(result)
                break

결과가 나오는 데는 좀 걸린다. 조건을 if "tjctf" in result 로 주었을 땐 더 오래 걸리는 느낌이다..

tjctf{h0rs3s_h4v3_lonG_l3gS}

재미있는 문제였다 :)



[SharifCTF 8] The Skeleton Key

문제 파일 : http://ctf-writeups.ru/wp-content/uploads/2018/02/the-skeleton-key.zip

다운로드 받은 파일의 압축을 해제하면 apk 파일이 보인다.

apk를 zip으로 바꿔서 보면 파일의 내부를 볼 수 있고, assets 폴더에 logo.svg가 있었다.

logo.svg를 열면 해골이 보인다. svg 파일을 편집하기 위해 Inkspace를 사용했다. 일러스트레이터도 있지만 깔기가 귀찮았다..ㅎㅎ

해골의 눈 코,입을 분해하다보니 광대 밑쪽에 작은 점이 보였다. 이 부분을 돋보기 기능으로 쭉 확대하면 플래그가 있다!



[DefCamp CTF Qualification 2018] Message

message.txt 파일이 주어지고 꽤 긴 문자열이지만 반복되는 단어들이 보인다.

CTF인 만큼 눈에 띄는 문자열은 {zxcvbnrfvbhgzxcvbn6zxcvbn6asdfghedcvrfzxcvbnredcvasdfghzsefvcxasdfghxcvbgrdasdfghgrdxcvbzxcvbn9qwerty0zxcvbnzsefvcxzxcvbnedcvgrasdfgh0asdfgh5qwertyyhnmkuasdfghredcfasdfgh5zxcvbnwsxcfeqwertyzsefvcxasdfghwsxcfdqwerty3qwerty3qwertyedcvgrqwerty7zxcvbn1qwertygrdxcvbqwerty8asdfghtrfvgzxcvbn7zxcvbn0qwerty9qwerty3qwerty4zxcvbn4zxcvbn0qwerty8zxcvbnredcfzxcvbn3zxcvbnzsefvcxzxcvbn5zxcvbn8qwerty4asdfgh7qwertyzsefvcxasdfgh4asdfghewsxczxcvbn5zxcvbntrfvbzxcvbn3asdfgh8zxcvbnedcvgrqwertyqazxdsasdfgh7zxcvbn5qwerty8asdfgh9asdfgh1qwertyrfvbhgasdfgh0zxcvbntrfvgasdfgh0qwertywsxcdezxcvbn3qwerty2zxcvbn} 이다.

숫자가 중간중간 끼어 있으므로 이 문자열을 숫자 기준으로 나눠서 정리해보려고 한다.

zxcvbnrfvbhgzxcvbn zxcvbn asdfghedcvrfzxcvbnredcvasdfghzsefvcxasdfghxcvbgrdasdfghgrdxcvbzxcvbn qwerty zxcvbnzsefvcxzxcvbnedcvgrasdfgh asdfgh qwertyyhnmkuasdfghredcfasdfgh zxcvbnwsxcfeqwertyzsefvcxasdfghwsxcfdqwerty qwerty qwertyedcvgrqwerty zxcvbn qwertygrdxcvbqwerty asdfghtrfvgzxcvbn zxcvbn qwerty qwerty qwerty zxcvbn zxcvbn qwerty zxcvbnredcfzxcvbn zxcvbnzsefvcxzxcvbn zxcvbn qwerty asdfgh qwertyzsefvcxasdfghasdfghewsxczxcvbn zxcvbntrfvbzxcvbn asdfgh zxcvbnedcvgrqwertyqazxdsasdfgh zxcvbn qwerty asdfgh asdfgh qwertyrfvbhgasdfgh zxcvbntrfvgasdfgh qwertywsxcdezxcvbn qwerty zxcvbn

반복되는 문자열들을 보면 다음과 같다. 이런 결과는 키보드 위에 아래 문자열들을 그려보면 알 수 있다.

  1. wsxcv -> L
  2. rfvbnhyt -> O
  3. mnbvcdrtghu -> R
  4. wsxcde ->
  5. zaqwdrtgb -> M
  6. wsx -> I
  7. nbvcxswefr ->
  8. iuyhnbv -> S
  9. wsxcvfr -> U
  10. zaqwdrtgb -> M
  11. asdfgh, qwerty, zxcvbn -> “ “

LOR M I SUM 의 빈 칸은 LOREM IPSUM(로렘 입숨) 라는 단어로 완성된다.

public class replace {
	public static void main(String[] args) {
		String s = "zxcvbnrfvbhgzxcvbn6zxcvbn6asdfghedcvrfzxcvbnredcvasdfghzsefvcxasdfghxcvbgrdasdfghgrdxcvbzxcvbn9qwerty0zxcvbnzsefvcxzxcvbnedcvgrasdfgh0asdfgh5qwertyyhnmkuasdfghredcfasdfgh5zxcvbnwsxcfeqwertyzsefvcxasdfghwsxcfdqwerty3qwerty3qwertyedcvgrqwerty7zxcvbn1qwertygrdxcvbqwerty8asdfghtrfvgzxcvbn7zxcvbn0qwerty9qwerty3qwerty4zxcvbn4zxcvbn0qwerty8zxcvbnredcfzxcvbn3zxcvbnzsefvcxzxcvbn5zxcvbn8qwerty4asdfgh7qwertyzsefvcxasdfgh4asdfghewsxczxcvbn5zxcvbntrfvbzxcvbn3asdfgh8zxcvbnedcvgrqwertyqazxdsasdfgh7zxcvbn5qwerty8asdfgh9asdfgh1qwertyrfvbhgasdfgh0zxcvbntrfvgasdfgh0qwertywsxcdezxcvbn3qwerty2zxcvbn";
		
		String replace = s.replaceAll("mnbvcdrtghu","R");
		replace = replace.replaceAll("efvgywdcft","W");
		replace = replace.replaceAll("nbvcxswefr","P");
		replace = replace.replaceAll("mnbvccdertg","P");
		replace = replace.replaceAll("nbvcxswerf","P");
		replace = replace.replaceAll("zaqwdrtgb","M");
		replace = replace.replaceAll("xsweftynh","M");
		replace = replace.replaceAll("xsweftyhn","M");
		replace = replace.replaceAll("xsweftgb","N");
		replace = replace.replaceAll("zaqwdvfr","N");
		replace = replace.replaceAll("xsweftbg","N");
		replace = replace.replaceAll("rfvbnhyt","O");
		replace = replace.replaceAll("qazxcdew","O");
		replace = replace.replaceAll("wsxcvfre","O");
		replace = replace.replaceAll("rfvgyhn","H");
		replace = replace.replaceAll("edcftgb","H");
		replace = replace.replaceAll("wsxdrfv","H");
		replace = replace.replaceAll("iuyhnbv","S");
		replace = replace.replaceAll("ytrfvcx","S");
		replace = replace.replaceAll("rtyuihn","T");
		replace = replace.replaceAll("wertyfv","T");
		replace = replace.replaceAll("wsxcvfr","U");
		replace = replace.replaceAll("edcvbgt","U");
		replace = replace.replaceAll("grdxcvb","A");
		replace = replace.replaceAll("zsefvcx","A");
		replace = replace.replaceAll("xcvbgrd","A");
		replace = replace.replaceAll("qazxds","B");
		replace = replace.replaceAll("wsxcfd","B");
		replace = replace.replaceAll("rfvbhg","B");
		replace = replace.replaceAll("ewsxc","C");
		replace = replace.replaceAll("redcv","C");
		replace = replace.replaceAll("trfvb","C");
		replace = replace.replaceAll("edcvgr","D");
		replace = replace.replaceAll("yhnmku","D");
		replace = replace.replaceAll("wsxcfe","D");
		replace = replace.replaceAll("wsxcde","E");
		replace = replace.replaceAll("edcvrf","E");
		replace = replace.replaceAll("tgbnhy","E");
		replace = replace.replaceAll("trfvg","F");
		replace = replace.replaceAll("redcf","F");
		replace = replace.replaceAll("ewsxd","F");
		replace = replace.replaceAll("cvgred","G");
		replace = replace.replaceAll("cvrged","G");
		replace = replace.replaceAll("redcvg","G");
		replace = replace.replaceAll("edcfby","K");
		replace = replace.replaceAll("qazsce","K");
		replace = replace.replaceAll("edcfby","K");
		replace = replace.replaceAll("rgnygc","X");
		replace = replace.replaceAll("wdvtdz","X");
		replace = replace.replaceAll("wsxcv","L");
		replace = replace.replaceAll("edcvb","L");
		replace = replace.replaceAll("rfvbn","L");
		replace = replace.replaceAll("wdcft","V");
		replace = replace.replaceAll("efvgy","V");
		replace = replace.replaceAll("efvt", "Y");
		replace = replace.replaceAll("jmyi","Y");
		replace = replace.replaceAll("wsx","I");
		replace = replace.replaceAll("edc","I");
		replace = replace.replaceAll("rfv","I");
		replace = replace.replaceAll("qwerty","");
		replace = replace.replaceAll("asdfgh","");
		replace = replace.replaceAll("zxcvbn","");
			
		System.out.println(replace);
	}
}

노가다의 산물…

DCTF{B66ECAAA90AD05DF5DAB33D71A8F70934408F3A5847A4C5C38DB75891B0F0E32}