感染すると攻撃対象のマシン(PC/スマートフォン)上でのユーザー操作が制限されてしまいます。現在、ランサムウェアは暗号化タイプと非暗号化タイプの2種類に分類できます。暗号化ランサムウェアでは攻撃対象の外部記憶装置のデータを暗号化し、ファイルへのアクセスを制限します。それに対して、非暗号化ランサムウェアではポルノ画像やグロ画像を表示し続けることでシステムへのアクセスを制限してきます。どちらのタイプであってもPCやファイルを人質にとり、制限を解除したければ金を払えという風に金銭を要求します。今回の記事では「Reversing.Kr」のRansomwareを題材にランサムウェアについて解説していきます。Reversing.Krとはリバースエンジニアリングの技術を学ぶための演習問題を公開しているサイトです。問題によっては配布されるプログラムがマルウェアとして認識されてしまう場合もありますが、あくまでソフトウェア解析技術の向上を目的としたプログラムなのでご安心ください。Reversing.Krのリンクはこちらreversing.kr本記事は常設CTFの問題のネタバレを多く含みます。ご覧いただく際はご注意ください。今回の演習問題では元々実行可能ファイルであったはずの「file」がランサムウェアに人質として捕らえられ、実行不能なファイルになっています。問題回答までの流れとしては、ランサムウェア本体であるrun.exeを解析して、fileがどのように暗号化されているのかを明らかにしたあと、元に戻して実行可能な状態にまで持っていきます。run.exeを解析していきましょう!実際にrun.exeを実行してみると、文字化けしています。元が韓国語なので私にとってはどちらも解読不可能な文字列ですが...Keyを要求していますKeyを使ってどのように復号処理をしているのかをGhidraで見ていきましょう。Trees内のUPXという文字です。これはUPXと呼ばれるパッカーでパッキングされていることを表しています。マルウェアはお決まりのパッキング手法というものがなく、独自の手法でパッキングされていることが多いのでマニュアルアンパッキング技術が必要になります。こちら⬇の記事でマニュアルアンパッキングの基礎と手法をご紹介しているので、こちらを参考にしながら実際にアンパッキングに挑戦してみましょう。www.ninjastars-net.comここからはアンパッキングしたrun.exeを見ていきます。Tree->Imports->MSVCR100.DLLから探してみましょう。scanf関数があるのでXREF[1]から見ていくと、0x44A792で呼び出されていることがわかりますね。次に動的解析ツールのOllyDbgを使って0x44A792にブレークポイントを設定していきます。この処理の周囲(0x44A7E2)にfopen関数があるのでfileを操作しているのであろうことが予想できます。scanf関数とfopen関数0x44A870にてgetc関数によりfileのバイナリ列をメモリに展開しています。getc関数の戻り値はEAXに格納されているので、EAXをいじっている命令を探していきましょう。DS:[ECX+5415B8],ALという命令でEAXのデータをECX+5415B8に展開していることがわかります。アドレス:0x5415B8ステップ実行すると、fileのバイナリが順に展開されていることがわかると思います。展開が終了する0x44A897にブレークポイントを設定し、中身をすべて展開してみましょう。次にメモリ上に展開されているバイナリをいじっている命令を探しにいきます。0x44A8CF付近にて入力した文字コードとバイナリのXORをとり、さらに0xFFとXORをとっている命令群があります。この命令群が復号化ルーチンだと予想できます。復号化ルーチン上記の処理を行った後にメモリ上のバイナリデータを上書きし、fileに書き込んでいます。fileへの書き込みこの処理が復号化ルーチンなのかを確かめましょう。試しに「abcde」を入力してみます。先ほどの式では以下のように変換されるはずです。復号化ルーチンの具体例バイナリエディタであるStirlingでfileの中身を確認しましょう。file復号化の結果1バイト目のバイナリが0x40になっているので先ほどの式が復号化ルーチンであることが確認できました。入力した文字は5文字でしたがfileのバイナリ全体が変換されているので5文字を循環させて復号化していることが想像できます。0xFF」であることがわかります。これで循環していることが確認できました。次に何文字で復号できるのかを見つけていきましょう。前提条件としてfileをPE形式の実行ファイルにしなければいけません。そのために適当な実行ファイルをStirlingで確認しましょう。run.exeの中身PE形式の実行ファイルには最初の一行は必要ですので、そこを揃えることを考えます。入力すべき文字は次の式で求めることができます。文字を求める式これで16文字求めると「letsplaychesslet」となりますが、「let」という文字列が2回登場しているので「letsplaychess」だけでいいことがわかります。これをKeyに入力しましょう。run.exeにKeyを入れてみましょう。成功です!するとついにPE形式の実行ファイルにすることができました!file.exeにリネームして実行してみましょう。見事フラグを出すことに成功しましたね!お疲れ様でした!本記事で学んだ技術、知識をさらなる学びの足がかりにしていただければ幸いです。本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。株式会社Ninjastarsセキュリティエンジニアの一瀬です。はてなブログPro株式会社Ninjastarsではスマートフォン向けゲームを中心としたセキュリティ診断及びチート対策等のサービスを提供しております。(1)このサイトについてプライバシーポリシーはてなブログをはじめよう!Ninjastarsさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。