ミニキャンプ沖縄・仮想化技術を用いたマルウェア解析-Revenge(環境構築編)
12/19~12/20にかけて開催された"セキュリティ・ミニキャンプ in 沖縄 2015"に参加してきました.
講義中には時間が足りずに出来なかった
"仮想化技術を用いたマルウェア解析"のリベンジをしてみたいと思います.
実はこの講義,一番難しかったけど,一番楽しかった.
もっと理解したら絶対楽しい.
前置きはこのくらいにして,環境構築に入っていきたいと思います.
Virtual Boxを使ってます.メモリは2GB.
ちなみにホストOSはメモリ4GBです.
VMにUbuntuインストールするくらいは自分で調べてくださいw(めんどくさい)
$ uname -a
Linux tsun-ubuntu 3.16.0-30-generic #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
こんな感じです.
Ubuntu 14.04 LTS 64bitです.
これにDECAFを導入していきます.
HDDに十分に空き領域がある事に注意してください.
Windows XPのイメージなどで結構喰われる(10GB~あれば余裕かな)
What is DECAF??
DECAF(short for Dynamic Executable Code Analysis Framework) is a binary analysis platform based on QEMU. This is also the home of the DroidScope dynamic Android malware analysis platform.
簡単にいうと,QEMUをベースに開発されているマルウェア解析プラットフォーム.
ていう解釈であってるかな.
DECAFのインストール
DECAFのビルド
$ sudo apt-get update $ sudo apt-get install qemu binutils-dev libboost-all-dev $ sudo apt-get build-dep qemu
$ git clone https://github.com/sycurelab/DECAF
$ cd DECAF/decaf $ ./configure $ make
makeが終わるまで待ちます.
ゲストOSのインストール
ここからイメージをダウンロードしてください.
30日間だけ使えるやつを無料で配布しています.
あ,あと僕のユーザ名がtsunなので今から作業でPATH指定するときには
コピペしないで自分で適宜変更をお願いします.
$ pwd
/home/tsun/DECAF
$ mkdir VM
$ mv IE8.XP.For.Windows.VirtualBox.zip VM/
$ cd VM
$ unzip IE8.XP.For.Windows.VirtualBox.zip
unzipしてでてくる
なんちゃら.vmdkの名前が長かったのでwinxp.vmdkにしました.
$ qemu-img convert -f qcow2 winxp.vmdk -O qcow2 pre_ie8.qcow2
$ qemu-img convert -p -f qcow2 -O qcow2 compat=0.10 pre_ie8.qcow2 ie8.qcow2
QEMUを立ち上げてWindows XPが起動するか確かめます.
$ cd ~/DECAF/decaf/i386-softemmu
$ ./qemu-system-i386 -monitor stdio -m 1024 ../../VM/ie8.qcow2
$ export SDL_VIDEO_X11_DGAMOUSE=0
export SDL_VIDEO_X11_DGAMOUSE=0
はマウスポインタが暴走する時にやるといいです.
[CTRL + ALT + U]をすると画面が(たぶん)見やすくなると思います.
Windosが立ち上がったらターミナル上で[Enter]を押します.
すると,(qemu)というのが出てくるので
(qemu) quit
で一旦Windowsを終了します.
問題のプログラムをWindowsにコピーしていきます.
$ cd ~/DECAF
$ git clone https://github.com/ntddk/blue.git $ sudo modprobe nbd $ sudo qemu-nbd -c /dev/nbd0 ie8.qcow2 $ sudo /sbin/fdisk -l /dev/nbd0 $ sudo mount -o loop,offset=$((63*512)) /dev/nbd0 /mnt $ sudo cp -r blue /mnt/Documents and Settings/All Users/Desktop $ sudo umount /mnt $ sudo qemu-nbd -d /dev/nbd0 $ sudo rmmod nbd
プラグインもコンパイルしておきます.
$ cd ../decaf/plugins $ git clone https://github.com/ntddk/geteip $ cd geteip $ ./configure --decaf-path=/home/tsun/DECAF/decaf $ make
pluginのload,unloadや使い方
(qemu) load_plugin /home/tsun/DECAF/geteip/geteip.so (qemu) geteip blue.exe
編集したgeteip.cをに反映させたい場合はmakeしたあとにunloadします
この際,geteip.cを編集するターミナルとQEMUを起動しているターミナルは別にしておいてください.
編集ターミナルでmakeコマンドを実行した後にQEMUターミナルの方で次のコマンドを打ちます.
(qemu) unload_plugin (qemu) load_plugin /home/tsun/DECAF/geteip/geteip.so (qemu) geteip blue.exe
これでblue.exeに編集したのが反映されます.
おわり
これで環境構築はおわりました.
次はいよいよプラグイン開発です.
Ref:
ポート設定でコケた
sshのポート変更しようかな...って思い
躓いたところのメモ
設定をいじります
楽勝だ~
#service sshd restart
Stopping sshd: [OK]
Starting sshd: [OK]
#service iptables restart
iptables: Setting chains to policy ACCEPT: filter [OK]
iptables: Flushing firewall rules: [OK]
iptables: Unloading modules: [OK]
iptables: Applying firewall rules: iptables-restore: line 14 failed
!!!!!???
iptablesでいじったのは,ここだけ↓
*filter
~~~(略)~~~
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT #ここ
無駄なスペースが入力されているわけでもなく,スペルミスしているわけでもない.
ふと思いついて,こんな感じに変更
*filter
~~~(略)~~~
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT #ここ
COMMIT
COMMITの前に入れるとでけた
調べてみると
設定ファイルを直接編集する際は、
行頭に「*(アスタリスク)」を付けて、最後は「COMMIT」で指定.
その間に書かれた設定がfilterテーブルのルールとなるらしいです.
~~参考~~
http://oxynotes.com/?p=6361
http://easyramble.com/change-ssh-port-number.html
int main()とint main(void)
目覚めたと同時に
int main(){}とint main(void){}は
アセンブラ的にみると違うのかという
謎な感じの疑問が降りてきた
— tsun (@No___Op) August 29, 2015
ウソです。なんか寝る前に考えていて朝目覚めてすぐ行動したという感じ。
プログラミングのテストでint main()で書いていて点数が下がったので
えっ...と思っていた
そんなにgdb使ってないんだよな
コマンド忘れた
— tsun (@No___Op) August 29, 2015
らしいのでgdbの使い方も含めて確かめてみよう.
まず簡単にハローする
//hello.c
int main(){
printf("Hello World!\n");
return 0;
}
//hello_void.c
#include<stdio.h>
int main(void){
printf("Hello World!\n");
return 0;
}
次にコンパイル
gcc -g -o h1 hello.c
gcc -g -o h2 hello_void.c
-gオプションを付けることでデバッグ情報が付加されますね
次はいよいよgdbの出番です
お好みでintel記法かAT&T記法か選んでください。デフォルトだとAT&T
intel記法に修正したい時はコレ from ももテク
さて
gdb -q h1
Reading symbols from void...done.
(gdb)disas main
Dump of assembler code for function main:
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: mov $0x4005d4,%edi
0x0000000000400536 <+9>: callq 0x400410 <puts@plt>
0x000000000040053b <+14>: mov $0x0,%eax
0x0000000000400540 <+19>: pop %rbp
0x0000000000400541 <+20>: retq
End of assembler dump.
もう一方の(void)の方を見てみましょう
Reading symbols from void...done.
(gdb)disas main
Dump of assembler code for function main:
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: mov $0x4005d4,%edi
0x0000000000400536 <+9>: callq 0x400410 <puts@plt>
0x000000000040053b <+14>: mov $0x0,%eax
0x0000000000400540 <+19>: pop %rbp
0x0000000000400541 <+20>: retq
End of assembler dump.
なんと同じなんですねーww
先生に反論できる!できるぞ!!
つ[ http://qiita.com/raccy/items/b59bd7fa9f4eacabca79 ]
なんとc++だと上の二つは一緒ということなのですが
cだと違うそうなんです.(死)
テストの点数が上がらないことがわかったのでジ・エンド
-参考-
コマンドラインからpdfを見る
今までクリックしてpdfをdocument viewerで見ていたけど
コマンドないのかググったところあったのでメモ.
tsun@ubuntu:~$ evince foo.pdf
evinceのオプション色々...
フルスクリーンモード
--fullscreen hoge.pdf
プレゼンテーションモード
--presentation huga.pdf
プレビューモード
--preview bar.pdf
でも
tsun@ubuntu:~$ evince http://example.jp/sample.pdf
のようにURL指定したら出来なかった...
調べたらできるらしいんだけど...
そこら辺はもう少し詳しく調べてみよう