PwniumCTF2014 - JJSN總結

HuangJacky發表於2014-07-22

Write-ups

本文最早釋出在TSRC,詳細地址:http://security.tencent.com/index.php/blog/msg/55

Forensics

USB is FUN

這道題目就給出了一個檔案下載地址:http://41.231.53.40/for1.pcapng

檔案字尾是pcapNG的,當然玩ctf的時候,看見的並不一定就是真的,我們可以通過file命令和一些hex工具來檢視一下,資訊如圖:

image

image

通過上面資訊可以確定該檔案的確是pcapng格式,google了一下這個檔案型別就是pcap格式的擴充套件,目前還只是實驗階段,可以使用wireshark開啟分析。心急的朋友可能直接使用wireshark開啟這個檔案開始分析了,22M這得多少網路包呀。取證中經常用到一個方法就是使用strings檢視檔案中有什麼字串,執行結果如下圖:

image

我們發現熟悉的flag字串,提交,搞定了。

Altered Code

這一題給出了一個.c檔案(下載地址:http://41.231.53.40/main.c),沒有任何提示。

最初我們拿到這個檔案後,編譯,執行,得到一串無意義的字串,當然這肯定不是flag。

接下來我們嘗試了調換程式碼順序,再編譯執行,還是不對。

最後通過觀察網頁上面展示的程式碼段(這裡有一個坑:工具開啟.c檔案會自動縮排好),我們發現縮排有問題,如圖:

image

為了進一步確認,我們檢視該檔案的HEX,如圖:

image

正常的縮排使用的空格,而有幾行程式碼縮排使用的是\t。因此我們嘗試註釋掉\t縮排的程式碼段,再編譯執行,效果如圖:

image

提交,搞定。

Find the owner

題目:

http://41.231.53.40/Forensics100.zip flag format == Pwnium{md5[ip:port]} Be careful this file may harm your computer

這道題目肯定是這個檔案會幹什麼操作。於是我們先用Total uninstall來監控登錄檔和C盤檔案,然後執行exe檔案,發現沒有任何操作,那麼exe肯定是進行網路操作。開啟Wireshark可以看到如下的網路請求:

image

ip:193.95.68.245,port:81,按照題目的提示md5一下,提交就搞定了。

ps:檔案是一個木馬,更簡潔的方法可以扔給各種線上木馬檢測網站試一下,根本不用自己分析。懶人必備。

MISC

Look Closer

這題也只給出一個rar檔案,下載地址:

https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/look-closer/Misc1.rar?raw=true),沒有任何提示。

下載後,我們發現無法開啟,提示是錯誤的格式,於是Hex檢視一下檔案的格式,如圖:

image

圖7 Hex檢視misc1.rar

檔案頭很明顯告訴我們這個是一個jpg檔案,於是修改字尾,flag就在圖片中,如圖:

image

提交,搞定。

So basic

這題同樣只給出一個zip檔案(下載地址:

https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/so-basic/Misc75.zip?raw=true)。

我們將下載的zip檔案進行解壓,裡面有40個小檔案,每個檔案中是一個數字,給人感覺就是這個是ASCII值。

首先將所有檔案中的文字合併到一個檔案中:

cat ./* > misc75.txt

然後轉換成對應字串看看,得到如圖的結果:

image

圖9 unhexlify的結果

看上去很像flag,但是順序是亂的。我們找到字元P對應的檔案“cfcd208495d565ef66e7dff9f98764da”,檔名很像是MD5加密的,於是我們嘗試破解一下,解密後是字元0。那麼大膽猜測所有的檔名其實是0~39的MD5密文。那麼我們修改一下程式:

image

圖10 修改後的Py程式碼

YEAH!!搞定。

Crypto

Break me

題目中給出一個字串:

“QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=”

經驗告訴我們這個是一個經過Base64編碼的字串,於是我們嘗試使用Base64解碼,解碼後結果含有不可見字元,說明這還不是Flag。

image

在這裡有一些不知所措,於是乎我們將前面可見部分字元在google中進行搜尋了一下,發現有相關文章說這是bz2檔案格式的頭部,通過對比bz2檔案格式的頭部和尾部,我們可以確認上面的位元組流的確是經過bzip2壓縮後的內容,現在就就簡單了,再解壓縮一次:

image

提交,搞定了。

Programming

2048

Crack me fast

題目提示如下:

Crackme Fast The binary http://41.231.53.44:9393/ Send the password in less than 2 secondshttp://41.231.53.44:9393/check.php?p={p@55}

訪問題目中的地址,可以得到一個檔案,開啟之後如圖:

image

檔案頭是個LPCK,不知道啥格式,不過在之後看到了MZ頭。把MZ頭之前的部分統統刪掉,成功得到一個exe。

image

要求輸入Password。沒有辦法了,直接扔進ida….找到關鍵部分如下:

.text:00401363 mov [esp+5Ch+var_5C], offset aPassword ;

"Password :"

.text:0040136A call puts

.text:0040136F lea eax, [esp+5Ch+var_3E]

.text:00401373 mov [esp+5Ch+var_58], eax

.text:00401377 mov [esp+5Ch+var_5C], offset aS ; "%s"

.text:0040137E call scanf

.text:00401383 mov [esp+5Ch+var_14], 0

.text:0040138B jmp short loc_4013B1

.text:0040138D ; ---------------------------------------------------------------------------.text:0040138D

.text:0040138D loc_40138D: ; CODE XREF:

main+8F j

.text:0040138D mov eax, [esp+5Ch+var_14]

.text:00401391 mov eax, [esp+eax*4+5Ch+var_34]

.text:00401395 mov ecx, eax

.text:00401397 xor ecx, 1

.text:0040139A lea edx, [esp+5Ch+var_3E]

.text:0040139E mov eax, [esp+5Ch+var_14]

.text:004013A2 add eax, edx

.text:004013A4 mov al, [eax]

.text:004013A6 movsx eax, al

.text:004013A9 cmp ecx, eax

.text:004013AB jnz short loc_4013C7

.text:004013AD inc [esp+5Ch+var_14]

.text:004013B1

.text:004013B1 loc_4013B1: ; CODE XREF:

main+57 j

.text:004013B1 mov ebx, [esp+5Ch+var_14]

.text:004013B5 lea eax, [esp+5Ch+var_3E]

.text:004013B9 mov [esp+5Ch+var_5C], eax

.text:004013BC call strlen

.text:004013C1 cmp ebx, eax

.text:004013C3 jb short loc_40138D

.text:004013C5 jmp short loc_4013C8

.text:004013C7 ; ---------------------------------------------------------------------------.text:004013C7

.text:004013C7 loc_4013C7: ; CODE XREF:

main+77 j

.text:004013C7 nop

.text:004013C8

.text:004013C8 loc_4013C8: ; CODE XREF:

main+91 j

.text:004013C8 lea eax, [esp+5Ch+var_3E]

.text:004013CC mov [esp+5Ch+var_5C], eax

.text:004013CF call strlen

.text:004013D4 cmp eax, 8

.text:004013D7 jnz short loc_4013E8

.text:004013D9 cmp [esp+5Ch+var_14], 8

.text:004013DE jnz short loc_4013E8

.text:004013E0 mov [esp+5Ch+var_10], 1

.text:004013E8

.text:004013E8 loc_4013E8: ; CODE XREF:

main+A3 j

.text:004013E8 ; main+AA j

.text:004013E8 cmp [esp+5Ch+var_10], 1

.text:004013ED jnz short loc_4013FD

.text:004013EF mov [esp+5Ch+var_5C], offset aGoodBoySendTha ; "Good Boy ! Send That pass to server to "...

.text:004013F6 call printf

.text:004013FB jmp short loc_401409

.text:004013FD ; ---------------------------------------------------------------------------

.text:004013FD

.text:004013FD loc_4013FD: ; CODE XREF:

main+B9 j

.text:004013FD mov [esp+5Ch+var_5C], offset

aSorryIncorrect ; "Sorry ! Incorrect pass"

.text:00401404 call printf

大概理解一下:這裡輸入的字串為8個字元,然後以esp+5Ch+var_34為地址之後的8個DWORD,取低8位字元,然後都xor 1,結果與輸入的串比較,相等則正確。

來看看esp+5Ch+var_34的資料怎麼得到:

.text:00401345 lea edx, [esp+5Ch+var_34]

.text:00401349 mov ebx, 402000h

.text:0040134E mov eax, 8

.text:00401353 mov edi, edx

.text:00401355 mov esi, ebx

.text:00401357 mov ecx, eax

.text:00401359 rep movsd

看樣子是從0x402000h複製過來的,於是跟過去:

image

看樣子把這些東西xor 1一下就可以得到password瞭然後提交就可以得到Flag了。

結果卻是”Too late”,好吧題目寫了少於2s。

那就把VA轉換成檔案偏移,得到0x1310,寫個指令碼自動破解吧。

image

ROT

題目如下:

Rot 90, Rot -90, Rot 90, Rot -90... nc 41.231.53.40 9090

每次連上去後會得到一個base64的字串,解碼後是一個png檔案格式的位元組流,可以還原成如圖:

image

仔細觀察一發,應該只要把左右兩部分摺疊拼湊在一起就行,而且題目中不是也說rot90。

image

執行後的結果如下:

image

自動提交,搞定。

Web

Guest book

題目:

Find the key ! http://41.231.53.43:8383/

題目是一個web頁面,而New post功能的post內容存在sql延時盲注。Flag內容存在於資料庫中,利用注入得到庫名錶名欄位名,然後查詢得到flag內容。盲注得到庫名為web200,表名列名為flag:flag。

盲注sql語句:

test', '1' and (select if(ascii(mid((select flag from web200.flag where flag!='' limit 0,1),1,1))=100,sleep(5),0)))#

寫一個指令碼就來完成這個過程,就輕鬆搞定了。

Xwebsite

題目:

Find the key http://41.231.53.44/web100/index.php

目前題目已經無法訪問了,所以這裡就簡單說一下情況。在登陸的時候,我們使用萬能登入“’ or ‘1’=’1”,成功以管理員身份登入後,再搜尋“’ or ‘1’=’1”,得到的結果中就有flag。是不是很簡單呀?其實ctf中很多題目只要你有思路都很簡單的。

Reverse

Baby crack me

題目:

a baybe crackme http://41.231.53.44/tasks/re10.zip

如果上面地址無法下載,那麼可以從這裡

https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/baybe-crackme/re10.zip?raw=true下載。

執行下載後的檔案,無限輸出“baby crackme”,用IDA逆向一下,可以得到如下程式碼:

image

程式大致的意思是在沒有引數執行的時候會無限輸出Baby Crackme,當有引數的時候就會輸出Flag。

莫非答案就是G00d_B0y,提交試一下,正確了。好吧,10分的題目。

Kernel Land

題目:

The third Tick gives you the answer ;) http://41.231.53.40/kernel

備用下載地址:

https://github.com/ctfs/write-ups/blob/master/pwnium-ctf-2014/kernel-land/kernel?raw=true

執行下載後的檔案,出現“segment fault”,而IDA除錯剛連上去就自己斷開,現在只能扔IDA裡開始逆吧。

從啟動函式開始看,一路設定GDT,IDT,IRQ,然後開個定時器,主執行緒就結束了,沒發現啥和flag有關的。。。。把定時器翻出來看看,程式碼如下:

.text:00100958 public timer_tick

.text:00100958 timer_tick proc near ; DATA XREF:

timer_init+3 o

.text:00100958 sub esp, 14h

.text:0010095B mov eax, ds:1060C0h

.text:00100960 lea edx, [eax+1]

.text:00100963 mov ds:1060C0h, edx

.text:00100969 push eax

.text:0010096A push offset aDTick__ ; "%d Tick..\n"

.text:0010096F call printf

.text:00100974 movzx ecx, byte ptr ds:1060C0h

.text:0010097B add esp, 10h

.text:0010097E mov eax, 0

.text:00100983

.text:00100983 loc_100983: ; CODE XREF:

timer_tick+42 j

.text:00100983 mov edx, ecx

.text:00100985 xor dl, byte ptr ds:flag[eax]

.text:0010098B add edx, 1

.text:0010098E mov byte ptr ds:flag[eax], dl

.text:00100994 add eax, 1

.text:00100997 cmp eax, 28h

.text:0010099A jnz short loc_100983

.text:0010099C add esp, 0Ch

.text:0010099F retn

.text:0010099F timer_tick endp

這裡的flag只和tick進行運算,而tick是個char,也就是說現在flag可能的取值一共有256種,那麼窮舉一下看看結果就知道哪一個是Flag了。

image

執行結果:

image

搞定了。