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

中國科學技術大學第五屆信息安全大賽(hackergame2018自我總結)

python3 編譯 fill 解碼 問答 與他 methods c 語言 出現

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

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

1、簽到題

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

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

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

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

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

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

解法二:審查元素
使用 Chrome 瀏覽器,在輸入框上右鍵點擊審查元素(Inspect)可以看到:技術分享圖片

一個叫做 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:

技術分享圖片

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

4、貓咪和鍵盤

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

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

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

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

我們的思路也很簡單,就是先以“若幹列”為單位將代碼還原。
第一步:打印代碼;技術分享圖片

第二步:裁剪代碼;技術分享圖片

第三步:我編不下去了……技術分享圖片

當然,只要足夠有耐心,這個方法確實是原始而可靠的。
解法二:文本編輯器的進階技巧
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 是:技術分享圖片

然後時間為負,直接取出即可:技術分享圖片技術分享圖片

最後換回 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.com技術分享圖片

可以找到判斷 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 控制臺技術分享圖片

點擊左上角那個手機平板圖標,然後:技術分享圖片

通過 Edit 添加一個叫做 HEICORE 的設備:技術分享圖片

UA 就填剛才得到的 UA。
然後回到頁面,選擇這個 Device,刷新即可(註意此時不要關閉控制臺窗口)。技術分享圖片

方法二: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,用瀏覽器打開即可得到路徑:技術分享圖片

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),即 #)。之後每三個字節(字符)為一組,以如下的方式編碼:技術分享圖片

(摘自維基百科對應頁面)
但不是每一行的字符都是 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 中也有說明
題目解析:技術分享圖片
電路采用樹形結構,每四個輸入信號一組,將每組信號內部的四個輸入信號作運算,再將十組的輸出信號之間進行運算得到最終控制信標顏色的信號。
因此較為簡便的解法是對每組分別求解。可以通過控制信標顏色的最終信號推導每組的輸出信號,再對每組內部進行分析,求出使得該組輸出信號正確的輸入組合,然後順序拼接得到 flag.
flag{0110101000111100101111111111111111111010}

(未完待續)技術分享圖片

中國科學技術大學第五屆信息安全大賽(hackergame2018自我總結)