AVTOKYO2022に登壇しました

はじめに

こんにちは。morimolymolyです。

Hello

whywaita Advent Calendar 2022 - Adventar 5日目の記事です。

昨日はなはれぽさんTerraformをローカル環境で勉強できるようにするという記事でした。

今回はAVTOKYO2022に登壇者として参加したので参加ブログを書きます。

続きを読む

イベントにおけるCode of Conductの重要性

はじめに

こんにちは。morimolymolyです。 某氏と揉めてさぞ心配&嫌厭なされた方もいらっしゃると思いますので、両者の話し合いも住んだことですし、詳細を伏せてサマリーブログを書こうと思います。

ことの成り行き

某氏が某イベントのアフターパーティにてセクシャリティを弄る行為やセクハラなどを複数人の人間に行いました。 また、そのイベントはCFPで発表者を募っており、私は登壇者として参加していました。 つまり、登壇者の顔すら立てずに(というより登壇内容に触れてくれw)自分のしたいママ、セクハラを続けていたという問題がありました。 そこで「こんな大人がいるのか」と驚き、その場では何も言えませんでしたが、以下の事を考え攻撃することにしました。 *1

「多様性が尊重されて久しい世の中、セクハラやセクシャリティを弄るような行為が“キャラ”として許されるのはどう考えてもおかしい」 「パブリックスペースでけちょんけちょんにしてやれば聴衆も気がつくのでは!」

Code of Conductがあればどうなったのか

Code of Conductがあれば、その場でより上のスタッフを呼び出禁にすることができます。 今回攻撃をしている中でわかったのは、攻撃している僕にメリットが一切ないどころか攻撃的として認識されてしまうことや、そもそも断片的な情報しか得られない第三者が情報不足が故に様々なことを勘ぐってしまうことです。 攻撃をする前に考えておくべきでした。この場を借りて謝罪させていただきます。 パブリックスペースで攻撃をせず、Code of Conductに従うことができればよかったと思っております。

もし、あなたのオーガナイズするイベントにCode of Conductがない場合、すぐさま作ることをおすすめします。

まとめ

某氏との話し合いは付きまして、今ではいざこざなど一切ない状況にあります。 そのため会社や個人に対して攻撃をすることは絶対にしないでください。

*1:今回の被害報告を個人に対する攻撃と解釈した人もいるためここでは自戒の意味も込めて攻撃と言っております。

ドラゴンの力でControl Flowからバイナリ解析を手助けする

はじめに

こんにちは。morimolymolyです。 今日はControl Flow Graphを用いてバイナリ解析を手助けする手法をご紹介いたします。

背景

GoogleCTFのRev問題についてとある人物から連絡を受けました。

「似たような処理がある関数が多数ある場合どのようにして解析していますか?」

基本、私はCFGを見ます。 ですが、CFGを一瞥して似ているなーだけで終わらせるのもあれなのでGhidraスクリプトを書いてみました。

問題は以下のようなかんじでした。

defineで関数定義

関数の登録

この似たような関数がまとめられると解析が楽になりそうですね。

GhidraスクリプトでCFGを生成する

スクリプトの前に実際に関数のCFGを生成してみましょう。 今回は2つの関数について生成してみます。

add

sub

このようにしてみるとほぼ同一のコードであることがわかりますね(addとsubだしね)

BasicBlockの数とEdgeの数とで比較してしきい値をもうけて比較検討して関数を自動命名させてやれば解析はぐんと楽になるでしょう。

さて、GhidraスクリプトでCFGを得るにはどうしたら良いのでしょうか。

ghidra.re

このAPIを使えば良さそうですが、なんとドキュメントもexampleもなくぶん投げてしまいました!

そのためかんたんのためにBBの数とEdgeの数を計算して求めることにしました。 いかがコードになります。

gist.github.com

みたままBBを探して次があればそれも見に行くというコードです。 自動命名までは実装していませんが、それは読者の課題にしておきます(setNameメソッドでかんたんに命名できます)

おわりに

いかがだったでしょうか。 CFGは強力な武器になり得ることが皆様もおわかりかと思いますが、Ghidraではスクリプトの力を用いて更に強力にすることができます。

以上でおわります。

GhidraでBinDiffする

はじめに

どうもこんにちは、morimolymolyです。 最近は完全に体調を崩してしまいました。 さて、今日はGhidraでBindiffする方法を伝授いたします。

背景

2016年03月22日報道のリリースによると、GoogleによりBindiffが無償化されたようです。

www.zynamics.com

また、これに伴いBindiffに必要なExportファイルをGhidraやBinary Ninjaで生成できるツールも公開されました。

github.com

GhidraでのBinExport方法

まず、binexportに必要なバージョンのGhidraをインストールします。 binexportのZIPファイルをReleaseからダウンロードします。 その後はGhidraを立ち上げて、「File→Install Extensions」からBinExportを選択します。

次に、検体をインポートした後に自動解析にかけます。 最後に検体のディスアセンブラ画面を閉じて、検体を右クリックしてExportを選択します。 ここで注意したいのは、Binary BinExport (V2) for BinDiffを選択することです。

これでBinExportは成功します。

BinDiffしてみる

BinDiffの使い方は省きますが、難しいところはないでしょう。

とある検体とバージョンの違う検体のBinDiff結果

同じバージョンのBinDiff結果

CFGレベルでも命令列レベルでも比較ができるので、非常に便利ですね! IDA Proなしでここまでできるのであれば文句はありません!

おわりに

いかがでしたか。 GhidraでBinDiffをやってみました。 実際、私の現状ではBinDiffを使う機会というのが少ないのですが、特定のマルウェアを追いかけている際に、バージョンごとにどのようにことなるのか大雑把に測るには丁度いいツールだと思います。

MoqHaoのiOS用ランディングページの難読化処理

はじめに

こんにちは、morimolymolyです。
MoqHaoの検体をfuckする話はアクティブディフェンス研究所でネタにしましたが、最近はそのインフラについて調査を進めています。
blog.activedefense.co.jp

また、感染端末の電話番号をどのように悪用するのかも調査をしています。
blog.activedefense.co.jp

今回はランディングページに焦点を当てようと思います。

ランディングページ概要

ランディングページには大きく分けてPC、AndroidiOSの3つがあります。

SMSで配信されるURLについて、UserAgentを識別して分岐していきます。

PCには404を返し(最近の話ですが)、Androidには配信されるURLにある文字列をパスとして付与したページへ、iOSはduckdnsで取得されたページへ遷移していきます。

PC: 404
Android http://配信URL/特定の文字列
iOS hxxp://hogehoge[.]duckdns[.]org

難読化処理

さて、iOSのランディングページには難読化処理が施されており、IoCを隠す意図があると考えられます。
以下が実際に取得できたランディングページのソースコードです。
moqhao-ios-landing-page.html · GitHub

コードとしては単純で配列にある文字列の最後の要素をkeyとしてXORしてevalするだけです。

すると以下のようなコードが現れ、これを実行します。

alert("APP Storeアカウントは安全異常があるので、再度ログインしてください。");
location.replace('hxxp://yrdlaebbqt.duckdns.org');

たしかにIoCは一見すると取りづらいと思いますが、自動化の手法としてSeleniumなどを用いればかんたんに突破できます。

おわりに

MoqHaoの用いるランディングページの概要とその難読化処理を解説いたしました。
より発展した難読化処理が実装されるだろうことは予見されるため、一応備忘録的に記事を書いてみました。

CS:GOのナイフが奪われた話

はじめに

こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の8日目の記事です.

本日は僕が2年前にCS:GOのナイフ(スキン)が奪われて,1.8万の損害を出したことについて書きたいと思います.

CS:GOにおけるスキンとは武器の見た目を切り替えるだけのもので,高級なものだとウン十万円もする代物です.
僕は2万円以下と決めて購入していました.

本記事はインターネット詐欺の撲滅を啓発する目的です.

とある日

陽気な外国人からチャットが届きました.

「Hey, 君のスキンかっこいいね!僕のと交換しない?」

相手のインベントリをみるとなかなかかっこいいスキンがあったため了承しました.
すると相手はBitSkins.comやCS.MONEYなどの正規のウェブサイトで価格の比較をするように指示してきました.
定番のサイトばかりだったので指定されたサイトでログインして比較しました.

その後,相場がわかったので値段を伝えると,じゃあこのスキンと交換しようと,僕のものより少し高いくらいのスキンを提示されました.
喜んで取引を開始し特に何も見ずに承認をすると,手元には何も残っていませんでした.

何がおかしい?

今のやり取りで一体どこに罠があったでしょうか?

  • 提示されたサイトにログインしている
  • 取引内容をきちんとみていない

この2点に罠がありました.

詐欺の手法

詐欺の手法は以下の通りになっています.
まず詐欺師は正規のサイトに紛れ込ませフィッシングサイトにログインさせます.
被害者はまずトレードのリクエストを送ります.(from:被害者, to:詐欺師)
詐欺師は盗んだ認証情報を用いて,詐欺師のbotが自動的にリクエストをキャンセルし,新しい偽のトレードを作ります(from:被害者, to:詐欺師のbot).
詐欺師のbotは詐欺師と同じプロフィールをしています.
トレードを承認するためにモバイルアプリを用いますが,UIがあまりよくできておらず,偽のトレードだと気づくことが難しいです.(2019年当時)

フィッシングサイト

フィッシングサイトは以下のようになっています.
f:id:morimolymoly:20211202150034j:plain

一見分かりづらいですが,Steamのログイン画面はJSで作られたWindowsの窓にみせかけたフローティングウィンドウです.(picture-in-picture attack)
この攻撃に気が付かないとログイン画面は極めて正当にみえます(URLやSSL表示など)

詐欺サイトは誰が作ったのか?

早速ソースコードをダウンロードし,解析,OSINTを行いました.
github.com

このサイトを販売しているのは,Fakerと呼ばれる人物でした.
Telegram: https://t[.]me/savage67

また詐欺のチュートリアルマニュアルを発見いたしました.

Fakerの提供するサービスは以下のサイトにあります.
https://webdev0[.]com/services/

f:id:morimolymoly:20211202150754j:plain

おわりに

現在でもFakerの作成したフィッシングキットは使われているようです.
謎のウェブサイトにログインするときはpicture-in-picture attackなどにも気をつけてログインしましょう.
またトレードの際にはしっかりとトレード内容を確認するようにしましょう.

Out-of-the-box VMIでチートをした話

はじめに

こんにちは.morimolymolyです.
DeNA 21新卒×22新卒内定者 Advent Calendar 2021の2日目の記事です.
DeNAではセキュリティ技術グループでゲームのチート対策などを行っております.
詳しいことは僕のインターン参加ブログをご参照ください.

morimolymoly.hateblo.jp

そんなわけ(?)で今日はチートのかなりベーシックな手法をOut-of-the-box VMIで試したのでご紹介いたします.

Out-of-the-box VMIとは

Virtual Machine Introspectionとは,仮想マシン(VM)を監視・解析するための技術です.
VMIにはOut-of-the-boxとIn-the-boxの2種類存在し,前者はVMの外から,後者はVMの内部から監視・解析するものです.
Out-of-the-box VMIは完全にVMの外から監視・解析を行うことから,マルウェア解析などの用途に使われます.

libvmiやDRAKVUFなどが有名なプロダクトです.

https://libvmi.com/
drakvuf.com

Out-of-the-box VMIをチートに使うことにより,チートをしていると気づかれにくく,特権的な操作を行うことができます.
最近はアンチチートがカーネルドライバになっているケースがありますが(VALORANTのVanguardが有名),それはRing0つまりOSの権限で動くのですが,VMを管理するソフトウェアであるハイパーバイザは所謂Ring-1で動作します.したがって権限が絶対的に上になります.

そのためこれを用いたチートができないか調査をいたしました.

memflow

調査をした結果,memflowというライブラリがみつかりました.
以下に特徴を列挙いたします.

  • Rustで書かれている
  • Rustでツールがかける
  • KVM based
  • PCI Leech対応
  • Windowsの解析に対応

名目上,DMAライブラリとしていますが,明らかにチートツールに転用することができます.
関係ないですけどRustでかけるのがいいですね!!!!!

memflowの使い方

以下にmemflowの使い方を説明します.

まずmemflowupをします.
これはmemflowのconnectorをセットアップします.

git clone git@github.com:memflow/memflowup.git
cd memflowup
python3 memflowup.py

次に以下のリンクからReleaseされているkvmのconnector(KVMとのコミュニケーションをとるもの)をインストールします
github.com

sudo dkms install --archive memflow-0.1.4-source-only.dkms.tar.gz
sudo modprobe memflow

次にmemflow-cliのインストールをします.

git clone git@github.com:memflow/memflow-cli.git
make install

最後にKVMにWindows10なVMをつくり,接続テストをします.(VM名はwin10としました)

memflow conn new kvm -a win10

チートシナリオ

早速チートをしましょう!!!
対象となるゲーム?は以下のようなゲームです.
変数や関数のアドレスを表示しているのはデバッグ用でチートには使用しません.

f:id:morimolymoly:20211119173133p:plain
samplegame

連打してポイントを稼いで,10000000点以上になるとwin!と表示されます.
ソースコードは以下のようになっています.

#include <iostream>

void win(int counter) {
    if (counter >= 10000000) {
        std::cout << "win!!!" << std::endl;
    }
}

int main()
{
    std::cout << "Simple Counter!!!!\n";
    int counter = 0;
    std::cout << "counter address: 0x" << &counter << std::endl;
    std::cout << "win address: 0x" << &win << std::endl;

    while (1) {
        win(counter);
        getchar();
        std::cout << "counter:" << counter << std::endl;
        counter++;
    }
}

シナリオとしては以下のようなものを想定します.

  • 点数を自由に操作する
  • win!!!を毎回表示させて優勝してお酒が飲みたい

それでは行きましょう.

チートツールを書く

以下にチートツールのレポジトリを貼ります.
github.com


チートツールで行っているチートは以下のようになっています.

  • 点数を自由に操作する == スタック上の変数の改ざん
  • win!!!を毎回表示させて優勝してお酒が飲みたい == メモリ上のコード領域の改ざん

スタック上の変数の改ざんには独自のメモリ検索エンジンを実装し,スタック上から目的の変数を探して改ざんします.
メモリ上のコード領域の改ざんには優勝するために改ざんするべきコードを改ざんします.
これらはすべてOut-of-the-box VMIで行われています.
完全にVMからは不可視で改ざんを行います.

スタック上の変数の改ざん

今回は変数がスタック上にあることが事前にわかっているので,スタック領域を求めます.
これはTEBを用います.
en.wikipedia.org

TEBはThread Information Blockのことで,現在走っているスレッドの情報が格納されています.
スレッドの情報にはスタックについての情報も載っています.
memflowはTEBのアドレスを求めてくれる機能があるので,そこからオフセットを用いてメモリからスタックのベースアドレスとリミットアドレスを取得します.
その後はメモリ検索エンジンを自前で実装し,終了です.

メモリ上のコード領域の改ざん

毎回優勝したい場合,10000000点以上を取らなければいけませんが,それは面倒くさいです.
なんなら変数の改ざんをしなくても済むようにコード領域を改変しましょう!

まずはどこにターゲットになるコードがあるかを解析しましょう!
まずはGhidraをおもむろに立ち上げて,exeファイルを読み込ませます.
その後に"win!!!"文字列を検索します.

f:id:morimolymoly:20211119172510p:plain
win!

みつかりました!
XREFをみるとwin!!!文字列を参照しているコードがどこにあるかがわかります.

早速みてみましょう!

f:id:morimolymoly:20211119172506p:plain
ターゲットコード

これをみるとベースアドレス+ 0x1119 にあるJL命令を潰してやれば良さそうです.
memflowの動的メモリ改ざん機能でここを0x90(NOP)で潰します.

結果

それではOut-of-the-box VMIなツールでチートをします!!!!
チートツールは以下のようになっています.

f:id:morimolymoly:20211119173047p:plain
cheat tool

結果は以下のようになっています!!!!

f:id:morimolymoly:20211119173057p:plain
チート結果

優勝しました!!!!!!!!!!!!!!!!!!!!!!1

対策方法

流石にチートしましただけではどうしようもないので思いつく対策を以下に列挙いたします.

  • 特徴的な文字列は暗号化する
  • 点数の値を暗号化する
  • VM検知をする(アーティファクトがどこかにあります)
  • コードのインテグリティチェックをする

……あまり参考になりませんね…….
Out-of-the-box VMI cheatを倒すにはどうしたら良いのでしょうか…….
これは今後の課題としてブログに対策方法を考えて書くことにします!!!

最後に

今回はかんたんなゲーム?に対してKVM + memflowを使ったOut-of-the-box VMIでのチートを行いました.
スタック上の変数の改ざんと,メモリ上のコード領域の改ざんでゲームをチートしました.
以上で今回の記事を終わりたいと思います.
ありがとうございました.

JIS版MagicKeyboardをLinuxで動作させるパッチがマージされた

ついにマージされてリリースされた

前回の記事

morimolymoly.hateblo.jp

前回の記事でつくったパッチがついにマージされてリリースまで行きました。

以下が情報科学若手の会で発表した資料になります。

speakerdeck.com

時系列

時系列をお話します。

  • 7/29 linux-inputにパッチ投稿
  • 9/15 linux-inputのメンテナからappliedされた連絡
  • 10/5 AUTOSELでbotにパッチがレビューされるように選ばれる
  • 10/14 あのGreg Kroah-Hartmanがマージするよ〜と連絡
  • 10/17 リリースされる

今後の展望

ハックできるところがあるかちょこちょこ探すかもしれない。 いまのところ心理的障壁はかなり軽減された。

関連リンク

github.com

git.kernel.org

hid-apple.c - drivers/hid/hid-apple.c - Linux source code (v5.16.10) - Bootlin

Solanaでスマートコントラクトを書いてみた

はじめに

こんにちは,morimolymolyです. 今回はSolanaという暗号資産のチェーン上で動くプログラム,スマートコントラクトを書いてみましたのでその感想を記します.

Solanaってなに?

Solanaとは第三世代ブロックチェーンの代表格とも呼ばれているらしい*1,新興チェーンではあるものの勢いがありかつ,実用性があるチェーンだそうです.(これ全部人づてなので諸説あるらしい)

Proof of Historyと呼ばれる新規性のある高速なコンセンサスアルゴリズムを提案,実装しています. ホワイトペーパーによると,

On a 1gbps network connection the maximum number of transactions 29 possible is 1 gigabit per second / 176 bytes = 710k tps max

とのことで,めちゃくちゃすごいTPSがでていることがわかります. しかしバリデータ要件がめちゃくちゃ高いらしいので気をつけて.

docs.solana.com

オタク的嬉しいポイントとして,すべてがRustでかかれている事が挙げられます. 以下のレポジトリはSolanaのコアになっています.

github.com

また,オタク的嬉しいポイント2としてeBPF形式でコントラクトが動くというところがあります. 以下がeBPF VMの実装です. eBPFなバイナリが出力できる言語であればいいので,C/C++はもちろん,Rustもいけますね!!!(LLVMはeBPFのバックエンドをもつので)

github.com

つまりすべてがRustに収束するのです.いやーめでたい.

スマートコントラクトとは

スマートコントラクトはブロックチェーンの上で動くプログラムのことです. 一体何ができるのか?僕にもまだ詳しくはわかりませんが,DeFiなどの非中央集権的経済取引のアプリケーションを書くことができます. いままで証券会社や銀行が中央にいた経済に比べ,手数料が安く取引などが可能に,しかも信頼性のある形でできるようです. 今回は詳しく説明しませんが,日銀が注目するほどなので何やらすごいのでしょう.

coinpost.jp

ともかく,僕はネットワークの上で動く謎のコンピュータをいじってみたい!と言う動機でやってみました.

Rustでスマートコントラクトを書く

スマートコントラクトをRustで書くときにはsolana_sdkかAnchorを使う必要がありますが,テストコードがかんたんにかける,色々ラップしてくれて嬉しいということでAnchorを使いました.入門は以下の記事を読めばいいと思います.

project-serum.github.io

以下にハマリポイントを書いていきます

ハマリポイント: M1 Macでうまく動かない問題

M1 Macだとsolana-test-validatorと呼ばれる必ず一度は呼ばないといけないコマンドが現在叩けません. 以下の記事でがんばってくれ!

dev.to

全然Anchorの情報がない

これがマジできつかった.チュートリアル以上のことをやろうとするとすぐ詰まる. さらに破壊的変更がすぐ入って,数ヶ月前の記事が使えないことが起きる.

ここでひとつ,コホン.

テストコードがドキュメントです.

以下の場所からそれっぽいコードをみて理解しろ!

github.com

何を作ったの?

Anchorのチュートリアル的な記事として,このようなものがありました.

dev.to

この記事はかんたんなカウンターを作って,スマートコントラクトで回すアプリを作っています. しかし,フロント側で毎回カウンター用のアカウント(ややこしいのですが,Solanaでいうストレージのようなものです)を使い捨てるため,カウンターが毎回初期化される問題と言うか仕様がありました.それを解決するために,PDA(Program Derived Address)を用いて問題を解決してみました.(これが正しいかはわからんしらん存ぜぬ)

docs.solana.com

PDAを使うとプログラムにアカウントを紐付けることができるので,プログラム側でアカウントの管理ができます.基本コントラクトはステートレスなのでややこしいですね. このようにして,ウォレットに紐付いたカウンターが生成されました.

www.youtube.com

github.com

脆弱性

GeT_Pwn3d!でセキュリティ絡まないのも変なので,脆弱性を埋め込んでおきました!!!(というのは嘘であきて実装を放り投げたのです)

脆弱性1: 弱い認証

PDAのseedとして,ウォレットの公開鍵の10文字のみを使用している.hashがうまいこと衝突すると問題になる.guessもかんたんだ.

脆弱性2: 認証がない

認証がないのでスマートコントラクトを呼び出す際の引数にウォレットのアドレスを入れてしまえば勝手にカウンターを操作できます.

おわりに

初心者がわけわからん散文かいてすみませんの気持ちしかありませんが,これいけてないよーとかこれこうしたほうがいいよーとかあったらコメントください!

*1:第1世代はBitcoin,第二世代はEthereum