[CTF] AIS3 Write-Up

這份write-up寫好放著好久了,一直忘記發佈出來XD

最近在整理文章熊熊才想到...

大神們請飄過Q__Q


MISC1
嘗試送出你的第一把 KEY The key is AIS3{hello_world}
直接送出KEY

MISC2
雖然facebook.zip有加密,但是可觀看到內含資料夾/p960x960/下有一個圖片檔案的檔名為851556_443281069111871_602278786_n.png,透過Google搜索後,
可以在Github頁面:https://github.com/nicksahler/FacebookStickers/blob/master/test.html中找到相關於此檔名的圖片網址為:

851556_443281069111871_602278786_n.png


接著將此圖片下載後,自行包成ZIP壓縮包(這裡命名為my_zip.zip)利用知名工具PKCrack,Linux中下命令pkcrack -d o.zip -P my_zip.zip -c "p960x960/851556_443281069111871_602278786_n.png" -C facebook.zip  -p 851556_443281069111871_602278786_n.png

最後產出o.zip解壓縮後就可以觀看到內含的文字檔案內的key了

MISC3
螢幕快照 2015-07-28 上午12.47.51.png
把檔案c4載下來後,用file查看得知為gzip檔案然後下gzip後會變成c4.gzip在解壓縮開(重複兩次後)c4會變成bitmap的檔案,點閱開來後就可以看到KEY:
螢幕快照 2015-07-28 上午12.50.24.png如上圖所示就會出現Key

WEB1
題目給的網站 http://52.69.163.194/web1/ 內有兩個連結about跟test,


可以透過參數塞php://filter/convert.base64-encode/resource=index把Source Code轉Base64後印出,瀏覽網址:http://52.69.163.194/web1/?page=php://filter/convert.base64-encode/resource=index,印出Base64文字做Decode找到網頁Source內就可以看到註解含有Key


WEB2
翻到整頁亂中有序的符號中可以看見符號結尾為(),是個Java Script加密
螢幕快照 2015-07-28 上午1.26.42.png
螢幕快照 2015-07-28 上午12.54.28.png
將題目內丟入主控台執行,並且重新整理
螢幕快照 2015-07-28 上午12.54.14.png
WEB3
在WEB3網站內的Login登入頁面上帳號與密碼雖過濾單引號
但是含有SQLi漏洞可插入\’’ or 1 = 1 #

BINARY1
用PEID可以查殼確定是UPX Shell,但是用UPX自帶的去殼工具脫不掉
用OD載入軟體Bin1.exe
螢幕快照 2015-07-28 上午1.07.05.png
往下翻一下很快可以找到popad,接著底下cmp esp,eax確定完恢復stack後然後jmp做大跳轉回到原始OEP,F8單步到原始OEP入口後:
螢幕快照 2015-07-28 上午1.09.49.png在原始OEP處右鍵OllyDump
螢幕快照 2015-07-28 上午1.11.20.png
然後勾選選項修正物理大小與修正OEP Offset並修正IAT,輸出出去為exe檔案
螢幕快照 2015-07-28 上午1.13.46.png
IDA打開後找到入口點很快就可以找到猜數字遊戲噴的KEY了

BINARY2
題目中的一串文字為一段Shellcode,可以撰寫c程式碼將Shellcode執行起來觀看結果
在Linux x64下以gcc編譯並執行:
char code[]="\x48\xb8\xb5\xa3\xb9\xb1\xc6\x41\x41\x41\x50\x48\xb8\xbc\xa0\xa9\x93\xaa\xa3\xbe\x93\x50\x48\xb8\xa9\x93\xa5\xbf\x93\xbf\xa5\xa1\x50\x48\xb8\xbf\xa4\xa9\xa0\xa0\xaf\xa3\xa8\x50\x48\xb8\x8d\x85\x9f\xff\xb7\xa3\xa7\x93\x50\x48\x89\xe6\x48\x31\xd2\x80\x34\x16\xcc\xfe\xc2\x80\xfa\x25\x75\xf5\x48\x31\xc0\x48\xff\xc0\x48\x89\xc7\x0f\x05\x6a\x3c\x58\x48\x31\xff\x0f\x05";

int main()
{
int (*ret)() = (int(*)())code;
ret();
}

BINARY3
螢幕快照 2015-07-28 下午2.35.53.png
從文字資源區很快可以翻到Key正確時的回應句“Yeah, It’s the flag!!! WOW”
往回翻到對使用者輸入的操作起始點

螢幕快照 2015-07-28 上午4.42.25.png
可以看到call to_reg後rdx被設為input、mode被設為1,返回後把rcx放入程式內部的key(0xDDDDAAAADADADDAA)接著rdx = rdx ^ rcx再塞回key內。
螢幕快照 2015-07-28 上午4.43.30.png
接著進入到check2,先把eax清零然後call進gg內,確認gg返回值的一個short單位若為0則代表Key正確。

螢幕快照 2015-07-28 上午4.44.10.png
最後看到gg內部,會先把先前操作過的key前4bytes對0xBFB7B8CE做比對,一樣為1反之為0再將後4byte對0xBCB4DEC4做比對,一樣為1反之為0。操作完畢後若ax結果為101(也就是key與0xBCB4DEC4BFB7B8CE一樣)就回傳0反之回傳不為0。

因此可以得出整支程式判斷Key正不正確的過程:
(input ^ 0xDDDDAAAADADADDAA == 0xBCB4DEC4BFB7B8CE) 則代表Key正確

上述公式移向後得知:
0xBCB4DEC4BFB7B8CE ^ 0xDDDDAAAADADADDAA == input(原本使用者應輸入)

螢幕快照 2015-07-28 下午2.50.44.png
最後因0xBCB4DEC4BFB7B8CE(Integer x64)需little-endian,故答案需反轉,
答案為:dementia

PWN1
這個write up事先發成BLOG文章了
%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2015-07-27%2B%25E4%25B8%258A%25E5%258D%25882.25.57.png
首先下file  pwn1,可以得知為elf x64 linux檔案

%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2015-07-27%2B%25E4%25B8%258A%25E5%258D%25882.30.18.png
拖進IDA Pro按下Shift+F12可以看見主機回應字串:Input Your Name
%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2015-07-27%2B%25E4%25B8%258A%25E5%258D%25882.33.40.png
接著翻到文字資源點點擊xref觀看參考點
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMdRSix-25FP6QhC23jKLlIYTfsdi6T5Y4gMZoMJBYu368mfuUEvhZrv0psBCiFcAbH8dNs5nUqL16DP49Tr5eo9HJ1FMFdT3riC85E1l0_b44X2IsZsNdT-G7A-zy3ZF8IZTz-YEaKJQA/s640/%25E8%259E%25A2%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7+2015-07-27+%25E4%25B8%258A%25E5%258D%25882.35.08.png
接著可以使用IDA Pro F5得到:
可以看到伺服器上回應的程式puts出“Input Your Name”後,做scanf把使用者傳入的Data寫入v1內(應該是char array?)接著就判斷v4是否為0x90909090,是就噴Flag否則就告訴你目前的v4的值為多少(如果沒控制成功,預設會是10)

這邊可以得知的是唯一跟使用者傳入(可控)的是v1,接著我們想控制的是一個被宣告為DWORD的v4(4個BYTE),接著回到組合語言狀態下觀看:
這邊可以得知v1(Buffer)地址為+0x20而v4地址則為+0x04,也就是兩個偏移量差了32 - 4 = 28個BYTE,所以我們可以這樣傳入使用者測資來控制v4:
[........共28個字元塞滿(隨便塞)........][要控制的v4值,4BYTE]

最後下: echo -e "............................\x90\x90\x90\x90" | nc ip port
就可以得到KEY了

Crypto1
題目內給了一個秘文,檔名為vigenere.txt推測為此題關鍵,
Google搜尋了一下:維吉尼爾加密法
https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Vigen%C3%A8re_square_shading.svg/2000px-Vigen%C3%A8re_square_shading.svg.png
找到這張對換表,可以看到是英文字母對換表不處理符號
螢幕快照 2015-07-28 上午2.28.00.png在題目給的秘文中找到很明顯的字串為:
vayy://dgu.sjg3.vwp/gvawt/hojtfldxwwnjwfetzbvhmj.uki
開頭相似於http://的形式,推測為網址,根據維吉尼爾加密法,根據Key加密方式會有一個固定的Offset相對應於該位置上;不過可以利用線上工具:http://smurfoncrack.com/pygenere/index.php
螢幕快照 2015-07-28 上午2.44.04.png
將密文整段放入後按下分析可以幫我們暴力Try Key出來還有解密的文本XD
連線至該連結就可以得到Key了

Crypto2
http://www.factordb.com 網站上可以查詢到p與q即可解密RSA,就可以得到Key

留言

這個網誌中的熱門文章

[C#] Lambda花式應用噁爛寫法(跨UI委派秒幹、多線程處理...etc)

[Windows] 逆向工程 C++ 中入口函數參數 main(argc, argv) 與如何正確的進行參數劫持

重建天堂之門:從 32 位元地獄一路打回天堂聖地(上)深度逆向工程 WOW64 設計