実行ファイルが削除されたプロセスからファイルを復元する

3227 ワード

概要

プロセス実行中、実行ファイルを消してもプロセスは動き続けます。
この記事ではその動作の確認と、2種類の復元方法について見ていきます。

準備

復元対象のプログラムを適当に作ります。

#include <stdio.h>
#include <unistd.h>
 
void main(void) {
    while(1){
        printf("Hello!\n");
        sleep(5);
    }
}

見ての通り5秒おきに挨拶するプログラムです。
コンパイルします。

gcc -znorelro -m32 hello.c     

※このオプションを付けないと方法2が上手くいきませんでした

動作確認

バックグラウンドで先ほどのプログラムを起動します。
ずっと挨拶してきて鬱陶しいです。
知っている人は当然に思うかもしれませんが
実行ファイルを削除してもプロセスは止まりません。

これを止めたいときはkillするかターミナルを閉じれば良いです。
ここからは見知らぬプロセスが動いている想定で、
その実行ファイルが消されていた場合の復元方法について解説します。

復元方法1

対象のプロセスを見つけます

そのプロセスの情報を表す/proc/<PID>を見てみると、実行ファイル(deleted)へのシンボリックリンクが見つかります。

これをコピーすれば完了です。

ファイルシステム上削除されていてもディスク上で上書きされていなければアドレス情報から復元できます。

復元方法2

プロセスのメモリマップを確認します

heapの上の領域をddコマンドで抜き出します

ファイルが実行できることを確認しました!

何に役立つの?

自身の実行ファイルを消去するようなウイルスを解析するときに使える手法だと思います

まだまだ駆け出しなので補足や感想お待ちしています!