グレムリンとELFマジック:ELFファイルがコンテナの場合はどうなりますか?

90年代の子供たちは、 NeoQUESTの課題に何か古い学校を追加するのが大好きです。 今年、 グレムリンを思い出し、NeoQUEST-2017対立のタスクの1つの伝説にそれらを追加しました。



しかし、外見的に面白い凡例は非常に現実的なタスクを隠しています:通常のELFファイルが単なる実行可能ファイルではなく、開かなければならないコンテナーである場合 これを行うには、 objcopyのかなり広範な機能を体験し、メモリ内のELFファイルの構成を更新する必要があります。



疑わしいセクションを計算するには、一般的なELFのセクションとセグメントの構成を提示する必要があります。 これに加えて、もちろん、経験も役立ちます。たとえば、ファームウェア組み込みシステムとの通信は、適切なアイデアを示唆する可能性があります。



あなたは100%準備ができていると思いますか? グレムリンは、隠されたアーカイブ、破損したシンボルテーブル、そして熟練したマスターの手でのみ聞こえるオーディオファイルであなたを驚かせるでしょう。 猫の下-タスクとパッセージのソースコード。Habrの各読者が個人的にタスクをパスできるようにします。



タスクの初期データ



タスクの凡例は次のようになりました。



その場所に到着すると、完全なカオスと荒廃に基づいていることがわかりました。 このすべてが、有名な地上映画のグレムリンに非常によく似た、地元のアボリジニのカップルを配置しました。 そのうちの1人は、この小さなギャングの主なものであり、より大きく、より厚かましく、おしゃべりでした。

-へへへへへへ、メッセージを食べました! この愚かなグレムリンを食べていた! そしてあなたを食べます!

2番目の、より小さく、より控えめな、彼の仲間の後ろにとどまり、定期的に叫んだ:

-グレムリンがやってくる!



これらのろくでなしは混乱と破壊を生み出しただけでなく、私たちに残されたメッセージを傷つけただけでなく、彼らの同志を食べたようです...



ソースデータは、 greikstraipmessageの 3つのファイルです



伝説に基づいて、最も重要なファイルはメッセージであり、それを聞く必要があることを理解しています。 しかし、もちろん、それは機能しません(そうでなければ、割り当てのポイントは何ですか?)。 実行すると、次の情報が取得されます。



申し訳ありませんが、準備セクションを失いました...



メッセージを修正するには、2つのグレムリンを「ガット」する必要があります。

彼らの同志を含む「かじった」。 各ファイルを実行します。 ./greikの後に表示されます:



グレムリンがやってくる! (ちなみに、映画からの元の引用!)



./straipの後:



へへへへへへ、あなたのメッセージを食べました! この愚かなグレムリンを食べていた! そしてあなたを食べます!



つまり、凡例に記載されているすべてのものです。 これらのグレムリンはタスクを完了するために必要なものをすべて食べたので、中に何があるかを見る必要があります! readelfユーティリティを両方のファイルに適用します。 ファイルセクションとそれらに関する情報にのみ関心があるため、-SWフラグを使用する必要があります。 その結果、次のようになります。









セクション28、胃(胃!)に注意してください。 彼女を捨てましょう。 これを行うには、次のことができます

必要なすべてのオフセットを計算した後にddユーティリティを使用するか、次のようにobjcopyユーティリティを使用します。



objcopy -O binary --only-section=.stomach --set-section-flags .stomach=alloc straip stomach
      
      





greikファイルについても同じことを行います。 readelf -SWの発行:









セクション28および29のダンプ(.first_stuffおよび.second_stuff):



 objcopy -O binary --only-section=.first_stuff --set-section-flags .first_stuff=alloc greik first_stuff objcopy -O binary --only-section=.second_stuff --set-section-flags .second_stuff=alloc greik second_stuff
      
      





ここで得たものを見てみましょう。 これを行うには、抽出された各ファイルに対してファイルユーティリティを使用します。 その結果、以下が得られます。



腹部:Zipアーカイブデータ、少なくともv2.0を抽出する

first_stuff:データ

second_stuff:ELF 64ビットLSB再配置可能、x86-64、バージョン1(SYSV)、ストリップなし



胃を解凍し、ファイルユーティリティを使用して、取得したファイルの種類を見てみましょう。



sec1:データ

piece2:ELF 64ビットLSB再配置可能、x86-64、バージョン1(SYSV)、ストリップなし

key1:ASCIIテキスト



やったー、中間キーkey1( "ISCJcPhB33cAvq9F9YkaZyU91SfwSObn")を入手しました! 残りのファイルは、問題をさらに解決するために必要です。 元のメッセージファイルは、セクションが失われたと報告し、sec1というファイルをアーカイブから抽出しました。



readelfユーティリティをメッセージに適用します。









サイズ0x50(80)の.extract(16)セクションがあることがわかります。 また、グレムリンから抽出された0x50ファイルの1つであるfirst_stuffもあります。 このセクションを復元します。



 objcopy --update-section .prepare=first_stuff message
      
      





メッセージを再度実行します。



抽出用のデータの準備...

データの準備に成功しました

申し訳ありませんが、抽出セクションを失いました...



彼には別のセクションがありません。 前のセクションと同様に、これを復元します。



 objcopy --update-section .extract=sec1 message
      
      





メッセージを再度実行します。



抽出用のデータの準備...

データの準備に成功しました

キーデータの抽出...

完全に成功した抽出



すべて完了しました。 その結果、音声ファイルmessage.mp3を受け取りました。 ただし、データを聞くと、データがゼロであるため、無音のみが聞こえます。 そのストレートを思い出してください

彼らは別のグレムリンを食べて、2つの未使用のELFファイルが残っていると教えてくれました。



それらを実行してもエラーは発生しません:



プロセス './second_stuff'の実行に失敗しました。 理由:

exec:execフォーマットエラー

ファイル './second_stuff'は実行可能ファイルとしてマークされていますが、オペレーティングシステムで実行できませんでした。



これは、これらのオブジェクトを互いにリンクする必要があるためです。



 gcc second_stuff piece2 -o gremlin
      
      





その結果、以下が得られます。



piece2:関数「main」内:

gizmo.c :(。text + 0x5b):警告:「gets」関数は危険であり、使用すべきではありません。

gizmo.c :(。text + 0x86): `get_back_function 'への未定義の参照

collect2:エラー:ldが1つの終了ステータスを返しました



そして再び、すべてがそうあるべきではありません! グレムリンの「断片」にはreadelfユーティリティを使用しますが、今回はシンボルテーブル(-sスイッチ)を確認します。 second_stuffの場合:









piece2の場合:









そのうちの1つにはget_back_function関数があり、コンパイラがそれを誓い、2番目には「a4f922hjd9843jd」と呼ばれる特定の関数があります。 名前をget_back_functionに変更します。



 objcopy --redefine-sym a4f922hjd9843jd=get_back_function second_stuff
      
      





ファイルを再度組み立ててみましょう。



 gcc second_stuff piece2 -o gremlin
      
      





piece2:関数「main」内:

gizmo.c :(。text + 0x5b):警告:「gets」関数は危険であり、使用すべきではありません。



ご覧のとおり、すべてが正常です。 gremlinを実行します。



こんにちは...私はあなたのメッセージを保存しようとしましたが、私の名前を忘れました...私の名前を覚えてください、私はあなたの一部を取り戻すことができます

>>



男は悪くないようです:彼は私たちのメッセージを保存しようとしましたが、そのために苦しみました。 私たちにすべてを返す準備ができていますが、私は自分の名前を忘れました。 彼の名前はギズモ(映画の良いグレムリンの元の名前)です。 これは、ビルドプロセス中、およびソースオブジェクトとgremlinファイル自体の両方の先頭にあるHEXエディターの両方で確認できます。



彼の名前を入力してみましょう(もちろん大文字で!)、III ...



こんにちは...私はあなたのメッセージを保存しようとしましたが、私の名前を忘れました...私の名前を覚えてください、私はあなたの一部を取り戻すことができます

>>ギズモ

はい、はい! 私の名前です! ファイルの一部を取り戻します!



その結果、別のdata_sectionファイルを取得します。 元のメッセージファイルにプッシュすることも簡単に推測できます。



 objcopy --update-section .key=data_section message
      
      





この.keyセクションは、readelfユーティリティでメッセージファイルを調べたときでも顕著でした。 まず、彼女の名前が話され、次に、サイズがギズモが私たちに返したものと一致します。



メッセージファイルを再度実行すると、通常のメッセージが既に受信されます。

聞く このファイルからmd5ハッシュを取得する必要があり、それがキーになると書かれています。 md5を取得して、 65935b0ae91b566c14c8b584ee8cf85dのキーを取得します。



ハッピーエンド!



ELFファイルは単なる実行可能ファイルではなく、何かのコンテナである可能性があります。 このタスクはバイナリを逆にすることで完了できますが、情報セキュリティの専門家だけが強力な人ではありません!



このバージョンのパッセージでは、いくつかの簡単な操作で十分です-ELFパズルが正常に完了し、セクションとシンボルテーブルが復元され、アーカイブが解凍され、グレムリンは印象的な「グレムリンがやってくる!」キー!



All Articles