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工具來檢視一下,資訊如圖:
通過上面資訊可以確定該檔案的確是pcapng格式,google了一下這個檔案型別就是pcap格式的擴充套件,目前還只是實驗階段,可以使用wireshark開啟分析。心急的朋友可能直接使用wireshark開啟這個檔案開始分析了,22M這得多少網路包呀。取證中經常用到一個方法就是使用strings檢視檔案中有什麼字串,執行結果如下圖:
我們發現熟悉的flag字串,提交,搞定了。
Altered Code
這一題給出了一個.c檔案(下載地址:http://41.231.53.40/main.c),沒有任何提示。
最初我們拿到這個檔案後,編譯,執行,得到一串無意義的字串,當然這肯定不是flag。
接下來我們嘗試了調換程式碼順序,再編譯執行,還是不對。
最後通過觀察網頁上面展示的程式碼段(這裡有一個坑:工具開啟.c檔案會自動縮排好),我們發現縮排有問題,如圖:
為了進一步確認,我們檢視該檔案的HEX,如圖:
正常的縮排使用的空格,而有幾行程式碼縮排使用的是\t。因此我們嘗試註釋掉\t縮排的程式碼段,再編譯執行,效果如圖:
提交,搞定。
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可以看到如下的網路請求:
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檢視一下檔案的格式,如圖:
圖7 Hex檢視misc1.rar
檔案頭很明顯告訴我們這個是一個jpg檔案,於是修改字尾,flag就在圖片中,如圖:
提交,搞定。
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
然後轉換成對應字串看看,得到如圖的結果:
圖9 unhexlify的結果
看上去很像flag,但是順序是亂的。我們找到字元P對應的檔案“cfcd208495d565ef66e7dff9f98764da”,檔名很像是MD5加密的,於是我們嘗試破解一下,解密後是字元0。那麼大膽猜測所有的檔名其實是0~39的MD5密文。那麼我們修改一下程式:
圖10 修改後的Py程式碼
YEAH!!搞定。
Crypto
Break me
題目中給出一個字串:
“QlpoOTFBWSZTWTxSmOAAAAsJAF/gOwAgADEAAAiZMNT0JbKzhCQcyQtA2gNbvXgSvxdyRThQkDxSmOA=”
經驗告訴我們這個是一個經過Base64編碼的字串,於是我們嘗試使用Base64解碼,解碼後結果含有不可見字元,說明這還不是Flag。
在這裡有一些不知所措,於是乎我們將前面可見部分字元在google中進行搜尋了一下,發現有相關文章說這是bz2檔案格式的頭部,通過對比bz2檔案格式的頭部和尾部,我們可以確認上面的位元組流的確是經過bzip2壓縮後的內容,現在就就簡單了,再解壓縮一次:
提交,搞定了。
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}
訪問題目中的地址,可以得到一個檔案,開啟之後如圖:
檔案頭是個LPCK,不知道啥格式,不過在之後看到了MZ頭。把MZ頭之前的部分統統刪掉,成功得到一個exe。
要求輸入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複製過來的,於是跟過去:
看樣子把這些東西xor 1一下就可以得到password瞭然後提交就可以得到Flag了。
結果卻是”Too late”,好吧題目寫了少於2s。
那就把VA轉換成檔案偏移,得到0x1310,寫個指令碼自動破解吧。
ROT
題目如下:
Rot 90, Rot -90, Rot 90, Rot -90... nc 41.231.53.40 9090
每次連上去後會得到一個base64的字串,解碼後是一個png檔案格式的位元組流,可以還原成如圖:
仔細觀察一發,應該只要把左右兩部分摺疊拼湊在一起就行,而且題目中不是也說rot90。
執行後的結果如下:
自動提交,搞定。
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逆向一下,可以得到如下程式碼:
程式大致的意思是在沒有引數執行的時候會無限輸出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了。
執行結果:
搞定了。