Log of the Security

主に勉強系の記事書いてきます。

アセンブリ言語 メモ2

1, x86におけるアセンブリ命令と記法

 

アセンブリ言語アセンブリ命令と呼ばれる命令の集合で記述されている。

アセンブリ命令はオペコードとオペランドの2つからできている。

オペコードは命令が操作の種類をしてする部分であり、オペランドはオペコードに夜操作の対象となる部分である。

 

x86 or x86-64には2つの記法が存在する。一つはintel記法、二つ目はat&t記法。

IDE or llydbgではデフォルトでintel記法で表現される。

 

example) movv命令でeaxレジスタに5を格納する

 

intel) mov eax, 5

at&t) mov $5, %eax

 

at&tはプレフィックスも異なる。また第二オペランドと第一オペランドintel記法と比べて逆である。

 

x86アセンブリではオペランドにメモリアドレスを指定して、そのアドレスに格納されている内容を参照することができる。

 

ebx registerに格納されたアドレスを参照し、そのアドレスに格納されている値をeaxレジスタに格納する

ebx 0x01001234 = 5

eax レジスタにも5が格納される。

mv eax, [ebx]

 

さらにメモリアドレスを参照する際に、そのメモリアドレスから変異(ディスプレースメント)を指定することもできる。

つまり、ebxレジスタに格納されているアドレスから+4の位置にあるアドレスのように、あるレジストリに格納されたアドレスを基準にして、一定分変化した位置を以下のように示すことができる

 

mov eax, [ebx+4]

 

変位に加えて、オフセットレジスタやスケーラを指定することができる。この場合ベースレジスタ+変位+オフセットレジスタ*スケーラの位置アドレスにアクセスすることになります

 

アセンブリ言語を扱うオペランドに対しても、サイズを明示しなくてないけない。

例えば32bit整数に対してmov命令を実行する場合、対応するサフィックスであるlをつけてmovlという命令を用いる。

 

サフィックス一覧

b:byte(8bit)

s;short(16bit)

w:word(16bit)

l:long(32bit)

q:qwad(64bit)

t:10byte(80bit 浮動小数)

 

 

基本的なアセンブリ命令

[データ転送命令]

mov命令はsrcオペランドの値をdestオペランドに移動します。しかし、移動した後もsrcオペランドの値が失われるわけではないので、コピーといった方がしっくりくるかもしません。

 

mov dest, src

 

lea命令はsrcオペランドのアドレスを計算して、そのアドレスをdestオペランドにロードする。アドレス計算に用いられる。青dレス計算とは

lea eax, [esp+0x40] のように変位などを含めたアドレス計算をすること。この場合、スタックポインタに指すアドレスから変位0x40を加えたアドレスがeaxに格納される。

 

lea dest, src

 

xchg命令はarg1オペランドとarg2オペランドの値を交換します

 

xchag dest1 , dest2

 

lodsbは[DS:ESI]のメモリの内容をBYTEすなわち1倍分ALレジスタに読み込む。読み込んだ後はESIレジスタを、DFレジスタに基づいて、読み込んだ分、加算または減算する。

 

push命令は、argオペランドの値をスタックにpushします。具体的にはESPレジスタの値をレジスタ幅分(32bitでは4byte, 64bitでは8byte)減算し、argオペランドをESPレジスタの示すスタックのトップに格納する。

pop命令はスタックからargオペランドへpopします。具体的にはESPレジスタの示すスタックのトップ値をargオペランドへ格納espレジスタの値をレジスタ幅分加算します。し、

 

pop dest

 

add命令はdestオペランドにsrcオペランドを加算した結果をdestオペランドに格納します。sub命令も同様に、destオペランドからsrcオペランドを減算した結果をでsトペランドに格納する。

 

add dest, src

sub dest, src

 

mul命令、srcオペランドにEAXレジスタの値を乗算し、結果の上位4byteをedxレジスタ、下位4byteをeaxレジスタに格納します。

 

cmp命令はsub命令と同じ減算をします。しかし、結果はオペランドに格納されずに破棄される。

アセンブリ言語 メモ その1

英語の勉強もかねて、ところどころ英語で書くかもです。

1.register and stack

アセンブリ言語を読み解く上で重要な概念 = レジスタ、スタック

アセンブリ言語 = 機械と一対一で対応。コンピューターがアセンブリ命令を解釈して実行できる形式

そのため、アセンブリ言語の命令群がどのような設計をしているか知ることはコンピューターの設計と密度に関わっている。

 

プロセッサーアーキテクチャにより、どのような命令が用意されているか変わっていくる。そのため、プロセッサーごとのアーキテクチャーの設計や、それぞれのデータ構造を理解してくてはいけない。

 

the most using processe architecture x86

 

what is register?

A register is memory device to exist within processer, and it operates faster than the memory or auxiliary strorage device. 

プロセッサーが命令を実行する時は、直接メモリを操作するのではなく、メモリからレジスタへ読み出したデータに対して操作することが多い。

 

the strage capacity is very small(many case 32bit or 64bit), 

the processer is called typically 32bit or 64bit CPU, but it is decided by the reegister width. the processer usually has multiple register within it , and use properly by usefulness.

 

the x86 architecuture have 6 general register and 3 special registe in the computer.

6 general register = EAX, ECX, EDX, EBX, ESI, EDI

3 special register = EBP, ESP, EIP

がある。 ESIとEDIはまとめてindex registerと呼ばれることがある。

f:id:yottiii:20180723150847p:plain

genelral register のうち EAX,ECX,EDX,EBXのの下位16びっとは、AX,CX,DX,BXと呼ばれ、さらにその上位8bitをAH,CH,DH,BH, 下位8bitをAL,CL,DL,BLと呼ばれている。h

 

how to  use each register?

EAX(accumulator register):演算の結果を格納

ECX(counter register):ループ回数などのカウントを格納

EDX(data register):演算に用いるデータを格納

EBX(base register):アドレスのベース値を格納

ESI(source index register):一部のデータ転送命令において、データ転送元を格納

EDI(destination index register): "データ転送先"

 

EBP(base pointer register):現在のスタックフレームにおける底のアドレスを保持

ESP(stack pointer register):現在のスタックトップのアドレスを保持

EIP(instraction pointer register):次に実行するアセンブリ命令のアドレスを保持

 

これらをベースポインター、スタックポインター、命令ポインターと呼ぶことがある。

 

flag registerは前の命令によって生じた状態このとや、プロセッサーの状態を格納する。

このレジスタの保持している値によって、動作の変わる命令などがある。

EFLAGSregisterと呼ばれる32bit registerで実装されており、17個のフラグが格納されている。

2.バイナリ解析のさい、利用する頻度があるフラグ

 

CF(carry flag):演算命令でキャリー(桁上がり)かボロー(桁借り)が発生した時にセットされる

ZF(zero flag):操作の結果が0になった時にセットされる。

SF(sign flag):操作の結果が負になった時にセットされる。

DF(destination flag):ストリームの方向を制御する。

OF(overflow flag):符号付き算術計算の計算の結果がレジスタの格納可能範囲を超えた場合にセットされる。

 

セグメントレジスタとは、セグメントのアドレスを参照するのに用いられるレジスタです。

what is segment?

メモリを管理するために、格納するデータの種類によって領域として区切ったもの、セグメントをメモリ管理に用いる方法をセグメント方式と言います。

 

CS(code segment registe):コードセグメントのアドレスを格納。

DS(data segment register):データセグメントのアドレスを格納

SS(stack segment register): スタック絵Sグメントのアドレスを格納

ES(extra segment register):エクストラセグメント (追加セグメント)のアドレスを格納する

FS(F segment register):2番目の追加セグメントのアドレスを格納

GS(G segment register):3番目の追加セグメントのアドレスを格納

 

x86-64レジスタは・・・x86を拡張したもの

 

stack

後入れ先出し、煽は先入れ後出しのデータ構造のこと、

コンピュータアーキテクチャの技術用語では、メモリ空間の一部で、先入れ後出しのデータ構造を持つ領域のこと。

 

コールスタック・・・関数呼び出しに用いられる。

マルチバイト・・・一文字を複数のバイトで表す体型

 

バイトオーダー・・・マルチバイトデータをメモリ上にどのように配置するかを表すもの。

主要なアーキテクチャーのアセンブリを読むためにはビッグエディアンとリトルエディアンのバイトオーダーを知っておく必要がある。

MSB、LSB

MSB...Most signification byte マルチバイトのデータの中で最上位のバイトを指す。

LSB...Least signfication byte マルチバイトのデータの中で最下位のバイトを指す。

 

example)byte:01020304

this is 4byte to strings.

MSB = 01 低位のアドレス番地

LSB = 04 高位のアドレス番地

リトルエディアンでは

MSB = 01 高位のアドレス番地

LSB = 04 低位のアドレス番地

 

つまりリトルエディアンでは

04030201という並びで格納される。

x86 or x64ではこのリトルエディアンが採用されている。

SecurityFastCTF2018のwriteupとか

おはようございます、こんにちは、こんばんは!

今日は, securityfastCTF2018に出たのでその時のwriteupを書いたり,感想を書きたいと思います。

 

まずwriteupに関しましては,githubの方に詳細を書いています。

github.com

github.co

 

感想ですが,やはり高得点の問題はレベルが高く低いポイントのflagしか取れませんでした^^;

順位は181/1023

181位でした。問題は2問しか解けませんでしたがとても面白い問題が多くとても勉強になりました。特にmicsの問題は,結構頭を使う問題が多かったです。

 

次はgoogleCTFに関して書きます。

 

今更ながらセキュリティキャンプ 全国大会2017でやったことを書きます

f:id:yottiii:20180501195622p:plain

1.introduction

 よっちです!今日は今更ながらセキュリティキャンプ2017で何をやったかというのを書きます!

 なぜ今更?wやおせーよ!と思う人も多いと思います!なぜか!それはただ単に、めんどくさくて更新しなかったのです笑 ではつらつらと書いてきたいと思います。

 

2.セキュリティキャンプとは??

 まずセキュリティキャンプ全国大会に関して知らない人も多いでしょう。説明するのが大変なので以下のURLを参照してください!

www.security-camp.org

 

そこで私は集中Zというコースを選択しました。5日間同じものを作り続けるというコースです。ま集中Zは、Linuxアンチウイルスソフトを作ろうというコースです。集中Zでも5つの分野に分かれていました。

 

・Z1: 高品質なELFマルウェアシグネチャ(yara)の作成

・ Z2: 高精度なELFマルウェア分類

Z3: yaraシグネチャマッチングの高速化

・ Z4: 圧倒的高速なIDS(パケットフィルタ)の作成

・Z5: 圧倒的高速なマルウェアスキャンクラウドストレー ジの作成

 

私はこのZ3のyaraシグネチャマッチングの高速化をやりました。

f:id:yottiii:20180501195048p:plain

ちなみに受講生は私一人だったので、生徒一人に対し、講師一人というめっちゃ濃密でした笑

またこの講師の新屋さんという方がとてもすごい人でした^^;twitteと本は最後に貼っておきます!とにかく講師とのレベルの違いに驚きました。

 

3.yaraの高速化

f:id:yottiii:20180501195622p:plain

 で何をやったかというとyaraというマルウェア検知ツールの高速化を行いました!

具体的にyaraについて説明しますと。。。。

こんな感じです。

 

次にyaraルールについて説明します!

f:id:yottiii:20180501195805p:plain

どのようなものかというと、上の文字列の$test1と$test2の取りかがマルウェアの中に入ってたらExampleRuleと表示されます。ようは自分で独自のルールを書き、マルウェアを検知できるというものです。

またパターンの記述には正規表現も書くことができます!Yara2.0からは自前の正規表現エンジンを搭載しています!

それで今回の高速化の対象はyara3.6.3です。

githubのURLを載せておきます!!!

github.com

yaraシグネチャの要は固定文字列探索にあります。現在yaraは文字列の探索に、固定文字列探索を採用しています。なので以下のようなデメリットメリットが挙げれます。

正規表現探索は表現豊かだが遅い

・固定文字列探索は文字列だけなので速い

 

ここでmiraiのyararulesを見てみます

f:id:yottiii:20180501200606p:plain

https://github.com/Yara-Rules/rules/blob/master/malware/MALW_Mirai.yar

上記のURLにマルウェアのルールがまとめてあります。

 

4.高速化の検討

 セキュリティキャンプではこのyararulesの高速化をやったというのは先ほど話しました!ではどのように高速化したのかというのを説明してきます。高速化の方針としては

 

・YARAの固定文字列探索部分を高速化

  Quick Search と呼ばれるアルゴリズムを実装

 

ここで文字列探索についての説明をしておきます

 

単純な固定文字列探索

f:id:yottiii:20180501201108p:plain

              図 1.固定文字列探索例

 

あかさかさかすからさかすを探索する場合は、図1のような手順で1文字ずつずらして探索していくわけです。

次にQSアルゴリズムを見てみましょう!

f:id:yottiii:20180501201331p:plain

            図2.QSアルゴリズム探索

 

このアルゴリズムは図2を見てもらえばわかるように、キーワード末によって次にシフトする長さを決めています!

ちなみに計算量に関していかに示しておきます!!

 

 検索対象の文字列の長さをn、キーワードの長さをsとする

    • native な方法だと :最良O(n),最悪O(n*k)
    • オートマトン: 最良 ・最悪O(n)
    • Quick Search;最良O(n/k)最悪O(n*k) 

 

5.結果

今回全国大会では、このyara内部のアルゴリズムを高速化することをしました。では肝心の結果を見てましょう。

 

 

今回の検索対象はwikipediaの全て文字データ(1GB近くあるtextデータ)の中から

abcdefghigklmnという固定文字列を検索しました。

wikipediaデータ

https://dumps.wikimedia.org/enwiki/20170601/

 

vimeo.com

 

 

vimeo.com

 

 

このように限定的なケース(固定文字列探索で済む場合)において4倍ほどの高速化に成功しました!!!!!

※実装が不完全なため、シグネチャ正規表現などを含む場合は正しく動かない。

コードに関してはgithubに公開します!!

github.com

 

ここも参考にしてみてください!

speakerdeck.com

6.感想

・quick search アルゴリズムの理解

・膨大なソースコード読む

・書いたコードは六十行程度

・データ構造の理解

・高速化できたけどソースはまだ未完成(本家にマージできるレベルでは到底ない)

 

まずQSアルゴリズムが難しかったです!講師の新屋さんは、正規表現の研究者でもありとても計算量などに関して詳しく説明してくださいました!

二つ目に膨大なソースコードを読むのが初めてだったので、ここまで膨大5万行ほどのコードを読んだのは初めてだったので大変でした^^;またgdbというデバッカを使ってコードを読んだのですが、gdb使ったのもその時が初だったのでかなり覚えるのが大変でした。

ただそれ以上に得るものも多かったです!!このキャンプに参加して、自分もまだまだ修行が足りないので、もっともっと勉強しなくてはいけないと改めて感じることができました。またセキュリティ好きの同志もでき、今でも連絡を取り合ったりする人もいるので、とても良い機会だと思いました!!

悩んでいる人は是非とも参加するべきだと思います!!!!

 

7.最後に

セキュリティキャンプ2017で担当してくださった新屋さんはじめ、Zチームの講師のみなさん、その他講師のみなさんに深く感謝申し上げます。

 

参考文献

[1]新屋 良磨 ,鈴木 勇介,高田 謙 "正規表現技術入門 --最新エンジン実装と理論的背景",2015

twitter

新屋さん@sinya8282

 

 様子

https://pbs.twimg.com/media/DHPbSaGUAAAD8By.jpg

https://pbs.twimg.com/media/DHZVxi7VoAIM6Fl.jpg

https://pbs.twimg.com/media/DHQoizUUIAA7Apz.jpg

 

 

 

 

マルウェア解析入門2~basic static~

1.静的解析

 皆さんこんにちは。よっちです。今回は静的解析を実際に行っていこうと思います。static analysisはまずマルウェアのコードや構造を調べます。そのときマルウェアは実際に動作させない。対象にdynamic analysisは実際にマルウェアを動作させて解析を行います。dynamic analysisは今後やっていこうと思います。

実際に基本的な静的解析でやることを以下に示します。

マルウェア解析ツールを用いた静的解析

・ハッシュを使いマルウェアの識別

マルウェアのコードから必要な文字列を抜き出し、情報を集める。

 

以上をやっていきたいと思います。

 

2.マルウェアスキャン

 マルウェアの多くはパターンが決まっています。なのでマルウェアのデータベースと照合することでどのようなマルウェアなのか知ることができます。ただときどき検出できないマルウェアがあります。なぜならばシンプルにデータベースにないからです。データベースはあくまでも既存のマルウェアしか検知できません。亜種や新しく出てきたマルウェアは検知できません。しかしたいていの場合既存のデータベースで検知できます。ここで最も使われているウェブベースのデータベースを紹介したいと思います!

virustotal(www.virustotal.com)

f:id:yottiii:20180430130930p:plain

ここでマルウェアと思われるソフトをアップロードすれば自動で調べてくれます!実際にアンドロイドのマルウェアを検知させて見ます!

f:id:yottiii:20180430131237p:plain

こんな感じで検知してくれました!

ちなみに私は研究目的でマルウェアを保持しているので、皆さんはマルウェアを保持していると逮捕されるので気をつけてください^^;;

このデータベースは非常に優秀で数十種類のアンチウイルスソフトの結果を出してくれます。たいていのウイルスはここで引っかかるでしょう!

 

 

3.ハッシュを用いたマルウェアの検知

 ハッシュ関数というのはご存知でしょうか?初心者の方にわかりやすく説明すると、ハッシュというのはマルウェアをはじめとしたすべてのアプリケーション、オブジェクトの識別番号を振るための関数です。

f:id:yottiii:20180430132548j:plain

一方向性関数とも呼ばれます。データをハッシュ関数を通すことで、512ビットの文字列にすることができます。この文字列からデータを割り出すことはできません。いわゆる不可逆です。もっと詳しく知りたい方はggってみてください。

 

これからわかるように、各アプリケーションにもハッシュが割り振られているわけです。

ここで実際にwindowsの電卓のハッシュ値を調べてみます。

f:id:yottiii:20180430133608p:plain

ハッシュが以上のようになったことがわかります。

ここでプログラムの内部を1ビットでも変えるとまったく違うハッシュ値になります。

そこで照合を行い、改ざんされていると知ることができます。

これがハッシュを用いたマルウェアの検知です。

 

3.文字列を探す

 アプリケーションから特定の文字列を探したいと思うこともあるでしょう。文字列というのは基本的にASCIIとUnicodeが使われています。皆さんも一度は聞いたことがあるのではないでしょうか?ここでASCIIとUnicodeの仕組みについてふれておきましょう。

f:id:yottiii:20180430140636p:plain

このようにunicodeは一文字に対してnullがあるということがわかります。実際文字列を探索するときは、この属性や形式は無視します。しかし実際に文字列は間違った文字列を検知してしまう。たとえば"VP3"という文字列は,0x56,0x50,0x33,0x00である。しかし実際にこれはメモリーのアドレスだったり、プログラムを使用するときのCPUの割り振りの可能性がある。

しかし幸いにもそのような無効な文字列は明らかである。なぜならば、それらの文字列は正当な文字列ではないからである。

文字列の検知する例のプログラムは

・bit.ly/ic4plLからダウンローできる。

このプログラムで実際のアプリケーションの例をみてみよう!

f:id:yottiii:20180430143125p:plain

長いのでかなり省略したが、これらの文字列はlibrary等のコードであることがわかる。DLLの説明に関しては、また次回以降で行っていきたいとおもう。

 

 

Penetration Test~Intelligence Gathering~

1.はじめに

今日はペネトレーションテストのインテリジェンスギャザリングについてまとめて意向と思います。そもそもインテリジェンスギャザリングとは、ターゲットとなるサーバー等を調査する作業になります。

 

2.色々なインテリジェンスギャザリング

基本的なインテリジェンスギャザリングについてまとめてみました。

 -whois 

f:id:yottiii:20180429101401p:plain

whoisドメインの情報などをまとめて表示してくれるコマンドです。

 

-Netcraft

これはウェブサイトのDNSサーバー等を探すことができるものです。

サイトURLは

Netcraft | Internet Research, Anti-Phishing and PCI Security Servicesです。

 

 

nmap

これは非常にインテリジェンスギャザリングでよく使われるcmdです。

ためしに自分のipをスキャンしてみましょう!

f:id:yottiii:20180429102103p:plain

このように開いてるポートを表示してくれます。

ここでオプションの説明をします。

-sSはTCPステルススキャンと呼ばれ、tcpポートが開いているかどうかチェックしてくれます。

-Pnは接続確認にpingを使わない方法です。

ここで-Aというオプションを追加してみます。

f:id:yottiii:20180429102742p:plain

このように詳細が確認できます。

たとえばSQLサーバーを立てていた場合、どのソフトを使ってSQLサーバーを立てているかなどが詳細としてわかります。

 

 

高度なtpcスキャニング

-TPCアイドルスキャン

f:id:yottiii:20180429110329j:plain

アイドルスキャンは別のホストをスプーフィングしてターゲットにスキャンを仕掛ける。この方法により、ステルススキャンを可能にする。

ここでnmapを使うときに-sIオプションを指定する

nmap -Pn -sI OtherHostIP targetIP

でステルススキャンを行える。