2017-06-24 1 views
0

私はいくつかのバイナリファイルを見たことがあります。開発者は少し編集的で、バイナリ内のすべてのテキストを難読化しました。私はこれまでのようなことは何も見ていなかったし、ELFを隠し文字でコンパイルするための明白なオプションも見つけられなかった。標準のOS API文字列でさえ隠されていました。ELFバイナリのテキストを基本的に暗号化する方法は?

これらのプログラムでは、実行時に公開されていないテキストはありません。未知のテキストを除きます。しかし、赤い旗だけをたくさん隠していると、それは疑わしいように見える。

ELFにコンパイルされたテキストを簡単に隠す方法はありますか?簡単なコンパイラ/リンクオプションを使用してください。私は、デコーダがmain()に挿入できると思いますが、どのようにテキストセクションを簡単にエンコードすることができますか?

コードで暗黙のデコーダをキーで使用する方法があると思います。次に、そのキーを使用してELFのテキストをエンコードします。そのため、簡単にエンコードできます。

+1

どういうところですか?あなたの後のすべてが難読化されている場合は、固定キーを使用してXORするだけですが、「標準OS API文字列」とはどういう意味ですか?共有ライブラリからインポートされたシンボル?これは本当に奇妙なことです。私が考えることができるのは、ファイル全体を最初に解読するカスタムローダーだけです( 'upx'は圧縮のためのものです)。 –

+0

簡単な方法があるのだろうかと思います。不明瞭化メソッドに関係なく。バイナリ内のテキストを隠すコンパイラオプションにスイッチを追加するとします。私はELFフォーマットをチェックアウトしましたが、フラグや何も隠されたテキストを指定したものでは何も目立っていませんでした。その後、ELFローダによってデコードされます。 "標準OS API文字列"によって、私はライブラリまたはソリブの名前を意味しました。それを言って面白い方法がありました。 :-) –

+0

いいえ、「簡単な」方法はありません。このような機能は通常はあまり意味がありません。さて、chqrlieの答えを見て、私の自身のコメントを再読することを除いて - 実際に 'upx'(または同様のツール)!それは何も暗号化しませんが、もちろん圧縮されたテキストも直接読むことはできません;) –

答えて

1

「テキスト」とは、人が読めるテキストで、テキスト部分はcode segmentというテキストセグメントではありません。

あなたは、あなたが本当の(非暗号化)のテキストを得るためにあなたのデ - 難読化や復号化ルーチンを使用します、読み取り専用

const char encrypted_text[] = { 
    // a lot of encrypted bytes like 0x01, 0x43, etc 
    // the C file containing that would be generated by some script 
}; 

にそれを暗号化または難読化できます。

私はそれが問題の価値があるとは確信していません。人生は短すぎる。

+0

はい私はコンピュータがそれらを呼び出すときに人間が読めるテキストまたは文字列を意味しました。 :-)バイナリの "text"セクションは、ソースコードレベルのテキストだけなので、私はいつも考えていました。そしてそれは "コード"と呼ばれるべきです。まあ何かがコードに行われました。 decrypt()ルーチンがカスタム_start関数に挿入されていたり、main()でも挿入されていても、メモリ内のどこに文字列があるかを知る必要があります。文字列セクションがどこに格納されているのかを知ることができるかどうかは分かりません。最初の文字列を知って、それを開始アドレスとして使用することを除いて。それから長さがあります。 –

+0

ELFバイナリ自体の読み込みからデコードできます。したがって、すべての文字列がELFの1つのブロックまたはセクションに連結されていると仮定すると、これは可能です。それは、複雑になっても、それを私にする簡単な方法です。1つのブロックのすべての文字列をいくつかのキーでデコードする初期の解読ルーチンを設定します。カスタムELFエンコーダでこのキーを使用して文字列を隠す。あなたが言ったように。人生は短すぎる。しかし、それは何らかの形で行われました。 –

2

圧縮された実行可能ファイルが必要です。

実行可能ファイルを圧縮し、読み込み時に解凍するためのさまざまなツールがあります(例えば、linuxの場合はupx)。バイナリファイルのほとんどのテキストは肉眼では判読できなくなりますが、実際のデータにアクセスするためにハッカーが実行可能ファイルを解凍するのに問題がないため、機密データを隠すことは非常に効果的な方法であることに注意してください。

実行ファイルで暗号化された文字列を使用すると、ビルド処理中にスクリプトによって内容が生成されるようになりますが、解読するコードは実行可能ファイルのどこかで利用できるようにする必要があります。データが十分に価値がある場合(データベースパスワード、ビットコインキー...)、ハッカーはそれを取得します。

+0

これについても私は不思議でした。すべてのコードがすべて1つのブロックにあることを考えると、私はそれを読んで走ったが、ELFの圧縮されたフラグは現れなかった。だからカスタムメソッドが採用されたように見えます。 –

1

これは通常、マルウェアを分析する際に表示されています。著者はstringsのような静的解析ツールが動作しないようにこれを行います。さらに、そのような作者は、必要な機能を得るために、dlopendlsymを使用して関数をロードすることがあります。

たとえば、以下のコードスニペットでは、

printf("Hello World"); 

私はstringsの出力内の文字列の「Hello World」を参照してくださいだろうとエルフファイルのインポートセクションを見ることで、私はプログラムがprintfを利用していることを参照してくださいね。プログラムを実行することなく、それが何をしているのかを知ることができます。

ここで、作成者が関数char* decrypt(int)を書いたとします。この関数はインデックスをスティングテーブル(各文字列が暗号化されている)に取り込み、復号化された文字列を返します。上記のコード1行が、今は、概念的、再び

void* pfile = dlopen(decrypt(3)); 
void* pfunct = dlsym(pfile, decrypt(15)); 
pfunct(decrypt(5)); 

のように見える以上近づくための擬似コードは、実際にその後、コンパイル可能コードであることを覚えているでしょう。この場合、静的解析ツールを使用して、文字列または関数名(インポートセクション内)は表示されません。

さらに、コードをリバースエンジニアリングしようとすると、文字列の復号化に時間がかかることがあり、ロジックを介してどの関数が呼び出されているかを判断する必要があります。これは実行できないわけではありませんが、アナリストは遅くなります。つまり、マルウェアの対策が作成されるまでは時間がかかります。

そして今あなたの質問に;

ELFにコンパイルされたテキストを簡単に隠す方法はありますか?コンパイラ/リンクオプションが簡単な であること。私はデコーダがメイン()で挿入された かもしれないと思いますが、どのようにテキストセクションを簡単にエンコードすることができますか?

これを実行するコンパイラ/リンカオプションはありません。この作成者はこれを行うか、上記の適切な機能(すなわち復号化)を書いて、文字列の暗号化された形式を生成するユーティリティを書く必要があります。さらに、一度これを行うと他の人が示唆しているように、アプリケーション全体を暗号化/圧縮することができます(自己解凍型のzipファイルを考えてください)。したがって、静的解析ツールで最初に見られるのは、ファイルを解凍する。

https://www.ioactive.com/pdfs/ZeusSpyEyeBankingTrojanAnalysis.pdfを参照してください。 (これはWindowsベースですが、暗号化と動的な読み込みのテクニックは同じです。APIコールのセクションを参照してください)

興味があれば、 https://www.researchgate.net/publication/224180021_On_the_analysis_of_the_Zeus_botnet_crimeware_toolkithttps://arxiv.org/pdf/1406.5569.pdf

+0

ありがとうございました。私はコードが本当に隠れている唯一の事柄は、それが開いている特定のライブラリであるため、そのコードがそのことを隠すためにその問題に陥ったのではないかと疑います。しかし、コードの実行も見ていません。これはデバッガを介して実行されています。私はGDBを通して実行するかもしれません。私がASMでステップバイステップデバッグを楽しみにしているわけではないので、GUIを使用するのが最善の方法です。 :-) –

関連する問題