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

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

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

一、簽到題python

------------------------------------------------------------------------------------------------------------ios

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

------------------------------------------------------------------------------------------------------------git

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

write-up:這道題目是我設置在 Hackergame 2018 中的第一道題,其目的只是想更精確的統計一下參賽人數,然而沒想到本題也成爲了本次比賽中命題組給出最多答覆次數的題目。
回到題目自己,這道題目有一個輸入框,根據提示須要輸入 hackergame2018,然而細心的同窗已經發現了,不管是經過輸入仍是粘貼的方法都會缺乏一個數字 8。image-20181016015633115github

解決問題的方法至少有如下幾個:
解法一:觀察地址欄
Hackergame 須要視力!只須要觀察到地址欄中 ?key=hackergame201 ,將其改成 ?key=hackergame2018 並回車就能夠獲得 flag。image-20181016015820553web

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

一個叫作 maxlength="13" 的東西,咱們雙擊它,修改成大於等於 14 的數字或刪除便可。
最後獲得 flag:flag{Hackergame2018_Have_Fun!}

 

二、貓咪問答

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

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

爲了避免被罵,鏟屎官不再敢問任何問題了,下面這些簡單的問題,也只能你本身來搜索解決。

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

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}

三、遊園會的集章卡片

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

提示: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}

四、貓咪和鍵盤

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

謹以此題,獻給全部被貓破壞的代碼。
衆所周知,貓咪最喜歡鑽紙箱和趴鍵盤,其中鑽紙箱沒有太大的社會危害性,而趴鍵盤則是對人類的毀滅性打擊。
(想象一下這裏配了貓鑽紙箱和趴鍵盤的圖)
寫到一半的代碼離奇消失,僅剩的代碼也被搞得亂七八糟,憤怒的 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。

五、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 壓縮包。

六、貓咪銀行

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

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

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

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

而後時間爲負,直接取出便可:image-20181016123347955image-20181016123406691

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

七、黑曜石瀏覽器

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

請使用最新版黑曜石瀏覽器(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}

八、回到過去

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

那些發明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 終端 了?(大霧

九、我是誰

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

高中的時候,爲了提升做文成績,小 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 的茶壺手辦嘛……反正我是沒有,不過我很期待有人能作出來。

十、家裏有礦

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

提示:
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 的。

十一、祕籍殘篇

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

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 文件。

十二、貓咪遙控器

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

提示: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}

1三、她的詩

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

高中時候語文做文從未寫滿過 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。若是您用了非預期解完成原題,我強烈建議再試一下我微調後的題目。

1四、貓咪剋星

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

通知:已發佈備用地址。
衆所周知,貓怕黃瓜

你知道貓咪爲何怕黃瓜嗎?
有一種說法是這是貓對蛇的原始恐懼,也就是說,若是一個東西足夠像蛇,那麼貓咪就會怕它。
進一步,若是你足夠像蛇,貓就會怕你。
下面咱們來扮演蟒蛇(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 便可

1五、貓咪電路

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

#大蒜日報社 科大分社 電
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}

(未完待續)

相關文章
相關標籤/搜索