リバースエンジニアリング入門
1.Cのメイン関数と引数
マルウェアは、よくcで記される。だから、cプログランをアセンブリに変換するメインメソッドがどんなものか知るという事は、重要である。
知識は、c言語からアセンブリに変更するときにどのようなオフセットが異なるか理解するのに役に立つ。
一般的なc言語は、メイン関数に2つの引数を持っている。下記は、典型的な例。
int main(int argc, char* argv[]) { if (argc != 3) {return 0;} if (strncmp(argv[1], "-r", 2) == 0){ DeleteFileA(argv[2]); } return 0; }
これをアセンブリに言語に直すと、、、
①の所が、cでいう
if(argc[3]==3)
になる。しかし次の行で「jz short loc_4113D8」が来ている。これは、cmpの結果が真じゃない場合となる。この二つを合わせるとつまり、、、
if(argc[3]!=3){
}
次に、004113D8の処理を見てみると。
move psi,espは、特に言語の仕様なので気にしないでください。
push 2
push offset str2
mov eax, [ebp+argv4]
mov ecx, [eax+4]
puch ecx
となっています。そのあとに、strcmpがcallされています。こちらをcに直すと、
strcmp(argv[1],"-r",2);
になります。はじめの引数は後にpushされるということを忘れないでください。
次を読むと
test eax eax
jnz short loc_411412
これをstrcmpと組み合わせるとこうなります。
if(strcmp(argv[1],"-r",2)!=0)
ここで注目して欲しいのは、test eax eaxです。これはeax とeaxが同じ値だったら0という意味です。eaxには、処理の結果が格納されるので必然ときに「0」が当たり前です。test eax eax とjnz が組み合わせでくると、if(==0)となるので覚えておこう。
00411412を見てみると、この中にアドレスはありませんね。ということで、ループから抜けたということになります。
ループ先がなかったので、次を読み進んでみると、
mov esi, esp
mov eax, [ebp+argv]
mov ecx,[eax+8]
push ecx
call DeleteFIileA
まず、eatにebp+argvを入れeax+8をecxに入れpushしている。これは、第二引数を DeleteFileAに渡している。
DeleteFile(argv[2]);
となる。
最後にまとめると、
int main(int argc, char* argv[]) { if (argc != 3) {return 0;} if (strncmp(argv[1], "-r", 2) == 0){ DeleteFileA(argv[2]); } return 0; }
になるのだ。