1. 程式人生 > >中國科學技術大學第五屆資訊保安大賽(hackergame2018自我總結)

中國科學技術大學第五屆資訊保安大賽(hackergame2018自我總結)

https://hack2018.lug.ustc.edu.cn

這是我第一次參加ctf(應該也是第一次聽說吧),居然隨緣拿了6個flag(本來7個,還有一個明明對了不算我對的),也算是入門了吧,也讓我對ctf產生了興趣,以後我應該也會接著參加這類比賽吧(雖然這讓我自閉)

1、簽到題

------------------------------------------------------------------------------------------------------------

不用找了!簽到題我已經放這裡了!

------------------------------------------------------------------------------------------------------------

我反正視力好一下子(ctf不相信視力)就找到了位址列的變化,加上了一個8完成了任務

write-up:這道題目是我設定在 Hackergame 2018 中的第一道題,其目的只是想更精確的統計一下參賽人數,然而沒想到本題也成為了本次比賽中命題組給出最多答覆次數的題目。
回到題目本身,這道題目有一個輸入框,根據提示需要輸入 hackergame2018,然而細心的同學已經發現了,無論是通過輸入還是貼上的方法都會缺少一個數字 8。image-20181016015633115

解決問題的方法至少有以下幾個:
解法一:觀察位址列
Hackergame 需要視力!只需要觀察到位址列中 ?key=hackergame201 ,將其改為 ?key=hackergame2018 並回車就可以得到 flag。

image-20181016015820553

解法二:審查元素
使用 Chrome 瀏覽器,在輸入框上右鍵點選審查元素(Inspect)可以看到:image-20181016020015148

一個叫做 maxlength="13" 的東西,我們雙擊它,修改為大於等於 14 的數字或刪除即可。
最後得到 flag:flag{Hackergame2018_Have_Fun!}

 

2、貓咪問答

------------------------------------------------------------------------------------------------------------

鏟屎官:要鏟屎嗎?@貓咪
貓咪:我是你直接@的?你這是在叫主子?我不想看見第二次。
貓咪:喵的心裡沒點數?
一隻路過的狗:請各位鏟屎官注意自己的身份和說話方式。@全體成員

為了不被罵,鏟屎官再也不敢問任何問題了,下面這些簡單的問題,也只能你自己來搜尋解決。

------------------------------------------------------------------------------------------------------------

ps.這道題不就是考用搜索引擎的能力嗎?我最擅長了!不難不難。

write-up:歡迎來到貓咪系列題目之貓咪問答。
這道題是一道非常簡單的題目,主要是想讓同學們學會一些搜尋技巧。
解法
下面我們來逐一分析:
中國科學技術大學的建校年份是?
直接搜尋即可;
你研究過中國科大學號的演變史嗎?現有一位 1992 年入學的博士生,系別為 11 系,學生編號為 26,請問 Ta 的學號是?
搜尋“中國科大學號的演變史”,可以找到中國科大的學號演變史,按照 1958 級 - 1996 級的規則生成即可,注意題目中說的是博士生;
視訊《諾貝爾獎獲得者和傑出科學家祝福科大60華誕》中,出現了多少位諾貝爾獎得主和世界頂尖科學家為中國科大六十週年華誕送上祝福?(數字)
直接搜尋“諾貝爾獎獲得者和傑出科學家祝福科大60華誕”觀看視訊即可;也可以選擇不看,直接爆破 0~100(合理估計);
在中國科大圖書館中,有一本書叫做《程式設計師的自我修養:連結、裝載與庫》,請問它的索書號是?
開啟中國科大圖書館主頁,直接搜尋“程式設計師的自我修養”即可。
我校 Linux 使用者協會在大約三年前曾經舉辦過一次小聚,其主題是《白帽子大賽,黑客不神祕》,請問這次小聚使用的教室編號是?
直接搜尋“白帽子大賽,黑客不神祕”即可,可以找到若干年前 Google Groups 上的活動公告。
zzh 補充:加引號搜尋或者加上 LUG 等關鍵詞,也可以在 LUG活動 上找到答案
最後得到 flag:flag{G00G1E-is-always-YOUR-FRIEND}

3、遊園會的集章卡片

------------------------------------------------------------------------------------------------------------

提示:flag 僅由 0154agflPYHMGRCNE_{} 這些字元組成。
我們經常被問一個問題:你們是從什麼時候開始為 Hackergame 出題的?
其實我們全年都在出題,命題組成員來自各種各樣的專業,在各種各樣的地方,有各種各樣不同的工作,閒暇之餘(或者工作不飽和的時候,這個最好刪掉)我們最大的樂趣就是互相出題給對方玩。
為了找到有趣的題目,我們需要源源不斷的靈感,不管是在巴蜀人家二樓包廂 LUD(注 1) 時,還是在北京食寶街的分米雞,甚至是在武漢開往合肥的 D2256 列車上,我們會把討論到的有趣的想法記錄下來,作為下一次 Hackergame 的題目。
比如前幾天,中國科學技術大學學生 Linux 使用者協會在中區遊園會擺攤招新(注 2),發現學校居然為每個參加遊園會的同學準備了一張精美的集章卡片:

到每個社團的攤位上收集蓋章,到達一定數量就有禮品贈送。
突然一位同學靈機一動,不如寫上 flag 然後撕碎!
附件就是撕碎的 flag,相信對中國科學技術大學校徽瞭如指掌的你很快就能將它還原。

------------------------------------------------------------------------------------------------------------

這道題我是用wps word文件拼的哈哈哈……

write-up:致歉:由於使用的字型不好,很多同學反映 flag 上的字母與數字難以辨認,在這裡為給大家帶來的不便表示歉意!
解答
解法1: 使用 photoshop、powerpoint 等軟體將各塊碎片拼起來即可見到 flag:

badge

解法2: 將碎片打印出來拼接到一起讀出 flag
flag{H4PPY_1M4GE_PR0CE551NG}

4、貓咪和鍵盤

------------------------------------------------------------------------------------------------------------

謹以此題,獻給所有被貓破壞的程式碼。
眾所周知,貓咪最喜歡鑽紙箱和趴鍵盤,其中鑽紙箱沒有太大的社會危害性,而趴鍵盤則是對人類的毀滅性打擊。
(想象一下這裡配了貓鑽紙箱和趴鍵盤的圖)
寫到一半的程式碼離奇消失,僅剩的程式碼也被搞得亂七八糟,憤怒的 D 同學剛要捉住罪魁禍首,準備好好揍它一頓,不料這時貓咪又突w13gcft4n kj87u6,/lp0o9--=l[

------------------------------------------------------------------------------------------------------------

這道題我一個一個單詞去復原,經過了1個小時的努力終於成功…………自閉了,太難受了(果然是我想太多了嗎?
write-up:歡迎來到貓咪系列題目之貓咪和鍵盤。
這道題是一道非常簡單的題目,主要是想讓同學們學會一些文字編輯的技巧。
解法一:一種原始而可靠的辦法
經過粗略觀察,我們就可以發現這應該是一個 C++ 原始碼,而程式碼被以“若干列”為單位打亂了。image-20181016012607646

我們的思路也很簡單,就是先以“若干列”為單位將程式碼還原。
第一步:列印程式碼;image-20181016012829431

第二步:裁剪程式碼;image-20181016012937555

第三步:我編不下去了……image-20181016013016568

當然,只要足夠有耐心,這個方法確實是原始而可靠的。
解法二:文字編輯器的進階技巧
21 世紀,許多編輯器都提供了“列編輯”模式,就我所知,以下常見的編輯器都是支援列編輯模式的:
VS Code
Windows/Linux:
Alt + 滑鼠左鍵 :可以新增多個游標;
Shift + Alt + 拖動滑鼠左鍵:可以選中多列;
macOS:
shift + option + 左鍵:可以選中多列;
Sublime Text
Shift + 滑鼠右鍵;
滑鼠中鍵;
選中需要進行列編輯的多行,然後按下 Ctrl + Shift + L;
Vim
Normal mode: Ctrl + v
Emacs
直接(或使用 C-x SPC)選定矩形區域的左上角和右下角,
C-x r k 剪下該矩形選區;
C-x r y 插入矩形選區。
任選一款文字編輯器,都可以輕鬆將程式碼還原。
還原後的程式碼大概長這個樣:

/*
* name: typed_printf.cpp
* compile: g++ -std=c++17 typed_printf.cpp
* title: type safe printf
* author: nicekingwei
* url: aHR0cHM6Ly96anUtbGFtYmRhLnRlY2gvY3BwZHQtcHJpbnRmLw==
* related knowledge:
* - value and type
* value->value: function
* type->value: parametric polymorphism
* type->type: generic
* value->type: dependent type
* - auto
* - if constexpr
*/
#include <iostream>
// 。。。

 


根據提示,使用 g++ -std=c++17 typed_printf.cpp 編譯並執行 ./a.out 即可得到 flag。

5、Word 文件

------------------------------------------------------------------------------------------------------------

自從加入了 Doki Doki Linux Club (注1),用上了 Linux,D 同學每天都能學到好多新東西。
Linux 好是好,就是沒有 Microsoft Office 系列軟體,導致看學校的各種通知檔案,填申請表等等都變得不那麼方便,上次還差點因此錯過了 7 號的會議。
突然有一天 D 同學的一個朋友告訴他,其實新版 Office 的檔案格式是公開的!
D 同學非常高興,公開的檔案格式或許意味著可以自己寫程式來讀取和編輯內容,再也不用切換系統或者開虛擬機器了。
D 同學追問這個朋友:那麼這個檔案格式具體是怎麼樣的呢?
朋友傳來一個 OfficeOpenXML.docx。

------------------------------------------------------------------------------------------------------------

我說了,考搜尋引擎是難不倒我的哈哈哈……
write-up:這道題是一道非常簡單的題目,主要是想讓同學們瞭解一些檔案格式的常識。
解法
根據題目中的提示,下載 word 檔案,開啟提示損壞,修復後可以看見維基百科上關於 Microsoft Office 系列檔案格式的介紹。
注意到:
一種以XML為基礎並以ZIP格式壓縮的電子檔案規範
將檔案字尾名改為 .zip 或直接強行解壓,開啟解壓後的檔案,可以得到 flag.txt,去掉換行之後即為答案。
cat flag.txt | tr -d '\n'
flag 為:flag{xlsx,pptx,docx_are_just_zip_files}
不僅是 docx,還有 xlsx, pptx等的本質都是 zip 壓縮包。

6、貓咪銀行

------------------------------------------------------------------------------------------------------------

這也是貓咪佔領世界的計劃之一,通過開設貓咪銀行出售 flag 來學習人類割韭菜的技巧。

------------------------------------------------------------------------------------------------------------

出這道題的人是惡魔吧。。。完全沒有思路(自閉ing
write-up:歡迎來到貓咪系列題目之貓咪銀行。
這道題是一道非常簡單的題目,主要是想讓同學們瞭解一些整數溢位的坑。
本題的原始碼和分析將很快釋出,下面只是解題方法。
解法
簡單來說,只需要現兌換 TDSU,購買理財產品,購買時精心構造使得時間溢位為負或者是浮點數,而收益非常大即可。
一個 payload 是:image-20181016123310265

然後時間為負,直接取出即可:image-20181016123347955image-20181016123406691

最後換回 CTB,購買 flag,計劃通!
flag: flag{Evil_Integer._Evil_Overflow.}

7、黑曜石瀏覽器

------------------------------------------------------------------------------------------------------------

請使用最新版黑曜石瀏覽器(HEICORE)開啟。

------------------------------------------------------------------------------------------------------------

這道題真真是太有意思了,我先是學會了改UA,還學會了檢視網站原始碼……
write-up:歡迎大家來到本次比賽的明星題目——黑曜石瀏覽器,這道題目是一道非常簡單但是很有趣的題目。
首先開啟題目,發現提示"請使用最新版本黑曜石瀏覽器(HEICORE)訪問"。
所以我們的思路就是偽裝自己是黑曜石瀏覽器。
解法
上網搜尋“黑曜石瀏覽器 HEICORE”,除了百度以外的所有搜尋引擎幾乎都能找到該瀏覽器的官網:heicore.com。
我們開啟把玩一陣,發現下載,登陸,註冊都是無效的。
而且這個瀏覽器主頁還做了很多噁心人的限制,比如禁用了快捷鍵,開啟控制檯就會崩潰,偽造了當前頁面的地址為 index.php(其實是 index.html)。
不過我們可以直接通過直接瀏覽原始碼來檢視這個頁面是怎麼判斷我們是不是黑曜石瀏覽器。
方法一:view-source
在 Chrome 瀏覽器位址列中輸入:
view-source:https://heicore.comimage-20181016121046272

可以找到判斷 User-Agent 的核心邏輯,就是判斷 User-Agent 是否為:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) HEICORE/49.1.2623.213 Safari/537.36
User-Agent(UA) 是每個瀏覽器最大的不同的特徵,所以可以猜測題目中的 FLAG.txt 需要我們以這個 UA 來訪問。
方法二:curl
curl https://heicore.com
和檢視原始碼是一樣的效果。
然後就是嘗試使用這個 UA 訪問 FLAG.txt。
方法一:使用 Chrome 控制檯image-20181016121448185

點選左上角那個手機平板圖示,然後:image-20181016121600175

通過 Edit 新增一個叫做 HEICORE 的裝置:image-20181016121711381

UA 就填剛才得到的 UA。
然後回到頁面,選擇這個 Device,重新整理即可(注意此時不要關閉控制檯視窗)。image-20181016121811337

方法二:curl
curl http://202.38.95.46:12001/ -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) HEICORE/49.1.2623.213 Safari/537.36"
即可得到 flag。
flag: flag{H3ic0re_49.1.2623.213_sai_kou}

8、回到過去

------------------------------------------------------------------------------------------------------------

那些發明Unix作業系統的大叔們怎麼編輯文字檔案呢?
據記載,他們使用一種叫做ed的神奇編輯器,而Unix Hater's Handbook對此有生動的描述:
Ken Thompson has an automobile which he helped design. Unlike most automobiles, it has neither speedometer, nor gas gauge, nor any of the other numerous idiot lights which plague the modern driver. Rather, if the driver makes a mistake, a giant “?” lights up in the center of the dashboard. “The experienced driver,” says Thompson, “will usually know what’s wrong.”
也許是八十年代的某天,調皮的Lawrence正在使用他的DEC VT終端連線到一臺大型Unix主機編輯檔案——他是個機靈的傢伙,使用ed的時候從不需要看螢幕的輸出。只看他正在用ed寫本題的flag。寫了半天,興高采烈的Lawrence接了個電話,關上ed才發現自己沒有儲存。
聰明的你能根據對他鍵盤的記錄,還原出你要找的flag嗎?
info ed 命令對於沒有使用過ed的你是十分有用的。
Hint1:有多個字串的話,就從上到下連成一行提交就好啦。
Hint2:flag只接受數字和字母。

------------------------------------------------------------------------------------------------------------

這道題有毒吧,我開始明明做對了的說……然後害我查遍了網上所有ed編輯器的資料也沒找到問題所在……qwq
write-up:背景和題目設定
一道簡單題目,考察選手對 Unix 環境基本操作的熟悉程度,和對輸入輸出重定向等的基本理解。 靈感來源於 Unix Hater's Handbook,這也是小 L 同學第一次知道還有 ed 這個鬼畜編輯器。事實上,當你把環境變數 $TERM 設定為一個 terminfo 中沒有的終端型別時,比如
export TERM=vt233
那麼各種牛鬼蛇神編輯器就都不太能正常工作了——比如新手友好的 nano:
Error opening terminal: vt233.
不過友好的 Vim 會猜測你的終端是 ansi,繼而在你的終端模擬器上執行。但如果你的終端模擬器是一個毫不解析控制字元的傻終端呢? 除了用 cat 編輯檔案,你還可以用 ed。
ed 雖然已經埋入歷史的塵埃,但是它還是 Single Unix Specification 的一部分。
一個典型的解題思路
第一步,看到題面上的提示:*忘記儲存檔案 *、*ed 編輯器 *、info ed、給定輸入序列 第二步,去看看 info ed:
首先,*ed * 是一個 Line Editor(行編輯器),這意味著使用者進行的編輯操作無法在螢幕上得到所見即所得的反饋。*ed * 在記憶體中維護一個緩衝區,使用者所有的修改都會存在緩衝區中,直到 * w filename * 命令將其寫入檔案。
a 命令用於向緩衝區的末尾加入文字,以單獨一行的 .(英文句點)作為結束輸入的標誌。
,p 命令可以向螢幕輸出緩衝區的內容。 2 (一個單獨的行號)用於選擇需要修改的行。 s/old/new 可以替換選擇行中的 old 為 new。 2m3 (行號 m 行號)命令可以將第 2 行挪到第 3 行後面。特別的,2m0 表示把第二行放在第一行前面。 q 命令用於退出 ed 編輯器。 值得注意的是 ed 獨特的報錯方式:一個大大的 ?。特別的,一個緩衝區沒有儲存的 ed 需要兩個 q 命令才可以退出,第一個 q 命令的結果是一個大大的 ?。
第三步,繼續看題目的 input_sequence:
q
ed
a
flag{
.
a
44a2b8
a3d9b2[ESC]c
c44039
f93345
}
.
2m3
2m5
2m1
2
s/4/t
q
q
前面的 q 和 ed 是上一次 ed 會話的殘留,我們應該先刪去。 然後發現他沒有儲存,所以刪去末尾的 q,加上 w flag.txt,變成這樣:
a
flag{
.
a
44a2b8
a3d9b2ESCc
c44039
f93345
}
.
2m3
2m5
2m1
2
s/4/t
w flag.txt
q
並且執行
ed input_sequence && less flag.txt
得到 flag.txt 如下:
flag{
t4a2b8
c44039
f93345
a3d9b2ESCc
}
發現一個神祕的 ESCc,那是什麼?那其實是一個 轉義序列,用來控制終端的行為。在本例中為清屏。值得注意,ESC 並不是三個普通的字母,而是一個不可列印字元,而 less 為了向用戶顯示,所以寫成 ESC,並且用白底標出。所以,如果你直接執行
cat flag.txt
你將不能看到完整的 flag。 所以,本題的 flag 是 flag{t4a2b8c44039f93345a3d9b2}。
可能最後的 Escape Sequence 有些小坑,但是沒有這一道小彎彎不就不 DEC VT 終端 了?(大霧

9、我是誰

------------------------------------------------------------------------------------------------------------

高中的時候,為了提高作文成績,小 T 買了一本關於哲學的大眾讀物。雖然到最後,書確實是差不多看完了,但是並沒有什麼用。
在他看完這本書之後的某一天,小 T 做了一個夢,他夢見自己變成了一臺伺服器。作為閱讀那本書的後遺症(之一),他不禁開始思考生命的本源之類亂七八糟的問題。到最後,他在糾結的,只有一件事情:
「我是誰?」

------------------------------------------------------------------------------------------------------------

這道題真是太“哲學”了,我完全沒有思路……直接放棄了
write-up:大家好,我是小 T,聽說這幾天你們都在找我,希望與我一起討論哲學與文學(大誤)。首先非常感謝大家參與 hackergame 2018,這是我第一次為這樣的比賽出題,有這麼多人回答出了我的題目,我感到非常感動。
廢話不多說了。接下來是「我是誰」的 writeup。
這道題是在 hackergame 題目準備末期出的,因為需要一些簡單的題目。靈感來源是我在大一上半學期的時候,在「計算機導論」(大致是計算機的簡單概念入門課程)課上玩手機的時候——那時候剛好在講網路——看到了維基百科的 HTTP Status Code 的頁面,發現裡面有一個非常搞笑的程式碼,就是你們在這道題裡面看到的 418 I'm a teapot。
這就是第一小題(哲學思考)的題解,其實只要在頁面上開啟開發者工具,在 Network 部分就能看到解答了(致萌新:如果你什麼都沒看到,重新整理一下頁面)。只要輸入的內容小寫之後包含 teapot 這個單詞,就能拿到 flag,這裡我根本沒有打算為難別人。(不過可以試試輸入 coffee 會發生什麼)
至於第二小題的話……Can I help me?

其實本來是沒有第二小題的,但是有人希望我實現 HTCPCP-TEA,於是就……
頁面提醒嘗試用其他的 methods 來請求頁面。我承認這裡確實需要一點點腦洞……這裡的 method 其實是指 Request method,直接點選連結的話使用的是 GET 來連線的。不過如果你嘗試用 POST 來請求頁面的話,會有非常清楚的提示:
The method "POST" is deprecated.
See RFC-7168 for more information.
去讀 RFC-7168 就行了。根據:
To this end, a TEA-capable pot that receives a BREW message of content type "message/teapot" MUST respond in accordance with the URI requested, as below.
最終使用 BREW 請求頁面,且帶上 Content-Type: message/teapot 請求頭的時候,頁面會在 Alternates 響應頭給出真正可以泡紅茶的 URL。用相同的方式請求那個 URL,就能獲得第二個 flag。(其實還隱藏著一些彩蛋,可以試試)
嗯?你說不知道怎麼請求?傳送特定請求的方式有很多,這道題中可以使用的一種方式是使用 curl 的 -I, -X 和 -H 引數來完成。具體內容可以檢視 man curl。用 BurpSuite 等工具,甚至是 Firefox 的開發者工具改請求也都是可以的。
其實第二小題的協議實現還可以再逼真一些,但是出於 Flask 的限制,加上時間有一些倉促,所以沒有實現,不然這道題還可以更真(qiàn)實(biǎn)得多。至於有人問是否有實現了 HTCPCP-TEA 的茶壺手辦嘛……反正我是沒有,不過我很期待有人能做出來。

10、家裡有礦

------------------------------------------------------------------------------------------------------------

提示:
1. 本題的瀏覽器“挖礦”只為演示性目的,幾乎不佔資源。我們不會以任何形式盜取或浪費大家電腦的算力。
2. 本題如果使用程式求解,對於普通配置的個人電腦,在解法正確且最優的情況下,求解程式的期望執行時間不會超過幾分鐘。
Z 同學為了趕上區塊鏈的熱潮,自己潛心研究工作量證明(Proof of work)演算法,並且釋出了三種全新的電子貨幣。不僅如此,他還寫了一個礦池。
給專業選手的註釋:此題並非 web 題,解題過程不涉及注入、XSS、敏感檔案洩露、弱型別等安全問題。

------------------------------------------------------------------------------------------------------------

完全不會。
write-up:這道題是我出題花費時間最多,也是我最喜歡的一道題目。我暑假期間編寫題目網站、調節每種 Hash 演算法的難度、寫解題程式碼、與其他人討論是否有非預期解法等等,前前後後花了很多天的時間。
我知道好多人都在等著看這道題的 write-up。我會在這篇 write-up 裡把我出題和解題思路的所有細節都講一遍,包括如何估計期望的窮舉時間。可是比賽結束之前看樣子是寫不完了。現在我只寫了大概的解題思路,我會在一兩天之內把細節補充完整,請大家耐心等待,謝謝大家的理解。
大概的解題思路(未完待續)
所謂我發明的新的工作量證明演算法,就是伺服器給出一個字尾 suffix,我需要生成兩個隨機字串 nonce1 和 nonce2,使得 hash(nonce1+suffix) 和 hash(nonce2+suffix) 相同的二進位制位數量超過某一個值,這個值對於不同的 Hash 演算法是不一樣的
SHA1
直接在 Google 搞出來的 sha1 碰撞 那兩個 pdf 後面加上 suffix 提交即可,因為是 Hash 碰撞,所以所有二進位制位都是相同的
MD5
這次使用已有的 md5 碰撞加上字尾會發現不給你 flag 了。期望解法有兩種,一種是按照王小云的論文搞出來一個不完全的碰撞(我沒研究),另一種是真的窮舉。
我是用 C 語言寫的窮舉程式。為了偷懶,我在 python 解題指令碼中生成了一堆 md5 寫入一個二進位制檔案,然後呼叫 C 程式來窮舉,C 程式就只需要算異或和統計二進位制位的個數了。在 C 語言中使用 __builtin_popcountll 函式統計二進位制位中 1 的個數,一條 POPCNT 指令就可以統計 64 bit,速度很快,一分鐘之內有很大概率可以跑出來。聽說有的同學還使用了 GPU 窮舉,關於優化這塊大家就各顯神通了。
SHA256
窮舉是不可能的,即使你用大型超算都不太可能在比賽時間內跑出來。所以呢?期望解法是從比特幣的區塊鏈裡面找資料。比特幣的工作量證明演算法是 sha256,現在區塊鏈裡面的每一個區塊雜湊前面都有大約 80 個二進位制 0(多麼瘋狂啊),所以拿它們來找共同 bit 數很多的雜湊值,自帶了大約 40 位的加成(因為本來 80 位在期望上也有 40 位是相同的)。你需要想辦法下載比特幣所有區塊的雜湊,然後兩兩配對來看一下相同的 bit 數量。如果達到了題目要求,就是下載它們的區塊頭部,區塊頭部的兩次 sha256 就是最終的 hash,你需要計算一次 sha256,然後結果就是你要提交的資料。不過,我們還是需要滿足一個字元的 suffix 要求,這個只要你不斷 getjob,總是可以很快拿到你想要的 suffix 的。

11、祕籍殘篇

------------------------------------------------------------------------------------------------------------

Those who bear true belief in flxg shall fear no malbolge!
-- La Divina FLXG Commedia
FLXG 創始人 CWK 修為通玄, 萬古罕有. 至今無敢直呼其名者, 皆以西文縮寫代之.
據 神 FLXG 曲 載, CWK 為探 FLXG 之密, 曾 排空馭氣奔如電, 昇天入地求之遍. 上窮碧落下盡黃泉, 兩處茫茫而無可見. 後其閉關九年, 又仗三尺長劍, 攜一刀生宣, 闖 但丁 舊時幽路. 平荊棘, 暴霜露, 驚惡魑, 斬獄卒, 神鬼莫可當之.
每其行足七千裡也, 元氣化墨, 即為篋囊所藏, 凝之一字, 現諸紙上. 及至伊甸園, 經義已成十萬八千字餘矣. 當是時, 人間科技正高速發展, 上帝不得已, 將 2D 天空貼紙更為 3D, 故而舊道不通. CWK 舉目四望, 但見群星閃爍. 捫參歷井, 方知窮途將歸.
歸來後, 宣紙已自編纂成冊, 即 神 FLXG 曲 (曾藏於滑稽大學博物院, 現已佚失). 其中記載 CWK 種種經歷此處且按下不提. 而 Inferno: Malebolge 一章, 以 Malbolge 語言書成. 雖晦澀難通, 所謂佶屈而聱牙, 然真義無窮, 實乃無上之道法.
江湖餘此殘篇, 而今公示於天下. 可否有所體悟, 且看諸君之造化.

------------------------------------------------------------------------------------------------------------

這道題完全沒找到思路……
write-up:滑稽 Art
TL;DR
質因數分解,新增換行符,縮小字型
詳解
Malbolge 語言是會忽略空格的,可是為什麼 txt 裡面有這麼多空格呢?
用文字編輯器打開發現,這些字元好像有些規律。調小字型大小後發現有明顯的 pattern。
用瀏覽器開啟(firefox 和 chrome 都行,黑曜石也行),調到合適的字型大小,再手動調整寬度,可以看到一個畸變的圖案,不過不影響做題,仍然可以讀出 flxg。很多人提交記錄裡面把大寫 U 看成小寫,估計都是用這種方法做的。
當然官方解法肯定不是這麼做的。
使用 wc 命令統計一下字元數,發現一共有 154012 個位元組。我們應該可以猜到這個檔案是個字元畫,但是換行被去掉了所以變得很難看。使用 factor 或者 yafu 對這個數進行質因數分解,發現 154012 = 2 * 2 * 139 * 277。經驗上,等寬字型字元畫畫素上的長寬比和字元數的長寬比大致在 1 : 2 左右。所以我們猜測,這個字元畫的長寬大概是 556 * 277 或者 574 * 278。
使用 python 或其他語言,每隔這麼多字元列印一次 '\n',在控制檯上能看到非常正宗的滑稽圖案。flxg 赫然醒目。
天書易解
TL;DR
https://www.matthias-ernst.eu/malbolgereverse.html
詳解
其實這道題主要考察選手 Google 能力..。
從出題人的角度,如果要出一道 Malbolge 逆向,出題人會怎麼寫程式碼。
其實這道題的關鍵就在於弄清楚條件判斷是如何實現的。Malbolge 語言沒有條件跳轉語句,所以只能通過跳轉表模擬。弄清楚這一點的話剩下的就是時間問題了。
所以通過搜尋,能找到 Cat halts on EOF 這個程式的原始碼。甚至可以找到 https://github.com/zb3/malbolge-tools/blob/master/samples/src/q.hell 。
通過 HELL IDE 反彙編,可以看到這份程式碼與本題之間的相似程度非常之高。實際上,許多 Malbolge 程式處理 if 判斷的方法基本都是同一份程式碼。
確定本題是由 HELL IDE 編譯的又一方法是觀察程式碼的前幾個位元組。HELL IDE 在編譯的時候會增加一些初始化的程式碼,相當於給記憶體分成程式碼區和資料區。仔細與其他程式比較可以看到明顯的共同點。
另一種預期做法,汙點分析。
可以注意到鍵盤的輸入會相互 ROT 和 CRZ,最終形成一個 Ternary byte,之後的處理就全部基於這個位元組上進行,輸入資料的其他資訊都丟失。所以可以對這個位元組進行爆破,自己寫好偵錯程式之後十分簡單。
(此處省略爆破程式碼)
做出來題目的同學並不期望能拿到 Key,因為這是一個多對一的壓縮過程。這裡給一個可行的 Key: ./;'[]-=0 本題 HELL 原始碼見 flxg.hell 檔案。

12、貓咪遙控器

------------------------------------------------------------------------------------------------------------

提示:flag 格式為 flag{......},只包含字母,其中有且只有兩個為大寫字母。
今天的 App Store 首頁故事是《貓咪佔領世界》(詳情)。
SERIOUSLY?
D 同學不禁開始幻想被貓咪佔領的世界:集中營裡成群的鏟屎官,密密麻麻的 Nepeta cataria(Wikipedia)農田,隨意擺放的紙箱子佔滿了道路……
想想就可怕,不過 D 同學知道人類還有終極祕密武器可以用——貓咪遙控器,有了貓咪遙控器,再多的貓咪也只會乖乖地聽人類的話,哈哈哈哈哈~
下面是製作貓咪遙控器的技術總結,需要的原料有:
5mW 6mm 點狀鐳射二極體一個;
鋰電池一個;
導線若干;
然後用導線將鋰電池和鐳射二極體連線起來(這一步的目的是讓二極體亮起來,不想二極體亮起來的同學可以不連),一個美味的貓咪遙控器就做好了。
貓咪遙控器的原理非常簡單!擼貓學會曾經有論文給出過結論:鐳射筆指向哪裡,貓咪就會跑到哪裡。
為了報復貓咪把自己的程式碼打亂(見:貓咪與鍵盤),D 同學把貓咪遙控器綁在可以上(UP)下(DOWN)左(LEFT)右(RIGHT)移動的三軸機械臂上,開始使用樹莓派(一款基於 Linux 的微控制器計算機)控制三軸機械臂,進而控制貓咪在草地上跑來跑去。
附件是樹莓派上留下的除錯輸出資訊,我們趕到現場時只剩下這個了。

------------------------------------------------------------------------------------------------------------

我其實想到了……都是我沒有寫出程式qwq,而且畫圖不標準……就放棄了
write-up:歡迎來到貓咪系列題目之貓咪遙控器。
這道題是一道非常簡單的題目,主要是想讓同學們學會一些程式畫圖的技巧。
根據題目提示,我們需要將控制序列畫出來,並且我們根據常識和題目提示,能知道:
UDLR 分別代表:上(UP)下(DOWN)左(LEFT)右(RIGHT)。
解法一:傳統而可靠的辦法
找一張紙(需要比較大的),花一下午即可。
解法二:使用 JS Canvas
我覺得這是最簡單的一個辦法,程式設計和解題都藉助常見的瀏覽器(比如 Chrome)即可完成,我的解題程式碼如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Cat Controller</title>
<style>
#path {
border: 1px solid #000000;
}
</style>
</head>
<body>
<canvas id="path" width="1200" height="300"></canvas>
<script>
var seq = "DDDDDDD...DDDLLLLLLLL"; // 題目中的序列
var ctx = document.getElementById('path').getContext('2d');
var x = 0, y = 0;
function move(type) {
switch (type) {
case 'U': y -= 1; break;
case 'D': y += 1; break;
case 'L': x -= 1; break;
case 'R': x += 1; break;
}
ctx.fillRect(x, y, 1, 1);
}
for (var i = 0; i < seq.length; i++) {
move(seq[i]);
}
</script>
</body>

 

把上面的程式碼儲存為 remote.html,用瀏覽器開啟即可得到路徑:image-20181016114941390

flag: flag{MeowMeow}

13、她的詩

------------------------------------------------------------------------------------------------------------

高中時候語文作文從未寫滿過 50 分的小 T,可能是腦子哪裡抽了吧,考上大學之後竟然報名加入了學校的文學社。雖然小 T 寫作真的很糟糕,但每週的作品分享會上,他還是堅持與他人一起分享創作,並且看上去……他似乎還是很開心的。
這一週,當小 T 還是像往常一樣拿出自己的創作時,她走了過來,遞給小 T 一張紙。這是她新寫的詩嗎?可為什麼,紙上全是一些奇奇怪怪的字元?
「這是,什……什麼東西啊?!」
她一言不發,只是在離開時,她回過頭來,小聲說道:
「我要提醒一下你,只糾結於字面意思是很費勁的,而且……你不會得到任何有用的結論。」

小 T 的友人,在聽聞這件事情後,經過一段時間的分析,找到了這首詩的編碼,並且幫他寫了一個很短的程式來解碼。只是……從解碼出的內容來看,事情遠沒有他們想像得那麼簡單。
你能找到她想傳達的真正的資訊嗎?

------------------------------------------------------------------------------------------------------------

我讀了好久詩……(自閉)
write-up:當我得知這道題出現了非預期解時,我的內心是崩潰的。如果您是用非預期解完成的題目(表現為:得到了 flag,但完全不知道為什麼),請先查詢資料,思考一下為什麼會存在這個非預期解,然後繼續看這篇 writeup。順便想給某站點的站長致以親切友好的問候。
預期題解
執行 helper.py 可以得到詩的內容,但比較明顯的事情是,重點不在這個指令碼可以解碼出的詩上——如果是的話,我沒有必要再去繞一大圈編碼再寫解碼指令碼發給你;而且題幹裡面也是有暗示的。
「我要提醒一下你,只糾結於字面意思是很費勁的,而且……你不會得到任何有用的結論。」
我都這麼說了啊……
helper.py 裡面的 begin 666 <data> 是什麼?搜尋引擎可以很快告訴你,這是 uuencoding 編碼。可以看到,這個指令碼將檔案的每一行當作一個被 uuencoding 編碼後的檔案進行解碼。如果你去試一下,會發現一大部分明文行重新編碼之後獲得的字串和原檔案在末尾的地方不一樣。那麼很明顯,這裡有問題。
Uuencoding 編碼的結構是這樣的:
<length character><formatted characters><newline>
第一個是長度字元,通過長度 + 32,再轉成 ASCII 的方式出現(比如說,有 3 個字元,就是 chr(3 + 32),即 #)。之後每三個位元組(字元)為一組,以如下的方式編碼:Uuencoding 編碼方式

(摘自維基百科對應頁面)
但不是每一行的字元都是 3 的倍數,那麼如果最後一組沒法填充的話(即長度乘 4 模 3 不為 0),那麼對應部分就會填 0。那麼我們想要隱藏的東西能不能就這樣塞在填 0 的部分裡面呢?答案當然是可以的,不然就沒有這道題目了。
獲得 flag 的做法中其中一種是一行一行用位運算的方式把 flag 的每個位元拼起來;另一種特定於這道題的方式是:直接擴大每行第一個長度字元到正確的值,具體的原因見下。
非預期題解
那麼非預期題解是怎麼回事呢?在出題的時候,因為 flag 很長,為了讓「詩」短一點,把所有能用的位元都用上了,但是:
如果最後一組只有一個字元,那麼最多能填 16 位。
只有兩個的話,就是 8 位。
發現什麼問題了嗎?它們都是 8 的倍數,即一個字元位數的倍數。在大多數的實現中,解碼都是正常的,但是如果有 uuencoding 解碼的實現忽略了表示長度的第一個字元,並且你找到了這個實現,那麼……就可以無腦獲得 flag。
(對我來講)悲痛欲絕的是,想找到這個不太正常的實現並不難。

這是我出題時候的疏忽,向各位道歉。
修復版本
這是修復了「她的詩」非預期解的版本:https://github.com/taoky/her_poem_fixed_version。如果您用了非預期解完成原題,我強烈建議再試一下我微調後的題目。

14、貓咪剋星

------------------------------------------------------------------------------------------------------------

通知:已釋出備用地址。
眾所周知,貓怕黃瓜

你知道貓咪為什麼怕黃瓜嗎?
有一種說法是這是貓對蛇的原始恐懼,也就是說,如果一個東西足夠像蛇,那麼貓咪就會怕它。
進一步,如果你足夠像蛇,貓就會怕你。
下面我們來扮演蟒蛇(Python)去嚇貓。
蟒蛇是一種非常容易使用的程式語言,考驗你像不像蟒蛇的標準就是給你一些 Python 3 表示式。如果你能正確計算出來,你就通過了驗證。
趕快使用命令 nc 202.38.95.46 12009 來開始吧
備用地址:nc 202.38.95.47 12009

------------------------------------------------------------------------------------------------------------

真的不會,我算了好久……(我30s最多算5個
write-up:歡迎來到貓咪系列題目之貓咪剋星。
這道題是一道非常簡單的題目,主要是想讓同學們學會一些 Python 程式設計技巧。
TODO:連線遠端伺服器的若干種方法、如何通過替換庫函式解題
先貼上解題程式,明天補細節

#!/usr/bin/env python3 -u
import sys
tricks=[
"__import__('os').system('find ~')",
"__import__('time').sleep(100)",
r"print('\x1b\x5b\x33\x3b\x4a\x1b\x5b\x48\x1b\x5b\x32\x4a')",
'exit()'
]
def removetricks(s):
for t in tricks:
s = s.replace(t,'None')
return s
input()
for i in range(100):
print(i, file=sys.stderr)
expr = input()
print(expr, file=sys.stderr)
ans = eval(removetricks(expr))
print(ans, file=sys.stderr)
print(ans)
print(input(), file=sys.stderr)

 

以上儲存為 sol.py 然後執行 socat exec:./sol.py tcp:202.38.95.46:12009 即可

15、貓咪電路

------------------------------------------------------------------------------------------------------------

#大蒜日報社 科大分社 電
10 月 4 日,膨脹社的一篇報道在科技圈引起了軒然大波,據膨脹社報道:芒果,亞驢遜,超巨等多家公司被一個不到鉛筆尖大小的西恩晶片植入了後門,其中客戶不乏有米國政府敏感部門。
同時,膨脹社報道中提到的所有公司(芒果,亞驢遜,超巨)等都在極短的時間內積極予以否認:我不是,我沒有,別瞎說啊.jpg
一方面是經過膨脹社 2000 名記者和多層編輯花了十幾個月來組稿的報道,另一方面是罕見的多家大公司的駁斥,這其中的真真假假,吃瓜群眾根本看不透。

雖然我們目前還沒有搞到這個晶片的樣本(搞到之後可能會加一道新題),但是我們準備了一個簡單的紅石電路給你逆向。
為了避免重新發明一個電路模擬器,我們使用了 Mojang AB 公司一款帶有電路功能的著名沙盒式建造遊戲 Minecraft 存檔作為本題目的解題資料。
技術上來說,我們通過 Minecraft (版本:1.12.2) 存檔提供了一個 40 個輸入的紅石電路,他們共同影響著信標的顏色,如果你通過調整輸入,成功使得信標變綠,說明你已經破解了這個電路,請以 flag{1010101010100010...0101010} 的格式提交你的答案(1 代表啟用,0 代表不啟用)。
進入 Minecraft 之後的溫馨提醒:
為了防止你沒有紅石電路基礎,我們在出生地設定了一系列紅石電路教程,希望可以幫上忙;
為了防止你問這道題和貓咪有什麼關係,我們在出生地放了一隻貓(並且已經馴服);
按 / 鍵可以鍵入控制檯命令,但是請不要鍵入 /kill,因為這樣你會死;
請不要通過 /gamemode 0 把自己的模式改為生存模式,否則你的電路會被苦力怕炸燬;
請在解題結束後及時關閉該沙盒式建造遊戲,否則你會花很多額外的時間;

------------------------------------------------------------------------------------------------------------

mc什麼的最簡單了,我一下子就做完了!
write-up:歡迎來到貓咪系列題目之貓咪電路。
這道題是一道非常簡單的題目,主要是想讓同學們學會一些電路逆向技巧。
基本概念:
紅石元件:(引用部分來源:minecraft wiki)
紅石元件能夠接受紅石訊號並作出反應(例如移動、發光等),例如活塞、紅石燈、發射器等。紅石元件是在紅石電路里具有一定使用目的的方塊,大致分為三個大類,部分電路提供能量來源,例如紅石火把、按鈕、拉桿、紅石塊、壓力板等。
電源為整個電路或部分電路提供能量來源,例如紅石火把、按鈕、拉桿、紅石塊、壓力板等。
傳輸線將電能從電路的一部分傳遞到另一部分,例如紅石粉、紅石中繼器、紅石比較器等。
機械接受電能並作出反應(例如移動、發光等),例如活塞、紅石燈、發射器等。
充能:
紅石元件與部分方塊能夠被充能或解除充能。如果說一個方塊被“充能”了,則這個方塊就可以作為電源,能向毗鄰的“用電”方塊供電以使其工作。(“毗鄰”是這樣定義的:一個方塊是正方體,正方體有6個面。也就是說與一個方塊的任意一個面接觸的方塊最多可能有6個,稱之為“與該方塊毗鄰的方塊”)。
當非透明方塊(例如石頭、砂岩、泥土等)被電源 (或是中繼器、比較器)充能,我們稱這個方塊被強充能了(這個概念與充能等級不同)。強充能的方塊可以啟用毗鄰的紅石線。絕大多數電源可以強充能自身。
當非透明方塊僅被紅石線充能,我們稱這個方塊被弱充能。被充能的方塊(無論強度如何)都可以影響毗鄰的紅石元件。不同的元件產生的反應不同。您可以檢視這些元件的具體描述。
沒有不透明的方塊可以直接為另一個不透明方塊充能,因為中間必須有紅石粉或其他紅石元件。透明方塊不能被任何東西充能。“強”與“弱”充能僅適用於不透明的方塊,而不適用於紅石粉或其他紅石元件。
被充能的方塊(強或弱)會影響相鄰的紅石元件。不同的紅石元件對其反應有所不同。
傳輸:
火把高塔與火把梯:紅石火把能夠充能其上方的方塊與相鄰的(包括下方的)紅石線,這樣,縱向傳輸便成為可能(向上與向下的設計不同)。
“中繼”訊號指的是將訊號加強到完全訊號強度。最簡單的方法就是使用紅石中繼器,包括如下變種:
瞬時中繼器: 在不引入延遲的情況下中繼訊號。
雙向中繼器: 可以從來回兩個方向中繼訊號。
“二極體”指只允許訊號單向傳輸的電路,通常用於防止電路反向干擾引起的狀態改變或延遲紊亂,也可以用於防止大型電路中的線路彼此串擾。常用的二極體包括紅石中繼器、一格高的熒石與無法向斜下方傳輸訊號的倒置臺階。
很多電路已經具有單向性,因為它們的輸出端不會接受輸入訊號,例如以附著在方塊側面的紅石火把作為輸出的電路。
邏輯電路:
有時,你需要判斷輸入訊號,經過一定的演算法產生一個輸出。這類電路即為人們耳熟能詳的邏輯閘(“門”只讓滿足“邏輯”的訊號輸出)。
本題目即為使用邏輯電路,將選手輸入的 40 位訊號轉換成為一位訊號,用該訊號驅動活塞移動染色玻璃,達到使信標變色的目的。
邏輯閘:
與門:兩個輸入訊號均為真時輸出為真,其餘為假
或門:兩個輸入訊號均為假時輸出為假,其餘為真
非門:將輸入訊號反向(即真變為假,假變為真),(由於紅石火把附著方塊被充能時紅石火把會熄滅,因此使用紅石火把構建非門。)
異或門:兩個輸入訊號相同時輸出訊號為假,相異時為真
同或門:兩個輸入訊號相同時輸出訊號為真,相異時為假
與非門:兩個輸入訊號均為真時輸出為假,其餘為真
或非門:兩個輸入訊號均為假時輸出為真,其餘為假
邏輯閘在紅石電路中的構建在題目出生點均有演示,minecraft wiki 中也有說明
題目解析:circuit
電路採用樹形結構,每四個輸入訊號一組,將每組訊號內部的四個輸入訊號作運算,再將十組的輸出訊號之間進行運算得到最終控制信標顏色的訊號。
因此較為簡便的解法是對每組分別求解。可以通過控制信標顏色的最終訊號推導每組的輸出訊號,再對每組內部進行分析,求出使得該組輸出訊號正確的輸入組合,然後順序拼接得到 flag.
flag{0110101000111100101111111111111111111010}

(未完待續)