2011/6/11 DEFCON 19 CTF quals Forensics 200 writeup |
link to this article: http://murachue.ddo.jp/web/diary.cgi?mode=past&query=201106#20110611 (Japanese)*ここはこのwriteupの一時的な置き場なので、他のサイトに移動する予定です。* (English)*here is temporary space for this writeup, so will be moved to another site.* 誰もDefcon 19 CTF予選のforensics 200のwrite upを書かないので、試しに書いてみようと思います。 No one write up Defcon 19 CTF quals forensics 200, so we try to write up it in (poor) English. Forensics 200: Find the key. File: f200_a3c6a7f6a4b4f9511ee83 まず、問題のファイルをヘキサエディタで開くとBZh91...と見えたのでbzip2フォーマットであることがわかりました。 First, we opened that file by hex-editor, and see "BZh91..." so this file is bzip2 format. $ bunzip2 -c f200_a3c6a7f6a4b4f9511ee83 > f200.img 次にbunzip2したファイルをヘキサエディタで開くとNTFSやNTLDRと見えたのでNTFSのディスクイメージだと言うことが分かりました。 Next, we opened bunzip2-ed file by hex-editor, we saw "NTFS" and "NTLDR", so it is a NTFS disk image. このディスクイメージからファイルを展開してみました。 We extracted files from this disk image. すると、100個のディレクトリ(dir**)があり、それぞれの中に200個以上のファイル(key*****)がありました。 Then, extracted 100 directories(dir**) and more than 200 files(key*****) in each directory. ファイルのサイズは全て1024バイト、中身はどれも下の絵と同じような内容でした。 Every file's size is 1024 bytes, data in files looks similar to picture below. ここで一旦詰まってしまいました。 We stucked this point. 数時間後、ふと$MFTをヘキサエディタで開き、ヘキサエディタについているビットマップビュー機能を使ってみました。 But after several hours, we opened $MFT by hex-editor, and use bitmap-view feature. このようにkey*****ファイルのFILEレコードが並んでいるのですが… FILE record of files (key*****) lined like picture below... …一カ所だけ周りと違う部分がありました。 ...except here. そのFILEレコードを見てみました。 Let's look into this FILE record. すると、$STANDARD_INFORMATION(0x10)、$FILE_NAME(0x30)、$SECURITY_DESCRIPTOR(0x50)、$DATA(0x80)と並んで0x0110という見慣れない属性がありました。 There is a strange attribute 0x0110 after $STANDARD_INFORMATION(0x10), $FILE_NAME(0x30), $SECURITY_DESCRIPTOR(0x50) and $DATA(0x80). とても怪しいですね ;-) It looks very suspicious ;-) その属性が示す先のデータ(クラスタ0x166A0)を見ると、今まで見ていたkey*****ファイルと同じようなデータがありました。 Go to that attribute's data(cluster 0x166A0), there is a data that similar to key***** files we saw. このデータからNULLバイトを除いた文字列を送信したら、CORRECT!でした。 We sent string removed NULL bytes from that data, and got "CORRECT!" message. Answer: 47a96fac9edb95e641e835e21ce800934d4c8f7e |
2011/6/12 (昨日)第1回マルウェア解析勉強会に行ってきたよ |
http://atnd.org/events/15911 感想だよ。 ・虫かご作成講座 過去のまっちゃ445あたりでもあったお話。 個人レベルでは実現難しそうです。 ・私のマルウェア解析方法 中津留勇 編 この発表を聞いて「IDA Pro買え」と言っているようにしか思えなかった… IDA Pythonすごいですね。何でもできる錯覚(もしくは本当に)。 自分のやり方がすごく効率悪く見えてくる…。 ・私のマルウェア解析方法 太刀川剛 編 動的解析と静的解析をうまく組み合わせて解析をされているように感じました。 アンパックはIDA上だと面倒そうですからね。(といいつつIDA Python使った場合はどうなんだろうと思ったり。) マルウェア解析初心者向け検体の紹介はとてもありがたく感じました。慣れてみよう…。 ・私のマルウェア解析方法 勇士Q 編 変態… Mach-Oでは実行開始時のレジスタ値を設定できるのを初めて知りました。おもしろそう。 そして最近のiPhoneアプリのバイナリが変わっているようですね。私も知りませんでした。 3人の方がそれぞれどのような流れで解析されているか、どのようなソフトウェアをどのように使っているか、といったような事を紹介されていて、とても参考になりました。 私はまだマルウェアを解析したことはありませんが、とても楽しそうだなと思いました。(業務ではうんざりされているかもしれませんが…) さて、今回覚えたことを活かさないとー。 まずはアンパックからがんばってみますか…。 *** 個人的メモ。 .51EB851F .01010001111010111000010100011111 1.010001111010111000010100011111 * 2^-2 0 01111101 010001111010111000010100011111 0011 1110 1010 0011 1101 0111 0000 1010 00111110101000111101011100001010 % ruby -e 'p ["00111110101000111101011100001010"].pack("B*").reverse.unpack("f")' [0.319999992847443] .51EB851F = 0.319999992847443 =~ 0.32 0.32>>5 = 0.001 .66666667h .01100110011001100110011001100111 1.100110011001100110011001100111 * 2^-2 100110011001100110011001100111 0 01111101 100110011001100110011001100111 0011 1110 1100 1100 1100 1100 1100 1100 00111110110011001100110011001100 % ruby -e 'p ["00111110110011001100110011001100"].pack("B*").reverse.unpack("f")' [0.399999976158142] .66666667 = 0.399999976158142 =~(1/2.5=)0.4 0.4>>2 = 0.1 |
2011/6/26 IDCって意外と簡単だった |
IDAのIDCで動く、OllyDbgのJump'n'call highlightingもどきを作ってみました。 File、IDC Commandに貼り付けて実行できます。 auto ea; ea = 0; while(ea = FindCode(ea, SEARCH_DOWN | SEARCH_NEXT)) { auto m; if(ea == 0xFFFFFFFF) break; m = GetMnem(ea); if(m == "call") { SetColor(ea, CIC_ITEM, 0xFFFF80); } if(m == "jmp") { SetColor(ea, CIC_ITEM, 0x40FFFF); } if(m == "jz" || m == "jnz" || m == "ja" || m == "jb" || m == "jae" || m == "jbe" || m == "jl" || m == "jg" || m == "jle" || m == "jge" || m == "js" || m == "jns" || m == "jc" || m == "jnc") { SetColor(ea, CIC_ITEM, 0xC0FFFF); } } Message("Coloring complete.\n"); 行(というかアドレス)ごとではなく、文字単位で色がつけられたらいいのになー。 |