zoomzoomzoom

解決方法の共有に主眼を置くブログ・他雑談

バイナリ解析 問題を解いてみる1

昨日「CTF binary writeup」の検索ワードでたくさん勉強の資料はヒットすることが分かったので、GoogleSEOアルゴリズムにあやかって一番上のサイトから攻略していくことに。

 

1ページ目の検索結果が終わるころには、自分なりに課題が見つけられるようになっていると期待。

 

本日は、file,strings,IDAPro(free)の使い方と、基礎的なAssembly Languageの記法についてお勉強。

file:対象がどのようなファイルか情報を表示

strings:ファイル内の表示できる文字列を表示

IDAPro‘:強力な逆アセンブラ 分岐させたい方に強制的に飛んだりできる。

Assembly Language:マシン語を人間が読めるようにしたやつ。四則演算と条件分岐の基礎的なものから覚えていく。

 

本日勉強させていただいたサイトはここ。感謝をこめてリンクぺた。

CTF for ビギナーズ バイナリ講習資料

 

(残り:2998日)

バイナリ解析 16進数に慣れるための記事

バイナリ解析をしていると、16進数によく出くわす。16進数は2進数に変換しやすいらしいのだが、どうもバイナリアンは暗算でいろいろやってしまうらしい。というわけで脳内変換ができるようにするにはどうすればいいかなと検索してみました。

 

いい記事があったので、ご紹介。

暗算で 16 進数を 2 進数に変換する方法 | プログラマーズ雑記帳

FF(16進数の掛け算)を覚えよう - やねうらお−ノーゲーム・ノーライフ

| 500円で始めるPIC

へっぽこ講師の備忘録: 16進数の九九(FF?)表を作ってみた

 

記事をまとめると、「覚えましょうね」ってことらしい。

特に覚えることは、

・16,32,48,64,80,96,112,128(左から10h,20h...)

・A = 10 , B = 11 , C = 12 , D = 13 , E = 14 , F = 15

・補数は、A , B , C , D , E , F についてそれぞれ、6 , 5 , 4 , 3 , 2 , 1

・ほんとに補数大事。

・FF表(16進数の九九)

 

通り過ぎる車のナンバーを四則演算で10にする遊びをよくやっていますが、今度は16進数に変換する遊びに切り替えようかな。

バイナリ解析 準備

バイナリ解析を行うための準備を書く。参考にするのは、セキュリティコンテストチャレンジブック。本日は解析ツールのインストールのスクリプトを紹介(と言ってもコマンドの羅列にすぎない)

Amazon CAPTCHA

 

前提として、、、

環境はマルウェアのような挙動を解析対象がした場合にどうなってもいい環境=仮想環境を利用する。Ubuntuの14.04と16.04をそれぞれ32bitと64bitでVMWareにinstall.イメージダウンロードとインストールだけで結構時間がかかるので注意。

 

 

解析ツールのインストール(14.04で問題なく動作):

#strace

sudo apt-get install strace

 

#ltrace

sudo apt-get install ltrace

#radare2(useful tools)

sudo apt-get install git

 

#ghex(binary editor)

sudo apt-get install ghex

 

#if you dont have gdb and objdump in your system already. (gdb:debugger, objdump:disassembler)

sudo apt-get install binutils

 

#dex2jar(Dalbik VM byte code 2 class file)

cd /usr/local/src

sudo http://sourceforge.net/projects/dex2jar/files/dex2jar-2.0.zip

sudo unzip dex2jar-2.0.zip

cd dex2jar-2.0

chmod u+x ./*.sh

export PATH=$PATH:/usr/local/src/dex2jar

 

#jd-gui(java byte code 2  srccode)

sudo apt-get install libgtk2.0-0:i386

sudo apt-get install libxxf86vm1:i386

sudo apt-get install libsm6:i386

sudo apt-get install lib32stdc++6

sudo wget http://jd.benow.ca/jd-gui/downloads/jd-gui-0.3.5.linux.i686.tar.gz

tar zxvf http://jd.benow.ca/jd-gui/downloads/jd-gui-0.3.5.linux.i686.tar.gz

export PATH:$PATH:/usr/local/src/jd-gui

 

#その他

#日本語キーボード入力を可能に。

sudo dpkg-reconfigure keyboard-configuration

#史上最高のエディタをインストール

sudo apt-get install vim


ツールがインストールし終わったら早速解析開始!と行きたいところであるが、先ほど紹介した本では解析対象のファイルのダウンロードリンクが特別書かれているわけではない。

 

もう一冊下記の書籍も購入したが、

book.mynavi.jp

 

今手元にないのと、届いても問題数が少なそうなので、WEB上で解けそうな問題を探す。WriteUPというのが問題に対する解説という業界用語らしいので、WriteUP付きのWEB問題集がまとまっているサイトを探す。

 

「CTF binary writeup」で検索して36800件ヒットするので、問題には困らなさそう。

 

問題があってそれを解くためのツールがあって解説がある。これで準備完了。

(残り2999日)

本の選び方と読み方

学習をする上で避けては通れない本という存在について、私の実践していることを記載しました。

1.いい本を買う方法

2.本の速読法

 

1.いい本を買う方法

・いい本とは:自分が欲しい内容が書いてある本のこと。
・まず著者を見る
→著者のバックグラウンドは本の内容にリンクしているか。釣りに関する本を選ぼうとしてコンサルタントが書いた本を選んでいないか?そんなに極端ではなくとも、たとえば2年釣りをしている人と、10年釣りをしている人では内容の深みに違いが出てくる。だいたい本の背表紙に著者の経歴があるので目を通すこと。
 
・次に目次を見る
→目次の内容がとっちらかっていないか?やたらと項目数が多くないか?目次は本の内容がいかに整理されているか判断するための指標になる。目次が「単なる本の内容の抜粋」になっている本は駄本。
 
・最後に内容、飛躍の有無
→やっと内容のチェック。
→内容チェックポイント1:読みたい内容かどうか。たとえば釣りのことを知りたいのに、選ぼうとしている本の中で、釣りの内容は他の項目の説明をするための例え話にしか使われていない、という場合はその本は棚に戻したほうがよい。
→内容チェックポイント2:著者の説明の飛躍についていけるかどうか。たとえば経済に関する書籍で「北朝鮮からのミサイルが日本近海に落下した翌日の為替相場は円安ドル高基調となるが、」という一文があったとする。この、有事→円安ドル高 という論理の流れには、有事→(ちょっとかじったことある人ならわかる前提知識)→円安ドル高のようになっており、人によっては論理の飛躍ともとれる文が存在していることがある。もし現時点で著者の論理展開についていけないことが多そうなら、もっと平易な説明をしてくれる本を数冊読んでからその本を選んだ方がいい。
為替相場の話は一例です。実際の相場変動の結果には一切責任を負いません。
 

2.本の速読法

・心構え
→役立つ内容なんてせいぜい20%くらいだ、と考えること。自分の日常に変化をもたらす内容が、一冊の本の情報量の20%もあれば大儲け、くらいの感覚で読む。
 
・綺麗に読まない
→書き込みしないで綺麗に読もうとする人がいるが、誰かにあげようとしているのか?それとも読んだ後に売ろうと考えているのか?自分の頭に入れるためにメモ書きをしたりドッグイヤーを付けておく方があなたへのメリットは大きい。
 
・カバーと帯は外す
→ペラペラなって邪魔だし気が散る。少しでも気が散るものは取り除く。本は内容が命。装丁は無駄。
 
・同じ種類の書籍を3冊見る
→最近は3冊も見なくても、1冊+関連webサイトふらふら、でもオッケー。よく出てくる単語と言い回しが重要なので、それらに注意して読めばよいとわかる。見る、と書いたのは、立ち読みでもできるから。別に買わなくてもよい。
 
・目的を決めてその箇所だけ読む
→読むというより、ゆっくりめくる動作になるはず。目的を忘れないで読むと言い換えても良い。途中で目的を忘れると、読み終わった後に「で、何を読んだんだっけ?」となる。
 
・人に教えるつもりで読む
→もちろん本を読む目的に沿った内容だけで良い。読んだ内容を人に説明するつもりで読むと「あ、ここの論理ちゃんと追えてないな」と気づける。その論理を補完するところだけ追加して読めば良い。
 
※注意点
内容を頭に入れることはこの方法でいくらか効率化できますが、重要なことは実践に移せるかです。つまり本を読み終わった後が一番大事です。
 
参考になった!や、この方がもっと効率的に本を読める!等あればコメントください。

LPIC攻略法

LPIC101,102,201,202,303を4ヶ月で取得した経験をもとに、効率的な対策法をまとめました。
 
LPICとは?
 
LPICの受験動機
→そもそもシェル芸が好きで体系的に知識を身につけたかった。
Linuxのプロフェッショナル?かっこいい!
→セキュリティのプロフェッショナルになりたいけど、何勉強すればいいかわからない。広く使われているLinuxがどのような生態系なのか学ぶことは無駄にはならないはず!
→→勉強している途中からは、この資格取ってもいきなり何かできるようになるということはないということを悟る。が、最低限の知識を身につけることは出来ると継続を決意。
→対外的にある程度のLinuxを使えるとアピールできる。
 
レベル別対策法・・・この勉強法は次の4つのレベルに適している。
・101(合格時得点:740)、102(710)、201(750)、202(650)
Ping-Tというサイトで勉強あるのみ。(101用コンテンツは無料なのでお試しあれ)
Ping-Tは、ウェブ問という選択肢問題の対策、コマ問という直接入力タイプ問題の対策、の2つに分かれている。このうち、ウェブ問をひたすら繰り返す。最初は何を問われているかすらわからないと思うが、解説をよく読むだけで合格するために必要な知識が身につく。
ウェブ問を4周やること。4周のやり方は下記。
 
1周目:問題すら読まない。解答だけを読む。具体的操作方法は、正答を選択(右下ボタン→解説表示→読む→次へ   の繰り返し。終わったら解答履歴クリアして初期状態に戻す。
2周目:単元別に最初から解いてみる。だいたい解けないけど。解説を読んで、あーそうだったわと思い出す。全項目終わったら解答履歴クリアして初期状態に戻す。
3周目:単元別に最初から解いてみる。まだ解けないかもしれない。でも解けない問題はストックされるのでひたすらやる。全部銀にできたら終わり。
4周目:全部金にできたら終わり。
 
基本はこれで受かる。なお、202だけはPing-Tの解説内容を別途ノートにまとめた。知識量が多く、Ping-Tだけでは知識がとっちらかってテストの際に思い出せない。1周目終わり頃に悟った。
 
202のノートの作り方
単元別にまとめる。
マインドマッピングを使った。画像で覚えることができ、すごく頭に残るようになった。
要望があればアップします。
 
303(合格時得点:660)
関連書籍のみ。Ping-Tは303に対応していないため。

Amazon CAPTCHA

この本1冊で十分合格することができます。アマゾンのレビューなどではかなり辛口の評価もあり、私自身も不安でしたが、大丈夫です。この本だけでいけます。
 
解説を読む際、知識のインプットの際に下記事項に気をつけること。
・大文字小文字
・password passwords passwdなどの微妙な違い
・間違えた場合には「次は問題文のどこに注目したら答えを導けるか」を考えること。
 
 
FAQ
Ping-Tだけで合格できますか?
→出来る。「それは人による」とか言いません。出来ます。試験範囲の知識量はPing-Tのみで足りる。ウェブ問題も本番とかなり類似している。
 
実機で練習した?
→全くしていない。Ping-Tのみで合格できる。実機の練習は必要ない。合格した後、実機で確認する方が効率がいいと考えている。実機で勉強しようとすると「あー環境構築面倒だな」等と考えて結局勉強しない等精神面のデメリットが大きいのではないでしょうか。合格した後に知識の確認で実機練習しても遅くないですよ。
 
各レベルどれくらいで取得した?
101(4/28-5/6)
102(5/8-5/29)
201(6/20-7/1)
202(7/8-8/5)
303(8/7-8/26)
多分これくらいの期間勉強していたと思います。202試験がとにかく大変だった記憶です。
 
必要経費は?
101〜202試験費用が各16,200円
303受験費用が32,400円
ping-t6ヶ月プレミアム費用が5000円
303書籍代が3,000円
全部で10万円強でしょうか。※20170907編集
 
コマ問はやらなくていいの?
→4周終わった後時間があればやってもよい。やる場合、実際にコマンドを打つのは学習時間がもったいないので、次のようにする。つまり、考える、答えを表示、あってるかあってないか確認、次へ。
 

Spring徹底入門13.2 つまづき

RESTful Webサービスを作成する。

・RESTful Webサービスが起動しない。

MessageクラスとMessagesControllerクラスをcom.examle配下に作成し、DemoApplicationクラスを実行。が、localhostに何も変化なし。HelloWorldのまま。。。これでいいのか?次ページ13.2.2の図を見ると、まだブラウザ上の表示がHelloWorldのままなのでひとまずこれでよしとする。

 

・HelloControllerがhtmlを自動生成しない

教科書ではHelloControllerなるクラスを新規に作成して、コードを書き、DemoApplicationで呼び出すことでhtmlが自動生成される~と説明しているが、そのようなhtmlが作成された形跡もなく、またlocalhostの表示もなんら変更がない。ずっとDemoApplicationしか動作しておらず、その他のクラスが関連して呼び出されていない様子。

 

ここら辺でSpringについてWebでお勉強を再開。(教科書は、成功すること前提に書かれているから、落ちこぼれたときに置いてきぼりになりますよね。)

春だから!Javaでの開発にSpring Bootを使おう!

記事によると→Spring BootではXMLは書かず、Javaのコードにアノテーションを書くだけで、全て自動的に行われます。 

(やっぱ自動生成!いや、"html"は自動生成ではないぞ・・・)

記事によると→作成されたプロジェクトを右クリックして、「Run As」から「Maven install」を選びます。これで、必要なものがインストールされ、ビルドされます。

(ん?これは気になるぞ。。。Mavenインストールはしてなかったけど効果ありそう)

 

 

Mavenプロジェクトで Spring MVC の Hello World を作成する方法: ある SE のつぶやき

他で一つプロジェクトを作って学習し、それからDemoに戻ったほうが解決策を思いつくかもしれないと考えた。上記のサイトで修行することに。

Dependencesの設定のところで、検索窓に入力しても何の音沙汰もない。stackoverflowというところで解決策を発見。

"window→preferences→mavenとすすみ、download~となっているところ全てにチェック。その後Applyを押してOKを押して、STS再起動。"

再起動すると、mavenのindexの更新がかかる。再度入力。何も起こらない。

再度Google先生で検索。するとまたもstackoverflowに該当記事が。

You also need to rebuild your maven repository index in 'maven repository view'.

maven repo viewを探すのが面倒だったので、作成したmaven プロジェクトを削除して新たに作成しなおすことにした。無事indexが動き始める。

(追記:STS画面右上の小さな検索窓にmavenと入れるとmaven repoらしきものがあるのでそれを選択。すると、local,global,project,customのprojectが現れるので、globalを開き、centralの上で右クリックして、full-index-enabledにチェック。updateが始まるので完了するまで待ち、その後再びcentral上で右クリックをしてrebuild indexを選択。)

 

JDK1.8を使用するようにpom.xmlに以下を追記。

==================================

<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

</project>←これが最後のタグになるようにコピペ!

 

プロジェクト上で右クリックして、Maven > Update Project(alt+f5)で更新完了。

===================================

コントローラーとビューの作成の手前まで進めた。 

 

これまでの操作でDemoがなぜ動かなかったか、理由を2つほど思いつく。

1dependencesのダウンロードをしていなかった?

2以下の依存関係を追記します、となっていたが、dependencesタブに書き込むだけでpom.xmlには何も記述しなかった。これが不具合の原因か?

 

 

 

達人プログラマー 気づき

新装版達人プログラマーを購入。

新装版 達人プログラマー 職人から名匠への道 | Andrew Hunt, David Thomas, 村上雅章 |本 | 通販 | Amazon

 

目次をざっと読んで、1周目の読み方は

・「具体的なコード手法」(以降"1")

・「プロジェクトの進め方」(以降"2")

・「プログラマーの生き方」(以降"3")

に関連する情報のみを素早く拾い読む、としました。

2周目はそれらの情報が書いてあったページをじっくり読もうと考えました。

3周目は全てに目を通そうと考えました。

 

実践(1周目)で得た気づき:

1章

3 いい加減な言い訳よりも対策を用意する

1 割れた窓を放置しない 

1 常に大きな視点でものを見る

3 知識ポートフォリオに投資する(分散投資かつハイリスクローリスク)

2章

1 Dont Repeat Yourself -一度作成したらそれを簡単に再利用可能にする

1 直行性(片方を変更しても他方に影響を与えない)の高いコーディングをする

「恥ずかしがりなコード」「グローバルデータへの非アクセス」「類似性のリファクタリング

2 可逆性を担保しながら進める

2 曳光弾(機能間の連絡がとれた最低限のフレームワークを素早く作成してフィードバックをもらうこと)←→プロトタイプ(曳光弾とは違い使い捨て)

2 動的なもののプロトタイプにはポストイット

2 正確に見積もる(問題把握、問題再定義、問題分解、解決策具体化、検証)

 

3章

3 一つのエディタを熟知する

3 常にソースコード管理を使用する

3 自分自身も含めて信用しない

 

4章

特になし。

 

5章
1 モジュール間の結合度合いを最小に
1 どのようにではなく何をに重点を置いて考える
1 特殊な物事はコンパイル済みコードの外側に置く ex.Beans
1 モデルとビューを分離させる(評価されるものと評価するものを分ける

 

6章
1 早めにこまめにリファクタリングする
1 テスト設計を行う

 

 

to be continued...