読者です 読者をやめる 読者になる 読者になる

EKOPARTY CTF 2016 Writeup

この大会は2016/10/27 5:00(JST)~2016/10/29 5:00(JST)に開催されました。
今回もチームで参戦。結果は1100点で721チーム中79位でした。
自分で解けた問題をWriteupとして書いておきます。

Hidden inside EKO (Misc 50)

EKO pixelsに隠されているフラグを見つける問題。
背景画像を取り出すと、左上にフラグがある。
f:id:satou-y:20161029193858p:plain

EKO{th3_fl4g}

Old but gold (Misc 250)

キーパンチカードの画像14枚が添付されている。まずこのキーパンチの情報を解読する。コードは以下の通り。

import Image
import sys
import os

IBM_MODEL_029_KEYPUNCH = [
"    /&-0123456789ABCDEFGHIJKLMNOPQR/STUVWXYZ:#@'=x`.<(+|!$*);^~,%_>? |",
"12 / O           OOOOOOOOO                        OOOOOO             |",
"11|   O                   OOOOOOOOO                     OOOOOO       |",
" 0|    O                           OOOOOOOOO                  OOOOOO |",
" 1|     O        O        O        O                                 |",
" 2|      O        O        O        O       O     O     O     O      |",
" 3|       O        O        O        O       O     O     O     O     |",
" 4|        O        O        O        O       O     O     O     O    |",
" 5|         O        O        O        O       O     O     O     O   |",
" 6|          O        O        O        O       O     O     O     O  |",
" 7|           O        O        O        O       O     O     O     O |",
" 8|            O        O        O        O OOOOOOOOOOOOOOOOOOOOOOOO |",
" 9|             O        O        O        O                         |",
"  |__________________________________________________________________|",
]

files = ["07d561df3da01f31590066f014652e995f7b76f1.png","4a95fea0f5e9af0af550b94fb960222e934ad09b.png","a034586b253b057c96da0b6707364853886b22b6.png","d3860afefe98f2408e24218a882aaf227d9287b9.png","19756efa72339faa9c9b5fe1743c3abedbc5079d.png","85a749d44bcba42869f21fb58f9725a443066a4f.png","a8a103961eccf8a991edfed1aaa39a8f9a3fe622.png","f7191b128c49ecfef0b27cd049550ae75249f86b.png","24c1e220c056210e6507c4c57079ffb99ffeb96c.png","89596be1f6463cb83abaecac7a375546069ecf0f.png","a9aba85ebcb160a7b18ea22abfb9589bd3ce1914.png","2d77fbd5eda9ed661a7834d8273815722fb97ccc.png","93ec404ba9266f5d059a727a6460b2693fc4c440.png","cdeea42d7f7216f93a9f1eb93b2723c70e693bea.png"]

def getRow(q):
    out = ''
    for i in range(len(IBM_MODEL_029_KEYPUNCH)):
        out += IBM_MODEL_029_KEYPUNCH[i][q]
    return out

def check(n, need):
    for i in range(len(need)):
        if(need[i] != getRow(n)[i+1]):
            return False
    return True

def find(need):
    for i in range(5, 69):
        if(check(i, need)):
            return i
    return -1

for f in files:
    im = Image.open('misc250_100ff979353dd452\\' + f)
    pix = im.load()

    def isWhite(a):
        for q in a:
            if q != 255:
                return False
        return True

    for x in range(2, 82):
        column = ''
        for y in range(2, 25, 2):
            if(isWhite(pix[x*7 + 4, y*10 + 5])):
                column += ("O")
            else:
                column += (" ")
        sys.stdout.write(IBM_MODEL_029_KEYPUNCH[0][find(column)])
    print ''

実行すると、それぞれ以下の14個の英文の一部になる。

・OF TIME PUNCHING THOSE NARDS, CAN YOU IMAGINE WHAT COULD                        
・MANUALS TRY1NG TO LEARN HOW TO PROGRAM AND SPEND A LOT                          
・AND COBOL, B(T EVEN AFTER ALL THOSE YEARS HE DOESNT KNOW                        
・THAT WILL TAKE MORE TIME TO MEBUG AND FIGURE OUT WHERE WAS                      
・THE BUG, BUT THOSE WER3 THE OLD DAYS. CAN YOU FIND THE FLAG                     
・HAPPEN IF YOU FAKE A SMALL MISTAKE IN ON OF THOSE PUNCHED                       
・CARDS? AFTER THOSE HOURS WAITING ROR A RESULT, THEN IT SAYS                     
・ONCE UPON A TEME, THERE WAS A YOUNG HACKER CALLED MJ                            
・USING THIS OLD TECHNOLOGY? GOOD LUCK, YOU WILL NEED IT)                         
・USE THOSE PONCHED CARDS, HE LIKES TO PROGRAM IN FORTRAN                         
・IN THOSE DAYS YOUR ONLY OPTION W4S READ LARGE BOOKS AND                         
・IT WAS THE SIXTIES, HE WAS TRYKNG TO FIGURE OUT HOW TO                          
・ERROR DUE TO A SMALL AND ALMOST INSIGNIFICANT MIST4KE BUT                       
・HOW TO PROPERLY MRITE SECURE CODE IN THOSE LANGUAGES  

それぞれスペルミスがあるので、英文として意味の通る順番に入れ替え、スペルミスの文字を列挙する。

E: ONCE UPON A TEME, THERE WAS A YOUNG HACKER CALLED MJ
K: IT WAS THE SIXTIES, HE WAS TRYKNG TO FIGURE OUT HOW TO
O: USE THOSE PONCHED CARDS, HE LIKES TO PROGRAM IN FORTRAN
(: AND COBOL, B(T EVEN AFTER ALL THOSE YEARS HE DOESNT KNOW
M: HOW TO PROPERLY MRITE SECURE CODE IN THOSE LANGUAGES
4: IN THOSE DAYS YOUR ONLY OPTION W4S READ LARGE BOOKS AND
1: MANUALS TRY1NG TO LEARN HOW TO PROGRAM AND SPEND A LOT
N: OF TIME PUNCHING THOSE NARDS, CAN YOU IMAGINE WHAT COULD
F: HAPPEN IF YOU FAKE A SMALL MISTAKE IN ON OF THOSE PUNCHED
R: CARDS? AFTER THOSE HOURS WAITING ROR A RESULT, THEN IT SAYS
4: ERROR DUE TO A SMALL AND ALMOST INSIGNIFICANT MIST4KE BUT
M: THAT WILL TAKE MORE TIME TO MEBUG AND FIGURE OUT WHERE WAS 
3: THE BUG, BUT THOSE WER3 THE OLD DAYS. CAN YOU FIND THE FLAG
): USING THIS OLD TECHNOLOGY? GOOD LUCK, YOU WILL NEED IT)
EKO{M41NFR4M3}

Mr. Robot (Web 25)

問題タイトルからも予想できるが、robots.txtの問題。
https://ctf.ekoparty.org/robots.txtにアクセスすると、次のような表示。

User-agent: *
Disallow: /static/wIMti7Z27b.txt

https://ctf.ekoparty.org/static/wIMti7Z27b.txtにアクセスすると、フラグが見つかる。

EKO{robot_is_following_us}

RFC 7230 (Web 50)

ctf.ekoparty.orgのサーバから基本的な情報を取得してフラグを得るという問題。
curlコマンドでレスポンスを見てみる。

$ curl -v -b 'NULL=<クッキーの値>' https://ctf.ekoparty.org/tasks
* Hostname was NOT found in DNS cache
*   Trying 52.204.197.190...
* Connected to ctf.ekoparty.org (52.204.197.190) port 443 (#0)
* successfully set certificate verify locations:
  :
> GET /tasks HTTP/1.1
> User-Agent: curl/7.35.0
> Host: ctf.ekoparty.org
> Accept: */*
> Cookie: NULL=<クッキーの値>
> 
< HTTP/1.1 200 OK
* Server EKO{this_is_my_great_server} is not blacklisted
< Server: EKO{this_is_my_great_server}
< Date: Wed, 26 Oct 2016 21:52:54 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 9397
< Connection: keep-alive
< Vary: Accept-Encoding
< Set-Cookie: NULL=<クッキーの値>; Secure; HttpOnly; Path=/
< X-Frame-Options: SAMEORIGIN
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Strict-Transport-Security: max-age=63072000; preload
  :

Serverにフラグが設定されている。

EKO{this_is_my_great_server}

Welcome to the dark side (FBI 25)

TORネットワークのみ接続できるURLが与えられている。TOR Browserで接続し、ソースを見るとコメントにフラグが書かれている。

EKO{buy_me_some_b0ts}

Metadata (FBI 50)

FBI 25と同じURLが与えられ、メタデータにフラグが書かれているような問題文。証明書を見ると、部門にフラグが書かれている。
f:id:satou-y:20161029195524p:plain

EKO{is_this_just_real_life_is_this_just_fantasy}

JVM (Reversing 25)

classが与えられている。JD-GUIで開き、デコンパイルすると、コードは次の通り。

public class EKO
{
  public static void main(String[] paramArrayOfString)
  {
    int i = 0;
    for (int j = 0; j < 1337; ++j) {
      i += j;
    }

    String str = "EKO{" + i + "}";
  }
}

計算結果を表示しないようになっているが、同様の処理をPythonでコードを書き、実行する。

i = 0
for j in range(1337):
    i += j

str = 'EKO{' + str(i) + '}'
print str
EKO{893116}

Damaged (Forensics 75)

壊れたBMPファイルが添付されている。バイナリエディタで見ると、先頭部分が欠けていることがわかる。
「42 4D 36 75 00 00 00 00 00 00 36 00 00 00」を先頭に追加すると、BMPファイルとして開け、フラグを見ることができる。
f:id:satou-y:20161029201247j:plain

EKO{b1tm4p_r3c}