burningCTFのwriteup的なもの
和風(WAF〜)CTFというとてもナイスなデザインのCTFであった
全体的に初心者向けであったので、メチャンコ初心者な自分にも楽しめた
稚拙ながら、とりあえず解けた問題のwriteupというか感想というか なものを書いてみました。
101 image level 1
つなげるだけ
111 ワットイズディス?
漢字2文字 + カタカナ(甲骨文字
112 cole nanee?
メッチャ忍にしか見えなかった
113 Lines and Boxes
画像検索するとアルファベットの漢字化みたいなのが出てきたのでNARUHODOとなった
115 毎日使う
「気」を入れてダメだったから戸惑って諦めてしばらく放置してしまった
氣合が足りない
121 壱萬回
objdump -d すると、
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 ...
echo "464C41475F3563333361316238383630653437646138363437313465303432653133663165" | xxd -r -p
みたいな感じであった
123 Unity遊戯如何様
この部分のilをいじってコインが増える数を増やすとFlagが出てきた
3つコインをとればFlagが出るので、2個ずつ増やすようにしたら3を越えて出なかった気がする
たまたま友人がこういうものを書いてくれていたおかげでなんとかなった 感謝🙏
mac用にビルドされていたけれど、
macでうまくilがいじれなかったのでmac向けの問題だったのかよくわからない感じであった
131 image level 5
md5 シーザーと思ったけれど並べ替えだった
132 Ninjya Crypto
忍者文字的な
133 Decrypt RSA
142 Ninja no Aikotoba
encryptはプログラム書こうかと思ったけど手作業で出来た
難しくて長くかかったけどfirst solveして嬉しかった
161 ftp is not secure.
wiresharkで眺めてFTP Dataのサイズが1500くらいのやつをfollow tcp streamするとbase64っぽいのがあるのでデコード
strings 161-problem.pcap | grep ==
162 ベーシック
パケットを再現したら解けてしまったので深く考えていなかったけど、しばらくしてから:に気付いた
164 Japanese kids are knowing
苦しゅうないと書かれているのでmasscanとかでスキャン
開いてるポートにncで繋ぐと
```<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.```
塩基配列か何かかと思ってすごい時間かかったけど音符であった
165 Malicious Code
windowsのプロパティだと全部読めないのでstringsとかで読んで実行するといい感じになるので、それを^取ってアレして実行すると結局こんな感じになる。
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "myaddr=myIP" -k https://210.146.64.38:60444/p.php`
myIPに65行目のIP(10.0.2.222)入れてPOST
173 Akiko-chan
画像検索して出てきたurlを解答
181 search_duplicate_character_string
とても頭が悪いコードを書いてしばらく待って出てきたやつを使って手作業で適当にやると10分もかからなかったので良かろうもんであった
a = File.open("dup.txt") str = "" a.each do |s| str += s end spl = str.scan(/.{1,#{5}}/) counts = [] spl.each_with_index{|a,i| cn = spl.count(a) print i,"/",spl.length," ",cn,"\n" counts.push([i,cn]) } moredupsample = [] counts.each{|a| moredupsample.push(a[0]) if a[1]!=1 } moredupstr = [] moredupsample.each{|m| next if spl[m] == nil # print str.scan(spl[m])," ",spl[m],"\n" if spl[m] != nil s = str[str.index(spl[m]),6] if spl[m] != nil moredupstr.push(str.scan(s)) if str.scan(s).length != 1 } fl = true c = 10 while fl do moredupstr2 = [] moredupstr.each{|m| s = str[str.index(m[0]),c+=1] moredupstr2.push(str.scan(s)) if str.scan(s).length != 1 } fl = false if moredupstr2.length <2 end p moredupstr2
雑魚
182 JavaScript Puzzle
nodejsで頭悪そうな総当りを書こうとしていたけれど、めもりなくなって止まったりアレだった
こんな感じで読んでいくとそれっぽい感じになる
0b1001100 = 76 = 0x4C = L (0O000101) = 65 = 0x41 = A (101) = 101 = 0x65 = e
難しかった
[(0O000101),(0b1001100),(101),0x52,0x54]["map"](x => String["fromCodePoint"](x))["join"]("")["toLowerCase"]()
183 Count Number Of Flag's SubString!
これまた頭悪そうコードを書いたのだった
require 'net/http' require 'uri' url = URI.parse('http://210.146.64.36:30840') alpha = [*"a".."z"] alpha.push("_") str = "flag={" grs = [] loop do |time| flg = true cou = 1 alpha.each_with_index do |a,i| next unless flg strs = str + a res = Net::HTTP.start(url.host, url.port) {|http| http.get('/count_number_of_flag_substring/?str='+ strs +'&count=count') } cnt = res.body.match(/are.*</).to_s.gsub("are","").gsub("<","").to_i puts strs if cnt > 0 flg = false str += a end end sleep 0.1 end
184 解凍?
頭悪そうなコードを書いてひたすら解凍したけど途中で拡張子が変わったりすると止まったりしてその都度手作業だったのは阿呆であった
191 GIFアニメ生成サイト
画像をアップロードすると出てくる生成ボタン
<input type="button" value="生成" id="cb" class="btn btn-primary" data-id="????">
の data-id= を1にするとCTFあるあるが出てくる
writeup見ただけだと簡単なものだと恐らく思ってしまうけれど、試行錯誤して実際に解けると感動するものであったのだなあ となった
193 箱庭XSS
stringsでアレなjsを見つけて実行しただけであった
アレな感じもしたけれど、他の人も同じ解き方してる人がいて安心
194 YamaToDo
Web問に慣れていなかったので、これもxssすれば良いのかとか色々試行錯誤してたけど何も出来ず、
コードを読むとあからさまなsjis対策がされていたので、文字コードの問題なのかと思う
euc-jpかと思い、適当にここの文字列を貼り付けて適当なSSIDでcurlでPOSTしてみる
curl 'http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44/?ie=ujis' --data 'user_id=yamato&password=◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩�������action=login' -H 'Cookie: PHPSESSID=testtest'
このSSIDでログイン出来たので、ujisをちょっと調べてみてもよくわからんけどフラグもあるしよかろうとなった
それをmageさんに聞いてみても?となる
帰って色々削って試してみると
curl 'http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44' -H 'Cookie: PHPSESSID=testssid' -d "user_id=yamato" -d password=aaaa curl -s 'http://yamatoctf:GUn7Sn1LVJQZBwyG8wZPAItnoBZ04Tlx@210.146.64.44' -H 'Cookie: PHPSESSID=testssid' | nkf | grep "☆(ゝω・)v " Ⱦ角でサブミットしてください☆(ゝω・)v flag={r3m3Mb3r_5c_pr0bL3m}
(・ω・)??
ということは...となり
これを
こうすると
出来る
何故
コードを見返すと
break 2;
ジャナイ
コードちゃんと読めばメッチャ簡単な問題だったので大変たまげた
雑魚ゆえお許し下され…となった
breakコワイ
197 箱庭XSS 2
1と同じ
201/202 将棋詰め
詰将棋勉強しつつ頑張った
203/204 将棋詰め3,4
web上に自動でやってくれるのがあったのでカンニングに任せてしまった…
解説された問題も惜しいところまで行ってたのがわりとあったのは、持ち前の諦めスキルが災いしたせいであったと思う
色んな話を聞いてもっと精進しなくては…という感じがした
初心者を脱したい
一瞬だけ3位になったので成仏しかけた
adent
書こうと思ってた日にびっくりするほど寝てしまったので適当に書きました。
Let's Encrypt使った話
この記事は OIC ITCreate Club Advent Calendar 2015 16日目(12/16)の記事です。
Let's Encryptにメール送って返ってきたのをしばらく放置していたのですが、
いつの間にかpublicBETAになってて、
やってみると10分くらいで出来たので、
通信を暗号化したいなどの需要には答えてくれるのではないかと思い、書きました。
git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt ./letsencrypt-auto
これだけでapt-getとか勝手に走って、その通りに答えれば証明書が得られるのですが、
それだと記事としてもアレなので、http2にするためのソレなどを書こうかなと。
nginxに1.9.5からhttp2が取り込まれたということで、nginxでhttp2を使用するには1.9.5以上が必要なのですが、
気がつけば1.9.9がリリースされてたりするので、好きな感じのバージョンをインストールして頂ければなと。
ソースからビルドする場合はnginx: downloadなどから好みのバージョンをインストールし、ビルドして下さい。
aptの場合は/etc/apt/sources.list
に
deb http://nginx.org/packages/mainline/debian/ squeeze nginx deb-src http://nginx.org/packages/mainline/debian/ squeeze nginx
とか書いてアレすれば良いんじゃないかなと思います。
デフォルトだと
./letsencrypt-auto certonly --webroot -d ドメイン名 --webroot-path /usr/share/nginx/html
的な感じにしておけば、/etc/letsencrypt/live/ドメイン名/
に
cert.pem chain.pem fullchain.pem privkey.pem
が作成されるので、
/etc/nginx/nginx.conf
に
server { listen 443 ssl http2; server_name ドメイン名; ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem; }
みたいな設定でnginxを再起動すれば一応出来るんじゃないかなと思います。
apacheの場合はデフォルトでプラグインが用意されてるので--apache
などを付ければカンタンだと思います。
また、80か443しか受け付けてくれないので、サーバを止めずに認証ファイルを受け取る場合はwebrootプラグインを使います。
ちなみに無料のためか証明書の有効期間は90日しかないので、90日内に再度証明書を発行しないといけません。
cronでやれば良いので、こういう感じでやれば良いと思います。
おわり
advnt
暇つぶしアセンブラ
今日も誰も書かないので、適当に。
もう半分くらい自分の記事になってきた…
あとだんだん書くネタが無くなってきたこの頃。
この記事は OIC ITCreate Club Advent Calendar 2015 12日目(12/12)の記事です。
セキュリティキャンプ・キャラバンで拝聴した中島さんのアセンブリ読経がとても良かったので、最近の暇つぶしはもっぱらアセンブリ読経になっている。
gccの最適化とかさせてみる遊び。(mainのみ
$ cat code.c #include <stdio.h> int main(){ int n=10; n++; printf("%d",n); return 0; }
適当なCを書く。
とりあえず最適化を無効にしてビルド。
$ gcc -mpreferred-stack-boundary=2 code.c -O0 -o ex $ objdump -d -M intel --no-show-raw-insn ex 0804841d <main>: 804841d: push ebp 804841e: mov ebp,esp 8048420: sub esp,0xc 8048423: mov DWORD PTR [ebp-0x4],0xa 804842a: add DWORD PTR [ebp-0x4],0x1 804842e: mov eax,DWORD PTR [ebp-0x4] 8048431: mov DWORD PTR [esp+0x4],eax 8048435: mov DWORD PTR [esp],0x80484e0 804843c: call 80482f0 <printf@plt> 8048441: mov eax,0x0 8048446: leave 8048447: ret
上のコードの通り、[ebp-0x4]に0xa(10)をmovして、それに0x1をaddしている。
最適化オプションを指定してみる。
$ gcc -mpreferred-stack-boundary=2 code.c -O1 -o ex1 $ objdump -d -M intel --no-show-raw-insn ex1 0804843d <main>: 804843d: sub esp,0xc 8048440: mov DWORD PTR [esp+0x8],0xb 8048448: mov DWORD PTR [esp+0x4],0x8048500 8048450: mov DWORD PTR [esp],0x1 8048457: call 8048330 <__printf_chk@plt> 804845c: mov eax,0x0 8048461: add esp,0xc 8048464: ret
[esp+0x8]に直接0xb(11)をmovしている。
最初の2行とか、eaxに[ebp-0x4]を入れて戻してみたいな処理が削られている。
サイズの最適化オプションを指定してみる。-Os
$ gcc -mpreferred-stack-boundary=2 code.c -Os -o exs $ objdump -d -M intel --no-show-raw-insn exs 08048340 <main>: 8048340: push ebp 8048341: mov ebp,esp 8048343: push 0xb 8048345: push 0x80484e0 804834a: push 0x1 804834c: call 8048330 <__printf_chk@plt> 8048351: xor eax,eax 8048353: leave 8048354: ret
mov処理がpushに変わっている。最後のmovもxorに変わってたりしてて面白い。
適当にコードを書いて、ビルドして、印刷して持ち歩くことによって暇つぶしになる。