ホーム » 未分類
「未分類」カテゴリーアーカイブ
Scureなapkを作るためのNative
こんにちは。kiwamizamuraiです。
今回はセキュアなapkの作り方について少しまとめます。apkってなんだ?という方は以下の記事をどうぞ。
そもそもこの記事を書こうと思ったのはJavaが原因なんですよね。

NDKはアプリケーションの一部をネイティブに変換するためのツールです。また、コンパイルされたsoファイル(共有ファイル、windowsの場合は.dll)はJNIによってJavaが扱えるようにされます。また、ネイティブを使うことによって早くなることもメリットの一つになります。
一方でデメリットもあります。一つはファイルが大きくなることです。アンドロイドはさまざまなアーキテクチャ上で動くことができるため、その分互換性のあるファイルを多く持つ必要があります。デコンパイルしたapkのlib内を確認してみます。
上の画像からわかるようにそれぞれのマイクロプロセッサーに対応する機械語のファイルがあることがわかります。

詳しくはドキュメントを読んでください。

JavaのコードはDEXと呼ばれるバイトコードに変換されます。これはARTで動くためです。最近のアプリケーションはARTで実行されます。一昔前はJavaVMで動いていました。で、問題はこのバイトコードがデコンパイルされやすいことです。デコンパイルの過程も復習します。

復習ですがsmaliファイルはdexのアセンブリでした。このデコンパイルが簡単な理由は次のようです。

簡単に言えば、コンパイルの最適化が単純なことが原因です。メタデータ(クラス名やメソッド名)が付与されることが大きい理由らしいです。で、なぜコンパイルが単純なのか僕なりに調べました。原因はJITです。
ちなみに、dexじゃなくて機械語にコンパイルすればいいじゃんということにもなります。GCJというコンパイラが一応ありますが詳しくはわかっておりません。
僕の中の回答はIDA Proの商用版で解析することです。Free版だと対応のCPUがありません。。。。まあせっかくなのでJavaでnativeが動くまでについても調べてみます。
ネイティブメソッドが走るには.so内のSystem.loadLibraryかSystem.loadが呼ばれる必要があるようです。そしてその時に先ほど紹介したJNIのJNI_OnLoad()とかが使われるらしいです。じゃあ具体的にNativeってJavaの中でどう書かれているの?と思うのでみてみます。

ちょっと複雑ですが簡単にいうとnativeがあればネイティブメソッドということです。詳しくは参照よりどおぞ。
今回はセキュアなapkの作り方について少しまとめます。apkってなんだ?という方は以下の記事をどうぞ。
そもそもこの記事を書こうと思ったのはJavaが原因なんですよね。
Recap
とりあえず3つの手法があるようです。Isolate Java Program
重要なClassをサーバー側に置いておくことです。クライアントとは通信によってそのファイルへアクセスさせます。こうすることでデコンパイル自体を不可能することができます。重要なデータについてもサーバー側に置いておくことでデクリプションの可能性もなくなります。Convert to Native Codes
アンドロイドアプリケーションはJava(Kotlin)が一般的です。しかしJavaはデコンパイルされやすいです。(理由は後述します。)そこでデコンパイルが難しいネイティブを組み込む方法です。ネイティブはデコンパイルしたところでアセンブリになります。画像をもって説明します。
一方でデメリットもあります。一つはファイルが大きくなることです。アンドロイドはさまざまなアーキテクチャ上で動くことができるため、その分互換性のあるファイルを多く持つ必要があります。デコンパイルしたapkのlib内を確認してみます。

Code Obfuscation
ProGuardなどのツールを用いてコードを難読化する方法です。クラス名やメソッド名が乱数になったりします。以下をしてくれます。- Shrinking – detects and removes unused classes, fields, methods, and attributes.
- Optimization – analyzes and optimizes the bytecode of the methods.
- Obfuscation – renames the remaining classes, fields, and methods using short meaningless names.

Why is Java easily cracked?
先ほど対策方法でネイティブを埋め込む理由としてJavaはデコンパイルされやすいと言いました。それについて少し深入りします。そもそもJavaのコンパイル、デコンパイルの流れを確認しましょう。


Just-In-Time Compiler
JITはJavaのコンパイラです。ネイティブのコンパイルとの違いはタイミングです。これはdexをnative codeに変換します。公式からワークフローを拾ってきました。 よくわからないのでコピペで引用します。JIT コンパイラは、ART の現行の事前(AOT)コンパイラを補完し、ランタイムのパフォーマンスの改善、ストレージ容量の節約、アプリとシステムのアップデートの高速化を実現します。また、アプリの自動アップデート中のシステム シャットダウンや無線(OTA)アップデート中のアプリの再コンパイルを回避することで、AOT コンパイラのパフォーマンスも改善します。ここはまだ理解できる気がしないので今後の課題にしておきます。
ちなみに、dexじゃなくて機械語にコンパイルすればいいじゃんということにもなります。GCJというコンパイラが一応ありますが詳しくはわかっておりません。
Reverse Engineering Native Code
Javaが単純なのでNativeで書こう、ということになりました。ではNative Codeは本当に安全なのでしょうか?少しだけ深入りします。
ネイティブメソッドが走るには.so内のSystem.loadLibraryかSystem.loadが呼ばれる必要があるようです。そしてその時に先ほど紹介したJNIのJNI_OnLoad()とかが使われるらしいです。じゃあ具体的にNativeってJavaの中でどう書かれているの?と思うのでみてみます。

感想
やはりネイティブ最高、リバエン最高ですねReferences
- https://stackoverflow.com/questions/6235290/how-to-make-apk-secure-protecting-from-decompile
- https://stackoverflow.com/questions/12450510/why-is-it-so-easy-to-decompile-java-code
- https://limbenjamin.com/articles/analysing-smali-code.html
- https://www.spigotmc.org/threads/why-is-c-c-significantly-harder-to-decompile-than-java.343897/
- https://stackoverflow.com/questions/13509961/which-method-eventually-calls-jni-onload
- https://www.virusbulletin.com/uploads/pdf/magazine/2018/VB2018-Stone.pdf
- https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html
Frida 入門
こんにちは。kzです。
今回はFridaを使ってAndroid用のCTFを解いてみます。
これが今回のapkです。Objectiveのところにあるように、secret stringを見つけて、root検出の回避が目標です。
とりあえず起動してみるとこんな感じ。(エミュレータを使用しています。実機ほしい、、、、)
おー、root detectedですね。これは端末がroot化されているものを検出したということです。たとえばiPhoneのJailbreakも同じようなものです。なぜroot化かするのか?ですがたとえばゲームがいい例です。ゲームでチートってあるじゃないですかあれとかができるようになります。他にもiPhoneの場合だとTweakというアプリが作れたりします。ただ、よくないので行わないでください。

root判定の部分がありました。

ふむふむ、Successとなるように分岐されるところのソースコードをみてみます。

Base64の文字列5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=ともう一つ気になるHex?があります、8d127684cbc37c17616d806cf50473ccこれはなんだろう、、?その後にAESもありますね、ということは逆算してパスフレーズがわかりそうです。ぐぐるとJavaにはCipherというAES/ECB/PKCS7Padding暗号があるようです。
どうやらkeyと平文を引数とする関数のようです。さらにHexの方がKeyであることがソースコードよりわかります。
なのでPythonでちゃちゃっとやります。

パスフレーズがわかりました。イエーい。まあそれはおいておいて、今回はFridaがメインみたいなところありますからね、、

使い方は少々面倒ですが公式のドキュメントを頑張って読みましょう。
まずはfridaとfrida-serverのインストールです。frida-serverはアンドロイドに埋め込んでfridaを実行できる環境にするためのものです。

では、fridaのドキュメントを参考にしながらbypassのためのコードを書きます。exploit.jsと命名しました。アプリの挙動から考えて起動後最速でHookしたいですね。あ、Hookとはアプリケーション外に定義されたスクリプトを実行する行為のことを言います。
ここではアプリ起動時のroot detectedのスクリプトをHookingにより無効にします。そして入力可能な状況を確立し、先ほどのパスフレーズを入力して目標を達成します。他にもいろいろやり方はあるのでいろんなwrite-upを参考にしてくださいね。
最終的にはこんな感じ

あとはターミナルを開いてfrida-serverを立てたのちにpyを実行するだけです。

起動時

rootをbypassできました。先ほどのパスフレーズを入力してみると

簡単ですね。ちなみに、Pythonでなくてもjsでfrida CLIから実行する場合は

とはいえ、level1なだけあって簡単ですね。マルウェア解析もやっていきたいです。
今回はFridaを使ってAndroid用のCTFを解いてみます。

とりあえず起動してみるとこんな感じ。(エミュレータを使用しています。実機ほしい、、、、)

Source Code
Javaのコードをデコンパイルして覗いてみましょう。やり方は前回の記事にあります。こうすることでroot detectedの実装が確認できます。


どうやらkeyと平文を引数とする関数のようです。さらにHexの方がKeyであることがソースコードよりわかります。


Frida
Fridaとはモバイルアプリケーションの動的解析ツールです。静的解析と違ってソースコードを書き換えてリビルドしてアプリを起動する、といった一連の流れをスキップして動的に解析が可能です。

ここではアプリ起動時のroot detectedのスクリプトをHookingにより無効にします。そして入力可能な状況を確立し、先ほどのパスフレーズを入力して目標を達成します。他にもいろいろやり方はあるのでいろんなwrite-upを参考にしてくださいね。
exploit.js
ではHooking用のスクリプトを書きます。このjsのコードをpythonのファイルに埋め込んでpythonのAPIより実行します。





Root Detection
iOSのJailbreak検出の実際の手法をいくつか紹介だけしておきます。- System Files Check
- Symbolic Links Detection
- Calling Cydia’s URL Scheme
- Loaded Libraries
とはいえ、level1なだけあって簡単ですね。マルウェア解析もやっていきたいです。
References
UpliftModeling 入門
こんにちは。kzです。

本日はアップリフトモデリングやっていきます。こちらも傾向スコア分析と同様にマーケティングの分野で使われる機械学習的な手法です。ちなみに論文の原本はこちらです。
まず前回の復習を行い、今回のアップリフトモデリングとの違いをはっきりさせましょう。
今回のアップリフトモデリングは少し異なります。名前の「アップリフト」からわかるように費用対効果を最大化するためのモデリングです。つまり、どういったユーザーをTreatすれば無駄なく効果を最大化できるかをモデリングします。一方で傾向スコア分析は因果効果の推定方法です。
前回のサイゼリアを例にするとTreatmentはクーポンの配布です。ラベル
がサイゼリアに行ったか、行かなかったかです。アップリフトはこのクーポンの費用対効果を最大化させるための指標です。
見ての通り、図中の白い部分のユーザーを対象にクーポン配布することが最も効果的であることがわかります。
見ての通りこれは各集合における成功確率の差です。(モデルはそれぞれ定義します。)したがってアップリフトモデルは

として定義されます。ちなみに、参考文献ではアップリフトを差ではなく、割合として定義されていました。おそらくどちらでも構わないと思いますが、この記事では論文にしたがって差として話を進めていきます。(割合にすると理論上は無限まで飛びます。)
また、先ほどの図とこのUMの値を共に考えていただきたいのですが、UMが大きいとはつまり、P(Y=1|X, G=T)が大きく、P(Y=1|X, G=T)が小さいことを意味します。これはまさに図中の白い部分に相当します。逆も同様です。したがってアップリフトが費用対効果最大化の指標として素晴らしいことがわかります。
アップリフト上位の
個のサンプルに対して次がliftになります。

N_TはTreatmentの総数です。またベースラインはアップリフトの上位ではなくランダムで算出した値になります。
ここで考えます。アップリフト上位のデータ群に対するLIFTは右上がりになりますよね。これは先ほどのUMの写像の際の説明からわかります。となると逆も然りです。つまり、アップリフト下位のデータ群はLIFTは右下がりになることが予想できます。したがって最終的にAUUCのグラフはAUCと同様に凸関数のような形になり、その頂上を刺す時のUPLIFTが閾値として最適であると判断できます。(AUUC図のx軸はアップリフトの降順、y軸はLIFT)AUUC自体はbaselineとliftに囲まれた実数になります。
ここまでのTwo-Model ApproachではTreatmentとControlのそれぞれについてmodelを用いて
を予測しました。しかし、二つのmodelを用いることによってパラメータチューニングが難しくなるなどの問題点があります。共変量シフトがあるかもしれないので。そこで単一のモデルのみを用いたClass Variable Transformationについてみてみます。
まずは次の変数を導入するところからです。
これを用いて先ほどと同じように
について確率を計算してみます。

ここで割り当ては無作為を仮定します。これ重要。したがって

こちらも必要な仮定になります。

また、次も成り立ちます。

すると次が得られます。

お、できました、移項すると

つまり新しく導入した
が1になる確率を予測するモデル一つで先ほどと同じようにアップリフトが算出できるということです。
ちなみにAUUCとLIFTはアップリフトモデリングの指標なのでこちらのアプローチにももちろん使えます。

閾値としてのアップリフトスコアは0.03あたりが良さそうです。ちなみにスコアと各確率は次のような感じ

先ほどのグラフで原点より左が潰れていることがここから確認できます。ではもう一方のアルゴリズムでも確認してみます。


シングルモデルのおかげか綺麗なグラフになっています。ちなみにコンバージョン率のパーセンタイル分布は以下のようになってます。


シングルモデルの方が上位60パーセントにおいてTreatの効果があることがわかります。
長くなりましたが実装貼っておきます。
一般化傾向スコア分析が難しすぎます。でわ

傾向スコア分析
復習です。傾向スコア自体はバランシングスコアの特殊形として定義される実数でした。その実数を出力する関数(モデル)としてロジスティック回帰を使うのでした。こうして得られた傾向スコアがRubinのSUTVAを満たしてくれるおかげで、「もしTreatmentを受けていたら〜」の代替として扱えるのでした。今回のアップリフトモデリングは少し異なります。名前の「アップリフト」からわかるように費用対効果を最大化するためのモデリングです。つまり、どういったユーザーをTreatすれば無駄なく効果を最大化できるかをモデリングします。一方で傾向スコア分析は因果効果の推定方法です。
Who is Target ?
上のセクションで述べた「どういったユーザー」について確認します。Rubinのモデルを思い出してください。「もし〜だったら」も含めたユーザーの行動の有無を考えると行動パターンは次の4種類になります。

見ての通り、図中の白い部分のユーザーを対象にクーポン配布することが最も効果的であることがわかります。
Two-Model Approach
ではそのアップリフトの定義です。The uplift is defined as the difference between success probabilities in the treatment and control groups.


また、先ほどの図とこのUMの値を共に考えていただきたいのですが、UMが大きいとはつまり、P(Y=1|X, G=T)が大きく、P(Y=1|X, G=T)が小さいことを意味します。これはまさに図中の白い部分に相当します。逆も同様です。したがってアップリフトが費用対効果最大化の指標として素晴らしいことがわかります。
AUUCとLIFT
AUUCはアップリフトモデリングの指標になります。The Area Un- der the Uplift Curve (AUUC) can be used as a single number summarizing model performance.AUCのように面積が広い方が精度が高いことを意味します。このAUUCの導出の際にLIFTと呼ばれる値を用います。AUCがどうやって導出されたかを思い出して考えます。AUCは無数の閾値で与えられたグラフでした。さらにTPRとFPRに対してトレードオフの性質を持っていました。AUUCも同じようなものです。
アップリフト上位の


ここで考えます。アップリフト上位のデータ群に対するLIFTは右上がりになりますよね。これは先ほどのUMの写像の際の説明からわかります。となると逆も然りです。つまり、アップリフト下位のデータ群はLIFTは右下がりになることが予想できます。したがって最終的にAUUCのグラフはAUCと同様に凸関数のような形になり、その頂上を刺す時のUPLIFTが閾値として最適であると判断できます。(AUUC図のx軸はアップリフトの降順、y軸はLIFT)AUUC自体はbaselineとliftに囲まれた実数になります。
ここまでのTwo-Model ApproachではTreatmentとControlのそれぞれについてmodelを用いて

Class Variable Transformation
とはいえ単一のモデルでどうやってアップリフトを定義するのでしょうか。非常に気になります。文字がかなり出てきますが頑張っていきましょう。まずは次の変数を導入するところからです。









ちなみにAUUCとLIFTはアップリフトモデリングの指標なのでこちらのアプローチにももちろん使えます。
アルゴリズムの比較
まずはAUUCです。






長くなりましたが実装貼っておきます。
References
Android リバースエンジニアリング 入門
こんにちは。kzです。
前どこかの記事で書いたかもしれませんが、僕はリバエンが大好きです。好きすぎてやばいです。めちゃめちゃ楽しいので皆さんにも紹介します。
リバエンしていきたいと思います。この.apkはCTF的なやつでroot detectedをbypassするのが最終目的になります。しかし今回の記事では.apkからJaveのコードをデコンパイルするまでの内容になります。
apkってなに?という方もいるかと思うので用語などについて説明します。
見ての通り.pngなどいろいろありますね。これはあくまで一例ですが、いくつか紹介します。


apktoolというものを使います。これを使えば.apkを展開できます。結果的に上で紹介したAndroidManifest.xmlなどが見れます。

上のどちらかのコマンドで.apkを展開できます。
これで展開したので.smaliを直接書き換えてから.apkを新しくリビルドする作戦でもいいですが、初心者には少しきついのでとりあえずここではJavaのソースコードまでコンパイルする作戦でいきます。ソースコードが見れれば振る舞いが理解しやすいですしね。
そこで.dexをJavaに変換するツールが必要になります。
出力される.jarファイルはclasses-dex2jar.jarです。ちなみに.apkから.jarまで一気にやるパターンは試してません。

僕はmacなのでmac版をインストールして上で作ったclasses-dex2jar.jarを開けば

いい感じです。

からの

これでインストールできます。adb系のコマンドはいろいろありますね。

とりあえず今回はここまでにします。リバエンかfridaかどっちが好きですか?
前どこかの記事で書いたかもしれませんが、僕はリバエンが大好きです。好きすぎてやばいです。めちゃめちゃ楽しいので皆さんにも紹介します。
UnCrackable App for Android Level 1

apkってなに?という方もいるかと思うので用語などについて説明します。
Introduction to .apk file
アンドロイドのアプリケーションは.apkという拡張子を持ちます。実はこれは.zipと同じでリネームして展開すると開ます。今回の.apkを例にとって開いてみましょう。
- AndroidManifest.xml
- permissionとかpackageとかapiとか
- META-INF
- MF アプリのハッシュ値
- RSA アプリの証明書
- SF: list of resources and the SHA-1 digest of the corresponding lines in the MANIFEST.MF file
- classes.dex
- コンパイルされたJava(Kotlin)のDalvik bytecode(プログラムの部分)
- res
- 画像とかのリソース
- assets
- マルウェア系が組み込まれやすいところ
- lib
- nativeライブラリ
- .smali
- .dexのアセンブリ

From .apk To .dex
上では.apkを.zipにリネームしてから開く方法を紹介しましたが実はこれよくないです。なぜならば一部がバイナリ エンコードされています。そこで専用のツールを使って.apkをdecompileして.dexを取得する方法を紹介します。

これで展開したので.smaliを直接書き換えてから.apkを新しくリビルドする作戦でもいいですが、初心者には少しきついのでとりあえずここではJavaのソースコードまでコンパイルする作戦でいきます。ソースコードが見れれば振る舞いが理解しやすいですしね。
そこで.dexをJavaに変換するツールが必要になります。
From .dex To Java (decompiled)
dex2jarというものをつかいます。 どちらも一応同じものですが- d2j_invoke.sh
- d2j-dex2jar.sh

See Decompiled Java Code
あとはJD-GUIを使えばソースコードが見れます。

Resign signature
デコンパイルした.apkをEmulatorでも実機でもどちらでもインストールしようとするとFailure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION]とエラーが出る場合が多いです。そんな時はsignature(certification)が潰れてるので再発行します。その前にリビルド



References
- https://qiita.com/k-yamada-github/items/16f8eda646db982daee9
- https://urandroid.hatenablog.com/entry/20110818/1313656536
- https://programmer.help/blogs/5c2d94bc79b12.html
- https://adbshell.com/commands/adb-root
- https://docs.oracle.com/javase/jp/13/docs/specs/man/jarsigner.html
- https://docs.oracle.com/javase/jp/1.5.0/tooldocs/windows/jarsigner.html
コンピューターにとっての「あ」とは
こんにちは。kzです。
僕の長年の疑問を解決しようと思います。それはコンピュータが「あ」という文字をどのように理解しているかです。同じ疑問を持たれている方は多いはず、、、?
個の情報を対応づけられます。なので256文字以内だと1byteで表現できますね。例えばアルファベットは26文字です。このように1byteで表現できる文字を1バイト文字と言います。また、対応付る文字を文字集合、それにビットを対応づけたものを文字コード(符号化文字集合)と言います。下のようにACSIIは一例です。
おや?UTF-8 Unicodeというものがありますね。これについては下で説明します。ところで、日本語は、、?平仮名だけだと約70なので大丈夫ですが、常用漢字は2000を超えます。これではまずい、

で、ここから難しいんですけど、コードポイントは符号空間という場所で割り振られているようなんですがそこに「面」という概念がありまして、、
正直よく分からないのですが、第ゼロ面の基本多言語面(BMP)だけとりあえず気にすれば良さそうです。
下に書いてある「異体字セレクタ」ですが今回の


が異体字に当たります。これらの微妙な違いに対してコードポイントを付与する行為は非常にもったいないと思いませんか?そこでベースとなる漢字を基底文字と呼ばれるものを用意してそれを装飾しようという仕組みが異体字セレクタです。そして参考にある日経の記事によると漢字は2byteから8byteへ変わろうとしているらしいです。
Cのメモリについて勉強しているときにふと気になって調べると色々わかって楽しかったです。でわ
僕の長年の疑問を解決しようと思います。それはコンピュータが「あ」という文字をどのように理解しているかです。同じ疑問を持たれている方は多いはず、、、?
1バイト文字
1bitは0か1が入る箱です。これが8つ集まって1byteです。1byteは00000000~11111111のように表現できるので例えば- 00000000を「あ」
- 00000001を「い」

Unicode
上でUnicodeなるものが登場しました。これも文字コードの一種です。- Unicode: 世界中で使われている文字や記号たち
- JIS: 平仮名とか
- ASCII: アルファベットと一部の記号
UTF-8
これは符号化方式です。他にShift-JSなどがあります。文字コードを定義したにもかかわらず、なぜこんなものが必要なんでしょう?複数の文字コードを併用する際に必要になるそうです。- Unicode: UTF-8
- JS: Shift-JS
コードポイント
上の1byteの文字でやったように世界中の文字(Unicode)に対して同様の操作を行った時に付与される個別のコードをコードポイントと呼びます。16真数表示が一般的で先頭に「U+」がつきます。
正直よく分からないのですが、第ゼロ面の基本多言語面(BMP)だけとりあえず気にすれば良さそうです。
BMPとか
BMPは第ゼロ面です。コード位置はU+0000~U+FFFFです。これをもう少し細かくみます。- 1byte(U+0000~U+007F)
- 2byte(U+0080~U+07FF)
- 3byte(U+0800~U+FFFF)
Conclusion
とりあえずいろんな方式や文字コードがあったのでコンピュータが「あ」をどのように受け取っているか正確なことはわからないがイメージはできた。UTF-8が最もポピュラーらしいので「あ」は「\xe3\x81\x82」ということにしよう。この文字はなんバイト?
もうこの時点で、「あ」がなんバイトなんだ、のような話はあまり意味を為さないと思えてくると思いますが、少しまとめます。異体字セレクタ
元号が令和になりました。で、この「令」の漢字色々ありますよね。経済産業省のホームページには次のような質問がありました。


Cのメモリについて勉強しているときにふと気になって調べると色々わかって楽しかったです。でわ
Reference
- https://www.key-shortcut.com/en/writing-systems/ひらがな-japanese
- https://ja.wikipedia.org/wiki/異体字セレクタ
- https://www.meti.go.jp/policy/it_policy/kaigen/faq.html
- https://opentype.jp/charactercode.htm
- https://tech.nikkeibp.co.jp/it/article/COLUMN/20100126/343783/
- https://tech.sanwasystem.com/entry/2017/11/13/102531
- https://elite-lane.com/difference-between-unicode-and-utf-8-and-utf-16-and-utf-32/
- http://appakumaturi.hatenablog.com/entry/20120414/1334334986
dockerでkali-linuxの環境構築
こんにちは。kzです。
今回は久しぶりにセキュリティ関連の記事です。ちなみに前回は
をやりました。あれからGhidraがなぜか動かなくなって困っているんですよね僕。それはいいとして今回はdockerでkalilinuxの環境構築です。

ということでダウンロードしましょう。

次にKitematicを起動します。

左にあるのがコンテナです。多分みなさんはまだ空のはずです。ちなみにDockerfileは下のものです。

Createしたら左にコンテナが生成されると思うのでそれをクリックしてから

するとTerminal(Windowsの方はCommandPrompt)が開くと思います。ちなみに僕はItermというオシャンティなやつを使ってます。


パッケージをインストールする前に必ずすべきコマンドが二つあります。

アスキーアートは起動毎に変わります。無事起動できました。exitで抜けられます。
ターミナルでDockerからBashに移動してから下のように打ちましょう。
上ではdocker commitでkali_envというイメージ名で作りました。今後このカップ麺を食べたくなった時は
今回は久しぶりにセキュリティ関連の記事です。ちなみに前回は
をやりました。あれからGhidraがなぜか動かなくなって困っているんですよね僕。それはいいとして今回はdockerでkalilinuxの環境構築です。
KaliLinuxとはなんぞや?
このページを見ている方の大多数はMacかWindowsかLinuxを使っておられると思います。僕はMacです。そしてそれぞれOSというものがあります。今回扱うKaliLinuxとはLinuxOSの一種であり、ペネトレーションなどのセキュリティに優れています。ちなみに双子の兄弟的な存在のParrotOSというものもあります。Dockerとはなんぞや?
例えばこんな状況があります。- Macbook使ってるけどWordとか使えへんしWindows使いたいわぁ
- Windowsとりあえず生協で買ったけどLinux使ってみたい
- Virtual Machine
- Vagrant
- Dual Boot
Kitematicとはなんぞや?
これはGUIでdockerが使える便利ツールです。GUIがわからない方は次をイメージしてください。- GUIは.ipynb
- CLIは.py

kalilinuxのコンテナをゲットする
まずはインストールしたDockerをアプリケーションから起動しましょう。すると下のようにメニューバーのクジラのアイコンを押すと少し経ってから緑になります。




ツールのInstall
これでKaliLinuxが使える状態にはなりましたが、色々とツール(パッケージ)をインストールする必要があります。なのでやっていきましょう。
- apt-get update
- apt-get upgrade
- apt-get install vim
- apt-get install nmap
- apt-get install metasplot-framework
- msfconsole

イメージの保存
今色々パッケージをインストールしました。これを元に新たなイメージを作ろうと思います。Docker用語としてイメージ・コンテナがあります。簡単に説明しますと- イメージはカップ麺にお湯を入れる前
- コンテナはカップ麺にお湯を入れた後
- kaliをCREATEした(カップ麺を入手し、お湯を注いだ)
- execでkaliのコンテナに入りパッケージをインストールした(カップ麺の具材が増えた)
ターミナルでDockerからBashに移動してから下のように打ちましょう。

- docker run -it kali_env
- iはホストからコンテナをつなぐ
- t(ttyの略)はコンテナからホストにつなぐ
- itでコンテナ内部で作業をする時(kaliを使いたい時)
感想
Dockerfileをいつものように書かないで済んだので楽でした。次回は早速metasploitした記事を書こうかな?あと調べているとvncというものを使えばブラウザでkaliが使えるようですね。勉強になりました。でわ。Reference
位相空間論の基礎まとめ
こんにちは。kzです。
前回、集合論をまとめました。今回は位相空間論です。この分野は機械学習に密接に関係しているものになります。例えば
- Reproducing Hilbert Space
- Dimension Reduction
位相空間
定義
次の条件を満たすXの部分集合の族UをXの開集合系というなら、
の元からなる任意の集合族
に対し、






命題
位相空間Xの閉集合全体の集合Fは次の性質を満たす.なら、
の元からなる任意の集合族
に対し、
命題









集積点と孤立点










命題






ポイントとしては、位相空間は開集合のある空間ということですね。もっと雑にいうと「近さの概念」だと思ってもらっていいです。(違うんですけどね)位相にも密着位相など色々あるんですけど、これから距離などの議論を進めるための準備だと思ってくれるといいです。
定義
Xを位相空間とする.- 任意の
に対して、一点集合
が
の閉集合になるならば、
を
空間という.
- 任意の
に対して、
ならば、開集合
で
かつ
を満たすものが存在するとき、
を
空間またはハウスドルフ空間という.
- 任意の
と
の閉集合
に対して、
ならば、開集合
で
かつ
を満たすものが存在するとき、
を
空間という.
条件を満たす
空間を正則空間という.
- 任意のXの閉集合
に対して、
ならば、開集合
で
かつ
を満たすものが存在するとき、
を
空間という.
条件を満たす
空間を正規空間という.












命題
ハウスドルフ空間の収束点列の極限点は一意的に定まる.空間が出てきましたが、覚えておくべきは「ハウスドルフ空間」です。次元削減の「T-SNE」において「多様体」というものが出てきますが、そこでハウスドルフ空間が大切になります。また、数学では「一意」が結構大切です。
連続写像














命題










命題


は連続写像である.
の任意の開集合
に対して、
が
の開集合になる.
の任意の閉集合
に対して、
が
の閉集合になる.
定義


の任意の開集合
に対して、
が
の開集合になるとき、
を開写像という.
の任意の閉集合
に対して、
が
の閉集合になるとき、
を閉写像という.
が連続な全単射であり、逆写像
も連続であるとき、
を同相写像という.
命題




命題


は同相写像である.
は連続な全単射開写像である.
は連続な全単射閉写像である.
個人的にな意見ですが、「連続=開集合」のイメージを持っています。特に多様体の証明の時にめっちゃ使うイメージです。
距離空間
定義
次の性質を満たす関数

- 任意の
Xに対して、
が成り立つ.
- 任意の
Xに対して、
が成り立つ.
- 任意の
Xに対して、
が成り立つ.
定理











距離の定義は覚えましょう。KLは距離ではありません。JS divergenceは対称性を加味したものですね。
コンパクト空間













命題









定理
コンパクト空間からハウスドルフ空間への連続な全単射は同相写像である補題

![Rendered by QuickLaTeX.com [a,b]](https://research.miidas.jp/wp-content/ql-cache/quicklatex.com-fcda5ef4ae327e1afef79dc73df91703_l3.png)



最大値・最小値の定理



定理

はコンパクトである.
は点列コンパクトである.
は全有界かつ完備である
定理



中間値の定理







とりあえず、コンパクトだと便利なんです。また、私たちが議論する場はほとんどが実数世界なので「コンパクト=有界閉集合」なんです。なのでイメージしやすいと思います。イメージとしては覆得れば良いので水溜りも球体もコンパクトです。今回は位相空間論でした。基礎を部分的にまとめただけなので詳しく知りたい人は数学書を読んでください。T-SNEなどの論文を軽く見るのもいいかもしれません。
Ghidraが人気のようですがマルウェア解析の記事ももっと書きたいですねえ。でわ。
集合論の基礎まとめ
こんにちは。kzです。
今まで数学に触れつつ機械学習を中心に書いてきましたが、おそらく読者さんは数学科の方ではないと思うのでアルゴリズムの記事をみて、数学書を読もうとした方が本を買ってから後悔しないように、大学一年で習う集合論というものを簡単にまとめてみました。なのでこれは素人の方が数学書の初戦でボコボコにされないための踏み台のような扱いになればいいかな、と思っています。なお、この内容は大学の数学科1年生が習うものになります。
集合
数学で考える対象のはっきりとした集まりのことを集合といいます。ある集合




有限個の元からなる集合を有限集合と呼び、無限個の元からなる集合を無限集合と呼びます。




集合を表す場合、

自然数全体の集合などに以下の記号を用います。
自然数全体の集合
整数全体の集合
有理数全体の集合
実数全体の集合
複素数全体の集合














空集合は任意の集合の部分集合であると定義します。












集合









有限個の集合






ここまでは高校数学でも経験があると思うので直積を除いて簡単ですね。直積は書き方が独特ですが、ただの写像です。簡単にいうと、「二倍する」という写像は引数をひとつ取り出力をひとつ返します。一方で「掛け算」という写像は二つの引数に対しひとつの出力を返します。このようにいくつかの引数を考えるときに直積を使います。
写像
集合































また、






2つの写像





「写像」という言葉が出てきましたがただの「関数」だと思ってもらって構いません。人によっては「作用素」と言う人もいます。「


Proposition
- 3つの写像
に対して等式
が成り立つ.
Definition


が成り立つとき
は単射であるという
が成り立つとき
は全射であるという
が単射かつ全射であるとき、
は全単射であるという







写像







「逆写像」とよく間違えられるもので「逆像」と言うものがあります。また、「恒等写像」が出てきましたがこちらは有名なResnetのアルゴリズムで登場します。
Proposition
が逆写像を持つことと
が全単射であることは同値である
関係



Definition




- 任意の
に対して
(反射律)
となる任意の
に対して
(対称律)
となる任意の
に対して
(推移律)




















「同値類」、「商集合」は初見で理解するのは難しいものだと思います。僕のイメージとしてはとある集合に対して「グルーピング」の動作を考えます。ここでグルーピングされてできた新たな集合を商集合、各グループを同値類、グルーピング方法を同値関係と言います。簡単な例は割り算のあまりです。
Definition




- 任意の
に対して
(反射律)
となる任意の
に対して
(反対称律)
となる任意の
に対して
(推移律)

順序集合










このとき、







任意の全順序部分集合が上界を持つような順序集合を帰納的順序集合といいます。また、





順序集合に関しては記号のせいか混乱する友人が多いです。あくまでただの記号なので大小を図る記号の存在は一旦忘れてください。
多様体シリーズとかも欲しいですか?でわ。
Pythonでやる多次元ニュートン法
こんにちは。
以前、ニュートン法について述べましたが1次元でした。やっぱり多次元じゃないとあんまりスキルアップにならないですよね。ということでやります。ちなみに差分法を使います。しかし、この記事で初めてニュートン法を知る人のためにも簡単にアルゴリズムを説明してから実装へ移りましょう。 上のリンクがヒジョーーーーにわかりやすいです。では、始めましょう。
を
周りでテイラー展開し、二次の項までで近似したものです。ここで
を勾配、
をヘッセ行列と言います。ヘッセ行列の定義は簡単です。

微分を並べるだけです。ちなみに、一変数の場合は次のようになります。

見ての通り少し複雑です。他のブログで紹介されているニュートン法はシンプルであり、結果的にベクトルとして書き換え直接勾配やヘッセ行列が計算できるようになっていますがこれは見ての通り厳しい。そこで差分法により解決します。差分法を覚えてますか?微分の定義式を使って数値計算により偏微分を計算します。今回の最適化問題は嬉しいことにcontinuousな関数なので偏微分の順序交換が可能です。すなはち
が言えるので計算が1つ減りました、わーい。ではコードに移りましょう。
2種類の初期値を使っています。片方は極小値に行っていないことがわかります。これは初期値が極小値に近くないことが原因です、つまり、ニュートン法はいつでも便利というわけではないということです。
以前、ニュートン法について述べましたが1次元でした。やっぱり多次元じゃないとあんまりスキルアップにならないですよね。ということでやります。ちなみに差分法を使います。しかし、この記事で初めてニュートン法を知る人のためにも簡単にアルゴリズムを説明してから実装へ移りましょう。 上のリンクがヒジョーーーーにわかりやすいです。では、始めましょう。
結局はこれ、テイラー展開
テイラー展開は非常に便利です。本日もいつものように勾配法を使うのですが、結局局所的にしか関数は見ないんです。「局所的に」というキーワードが来れば「テイラー展開」と覚えましょう。そして一般的にテイラー展開は2次の項まで使われます。すなはち、





ニュートン法について
ではニュートン法ですが、まず正定値行列を知る必要があります。正定値行列とはなぜこれが重要かというと、極値判定に使うからです。つまり、正定値であれば極小値、負定値であれば極大値です。覚え方は単純、ヘッセ行列は2回微分なので単純に「微分増加率が正か負か」で覚えましょう。極大値であれば「負」になりますね。そしてお待ちかねの更新式は非常にシンプルです。行列
が正定値とは、
に対して
となること。
ニュートン法 with 差分法
今回の問題はちょっと複雑です。

実装
Ghidraでマルウェア解析入門
こんにちは。
本日はマルウェア解析のチュートリアルです。
使うツールはなんとGhidraです。2019年3月5日、NSA(アメリカ国家安全保障局)が、Ghidraを公開してくれました!わーい。
これはリバースエンジニアリングのツールです。逆アセンブルとも言えますでしょうか。今まではHopper Disassembler v4とかが同じツールでありますが個人的にアレの使い方がよくわからなかったのでこれを機に乗り換えます。では早速、インストールに移りましょう。個人的にJavaのインストールにかなり手間取ったのでその辺詳しく説明します。

docsをダブルクリックしてみると 
このようになると思うのでダブルクリックで起動。

Yesをクリックしてオプションを選択させられますが無視してAnalyzeをクリック。警告など出ればとりあえずOK押してください。
さて、string1をダウンロードしたサイトによればFLAGを見つける問題のようなので探します。CTFですね。
アセンブラにはあまり詳しくないのですがここをみるとmd5_hashという関数がハッシュ化する関数だということが予測できます。そしてスクロールダウンすると

おっと、ありましたね、しかもFLAGって書いてあります。ここをダブルクリックしてみると

たくさんフラグがありますね。他のものは無視して
FLAG{CAN-I-MAKE-IT-ANYMORE-OBVIOUS}
をコピペして先ほどのサイトに入力します。
CHECK FLAGをクリックすると正解と出ました。やったあああ。
本日はマルウェア解析のチュートリアルです。
使うツールはなんとGhidraです。2019年3月5日、NSA(アメリカ国家安全保障局)が、Ghidraを公開してくれました!わーい。

Ghidraのインストール(Mac)
まずはGhidra本体のダウンロードを行います。 上のリンクからダウンロードを押すだけです。そしてフォルダの中身を見てみると次のようになっているかと思います
installationGuide.html
というものがあるのでそれを読んでみるとJDK11が必要であることがわかります。なのでインストールしていきましょう。
まずは上をダウンロードして
- $ tar xvf ./Downloads/openjdk-11.0.2_osx-x64_bin.tar
- $ vim ~/.bashrc
- export PATH=~/jdk-11.0.2.jdk/bin:$PATH の1行を追加
- $ java –version
- $ /usr/libexec/java_home -V
pkg
をダブルクリックでインストールするとjavaがインストールできたはずです!
Ghidraの起動
先ほどダウンロードしたGhidraのフォルダの中にghidraRunという実行ファイルがあるのでダブルクリックすると起動します。(batじゃないよ)またはターミナルで次をタイプします。- $ /Users/username/ghidra_9.0.4/ghidraRun ; exit;
Malware解析の超絶入門
ではマルウェア解析の練習、いや、基礎の基礎、いや、Ghidraの使い方、を学びましょう。 から練習問題をダウンロードします。そしてGhidraを起動し、Newprojectを適当に作ってから先ほどダウンロードしたstring1を解答したもの(exe)をドラッグします。すると

さて、string1をダウンロードしたサイトによればFLAGを見つける問題のようなので探します。CTFですね。
strings1.exe contains an un-encrypted flag stored within the executable. When run, the program will output an MD5 hash of the flag but not the original. Can you extract the flag?なぜか僕の環境ではダブルクリックで開くことができなかったんですがそれはおいておいて、hash化されているようなので左のFilterでhashとフィルタリングします。



FLAG{CAN-I-MAKE-IT-ANYMORE-OBVIOUS}
をコピペして先ほどのサイトに入力します。
