歡迎前往個人主頁享受更優質的瀏覽體驗。https://yof3ng.github.io
中科大-Hackergame2018 write-up
這個比賽主要面向新生,較為友好,鏈接:https://hack.lug.ustc.edu.cn/
此場比賽充滿了貓咪與flxg(廢理興工),雖然作為一個老臘肉去做小鮮肉的題很不好意思,但該做的還是要做啦。
簽到題
打開題目鏈接之后,題面如下圖:
Key的輸入框限制了長度,通過開發者工具修改頁面源碼,或者抓包發送 hackergame2018獲取 flag:
The flag is: flag{Hackergame2018_Have_Fun!}
貓咪問答
這一題雖然表面上是對中科大新生有優勢,但是實際上是個社工題。考驗學生的搜索能力,信息收集能力。畢竟信安肯定是要跟這個打交道的啦。簡單搜索(百度,必應,谷歌)一下,提交得到flag:
flag{G00G1E-is-always-YOUR-FRIEND}
游園會的集章卡片
這一題實際上考驗學生的拼圖能力,只不過是花的實時間長短而已,需要注意的就是字母和數字的分辨,可能有的其他題目會需要一個前面的過程來獲取到零碎的圖片,再到這一步拼圖。拼完圖可以得到flag:
flag{H4PPY_1M4GE_PR0CE551NG}
貓咪和鍵盤
題目是一份經過了亂序處理的代碼,雖然說是亂序,但還是有一定規律的,比如說可以看出跟列有關系,某列整體移到另一個位置之類的。
簡單來說,要還原整個項目是不太可能實現的,所以我們需要根據出題人給我們的路,認真抉擇,然后行動。比如源碼首部的author,name,url等信息,可以谷歌得到項目的一部分源碼,再還原一部分關鍵性的代碼,理解邏輯即可。
根據name,author可以在搜到位於github的項目源碼,前一部分自定義函數是相同的,主函數不同,我們還原一下ABC,BAC,CAB:
ABC:FfQ47if9Zxw9jXE68VtGA
BAC:JDk6Y6Xc88UrUtpK3iF8p
CAB:7BMs4y2gzdG8Ao2gv6aiJ
根據主函數邏輯可以得到flag是像下面這樣拼接的:
printf("%s%s%s%s %s%s%s%s%s%s%d %s%d%s","f","l","a","g",ABC,"",BAC,"",CAB,"}","type_printf","_","}")
flag{FfQ47if9Zxw9jXE68VtGAJDk6Y6Xc88UrUtpK3iF8p7BMs4y2gzdG8Ao2gv6aiJ125type_printf92}
Word 文檔
這題的話主要是給新生擴充一個知識點:office套件實際上都屬於zip壓縮包,將后綴改為zip就能以壓縮包的形式打開office文檔,然后看見其文件結構。
貓咪銀行
又是一通過非法獲取錢財買flag的題目呢,經過簡單的嘗試輸入后發現沒什么特殊的漏洞,不能以科學計數(如 0e516516)的方式作為切入點,改cookie只能重置賬戶,買1/4個flag跟沒買似的。
仔細看可以發現,理財時間有下限,但是沒有上限,先兌換TDSU,輸一個大數試試看,oh一不小心就溢出了:
但是我們需要控制溢出的收益,不然收益為負,夠你受的了。通過控制輸入的大數的大小來調節:922337203685477500
The flag is:
flag{Evil_Integer._Evil_Overflow.}
護網杯中那個辣條之王溢出的題比較精妙,需要通過條件競爭的手法(即多線程同時購買,同一時間多次購買只需要一次付錢),再判斷溢出點,從而getflag:題解 https://qingchenldl.github.io/2018/10/13/護網杯WP-BitPwn/?tdsourcetag=s_pcqq_aiomsg
黑曜石瀏覽器
這就是那個坑到無數老少爺們,一時風頭無倆的黑曜石瀏覽器(HeiCore),確實出題人比較良心,為這個題目甚至專門寫了一個前端頁面來迷惑各位CTFer,這個黑曜石瀏覽器主頁是在百度上不能搜索到的,在必應和谷歌上可以查到,很明顯這個頁面很不正經,簡直是在嘲笑各位CTFer的智商嘛是不是?
好回到題目,實際上我們也做了比較久,嘗試過各種方法之后回到了原點:黑曜石瀏覽器主頁,這個主頁除了假正經之外還有就是,不能查看源碼,用谷歌的開發者工具看主頁時會返回404。那么問題已經比較明顯了,這里就是出題人的阻礙,為啥要阻礙,因為關鍵在這里,拿到關鍵的東西之后我們就可以去題目那里獲取flag了。
谷歌用不了我們用火狐嘛,來看看network,看看源碼:
哦嚯,獲得了一個user-agent,題目頁面不是需要通過黑曜石瀏覽器訪問嗎,既然我們沒有黑曜石瀏覽器這個東西,當然也可以通過user-agent來代表我們是黑曜石瀏覽器的身份咯,構造請求,加上user-agnet,getflag。
The flag is:
flag{H3ic0re_49.1.2623.213_sai_kou}
回到過去
#input_sequence
q
ed
a
flag{
.
a
44a2b8
a3d9b2c #關鍵在這一行最后的c是保留不保留
c44039
f93345
}
.
2m3 #開始換行
2m5
2m1
2 #切換到第二行
s/4/t #將當前行的第一個4替換為t
q
q
這一題介紹了一下ed編輯器的使用,給出了一個文件如上,里面有鍵盤記錄,實際上根據鍵盤記錄,利用ed編輯器重寫一遍就可獲得flag,但是這個還是有一個坑點,那就是那個多出來的 ESC特殊符,剛開始在MobaXterm上面自帶的ed做題,發現 2m3之類的換行命令無法實現,后來使用雲服務器進行一波操作得到flag:
flag{t4a2b8c44039f93345a3d9b2}
我是誰
這一題有兩個小題,充滿哲學。考察的是客戶端錯誤相應代碼和 “遞茶”協議。。。
第一題通過查看network,可以看到status code里面有
418 I AM A TEAPOT
,正好問我是誰嘛,把TEAPOT填進去,getflag1:
flag{i_canN0t_BReW_c0ffEE!}
然后可以獲取第二小題的鏈接,簡單查看一下,響應如下:
#這年頭給大佬遞茶都不簡單了
Brewing tea is not so easy.
Try using other methods to request this page.
#試試post請求,響應如下:
The method "POST" is deprecated.
See RFC-7168 for more information.
#試試brew請求,響應如下:
Please check if there is anything missing in your header.
結合兩題的信息 I AM A TEAPOT + brew tea + RFC-7168搜索一下,可以得到說明文檔:
https://tools.ietf.org/html/rfc7168
根據文檔構造請求header里面的Content-Type: message/teapot,發送過去得到如下信息:
根據返回的信息,我們需要將構造的請求發送到另一個url,即在原url后面加上遞茶類型black_tea:
/the_super_great_hidden_url_for_brewing_tea/black_tea
getflag:
家里有礦
提示:
- 本題的瀏覽器“挖礦”只為演示性目的,幾乎不占資源。我們不會以任何形式盜取或浪費大家電腦的算力。
- 本題如果使用程序求解,對於普通配置的個人電腦,在解法正確且最優的情況下,求解程序的期望運行時間不會超過幾分鍾。
該題並不是常規的web 題,解題過程不涉及注入、XSS、敏感文件泄露、弱類型等安全問題。
但是我暫時不會,所以待更新。
秘籍殘篇
從這題就開始涉及古文化,玄學知識了。這題也是一個兩小題的題目,第一題給出了一段malbolge語言的代碼在文件中。一個騷操作。。直接用火狐瀏覽器打開文件,然后調整頁面大小(%30),寬度得到以下嘲諷CTFer的圖案:
flxg{University_Ridiculous}
第二題待更新。
貓咪遙控器
為了報復貓咪把自己的代碼打亂(見:貓咪與鍵盤),D 同學把貓咪遙控器綁在可以上(UP)下(DOWN)左(LEFT)右(RIGHT)移動的三軸機械臂上,開始使用樹莓派(一款基於 Linux 的單片機計算機)控制三軸機械臂,進而控制貓咪在草地上跑來跑去。
此題給出的txt文件中有 U(UP),D(DOWN),L(LEFT),R(RIGHT),即上下左右咯,既然是讓貓咪按這個跑,很簡單就是畫出路線圖嘛,寫一個簡單的python腳本,利用tutle海龜庫寫,getflag:
flag{MeowMeow}
#coding=utf-8
import turtle as T
with open('seq.txt','r') as f:
strings = f.read()
print(strings)
T.speed(0)
for i in strings:
if (i=='U'):
T.seth(90)
T.fd(1)
elif(i=="D"):
T.seth(270)
T.fd(1)
elif(i=="L"):
T.seth(180)
T.fd(1)
elif(i=="R"):
T.seth(0)
T.fd(1)
運行結果:
她的詩
題目給了一個poem.zip,包含一個python解密腳本和一個包含加密后詩的文件。根據解密腳本可以知道是uuencode,開始過於相信這個解密腳本,沒想到出題人在這兒動手腳
#!/usr/bin/env python3 # This script helps you decode "her poem" from codecs import decode fin = open("poem.txt", "r") fout = open("poem.out", "w") for i in fin: data = "begin 666 <data>\n" + i + " \nend\n" decode_data = decode(data.encode("ascii"), "uu") print(decode_data) fout.write(decode_data.decode("ascii") + "\n") fin.close() fout.close()
重點!在線解密密文即可得到真正的flag,flag分散藏在每行的頭部,但是flag少了一個n需要自行添加在最后面補全為一個單詞fun。
貓咪克星
nc 202.38.95.46 12009
蟒蛇是一種非常容易使用的編程語言,考驗你像不像蟒蛇的標准就是給你一些 Python 3 表達式。如果你能正確計算出來,你就通過了驗證。
簡單來說就是要在30秒內完成指定次數表達式的計算,然后可以得到服務器給出的flag,但是坑爹的是表達式中有一些特殊函數,類似於目錄遍歷 find ~,sleep(100),exit(),所以這種東西我采取了替換的方法。
因為print函數在python3和python2中不同,而我需要使用python2中的pwntools庫(python3的socket不知為何無用),同時擁有python3的print函數特性,這時候就需要:from _ _ future _ _ import print_function
引入python3 print函數。
最終腳本如下(腳本比較簡陋,可能需要多跑幾次才能出flag):
from __future__ import print_function
#coding:utf-8
from pwn import *
sh = remote("202.38.95.46",12009)
getit = sh.recvline()
while True:
strings = sh.recvline()
strings = strings.replace('sleep(100)','int(1)')
strings = strings.replace('exit()','1')
strings = strings.replace('find ~','echo 1')
strings = strings.replace("__import__('time').",'')
print(strings)
key = eval(strings)
sh.sendline(str(key))
if 'flag' in strings:
print(strings)
exit(0)
腳本運行結果如下:
貓咪電路
當年玩的minercraft被做成了題目,好吧,紅石電路,這是一個存檔,需要我們按規律輸入信號,然后直到光柱亮起,正確的信號即為flag:
flag{0110101000111100101111111111111111111010}
FLXG 的秘密
題目有點長,我總結一下,給出的文件中是伏羲六十四卦的卦象,簡單搜索一下可以知道,伏羲六十四卦可以跟二進制扯上關系,六十四卦分別對應二進制000000-111111,對應關系如下:
'坤': '000000', '剝': '000001', '比': '000010', '觀': '000011', '豫': '000100', '晉': '000101', '萃': '000110', '否': '000111', '謙': '001000', '艮': '001001', '蹇': '001010', '漸': '001011', '小過': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '師': '010000', '蒙': '010001', '坎': '010010', '渙': '010011', '解': '010100', '未濟': '010101', '困': '010110', '訟': '010111', '升': '011000', '蠱': '011001', '井': '011010', '巽': '011011', '恆': '011100', '鼎': '011101', '大過': '011110', '姤': '011111', '復': '100000', '頤': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '隨': '100110', '無妄': '100111', '明夷': '101000', '賁': '101001', '既濟': '101010', '家人': '101011', '豐': '101100', '離': '101101', '革': '101110', '同人': '101111', '臨': '110000', '損': '110001', '節': '110010', '中孚': '110011', '歸妹': '110100', '睽': '110101', '兌': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壯': '111100', '大有': '111101', '夬': '111110', '乾': '111111'
寫一個python腳本將那個文件中的卦象分別解成二進制,可以發現bit數正好是4039032,可以整除8(8bit為1byte)。到這基本上可以判斷思路正確。
腳本如下:
import re
special = '''乾﹑坤﹑屯﹑蒙﹑需﹑訟﹑師﹑比﹑小畜﹑履﹑泰﹑否﹑同人﹑大有﹑謙﹑豫﹑隨﹑蠱﹑臨﹑觀﹑噬嗑﹑賁﹑剝﹑復﹑無妄﹑大畜﹑頤﹑大過﹑坎﹑離﹑咸﹑恆﹑遁﹑大壯﹑晉﹑明夷﹑家人﹑睽﹑蹇﹑解﹑損﹑益﹑夬﹑姤﹑萃﹑升﹑困﹑井﹑革﹑鼎﹑震﹑艮﹑漸﹑歸妹﹑豐﹑旅﹑巽﹑兌﹑渙﹑節﹑中孚﹑小過﹑既濟﹑未濟'''
#二進制順序的卦象
guashu = '''坤、剝、比、觀、豫、晉、萃、否、謙、艮、蹇、漸、小過、旅、咸、遁、師、蒙、坎、渙、解、未濟、困、訟、升、蠱、井、巽、恆、鼎、大過、姤、復、頤、屯、益、震、噬嗑、隨、無妄、明夷、賁、既濟、家人、豐、離、革、同人、臨、損、節、中孚、歸妹、睽、兌、履、泰、大畜、需、小畜、大壯、大有、夬、乾'''
def Getword():
strings = []
s=special.split('﹑')
s2 = guashu.split("、")
diction = {}
with open('G://數據//ctf賽題//中科大ctf//flxg的秘密.txt',encoding="utf-8") as f:
strings2 = f.read()
for i in strings2:
strings.append(i)
f.close()
strings = set(strings)
#因為卦象中存在一個字或者兩個字的卦象,jieba分詞庫不准確,就用/來區別
for i in s:
diction[i]=strings2.count(i)
strings2 = strings2.replace(i,'/'+i+'/')
return diction,strings2,s2
if __name__ == '__main__':
diction,strings2,s2 = Getword()
finalbin =''
finaldiclist=[]
dicts={}
n=0
for i in diction.items():
n+=i[1]*6
print('bits='+str(n/8))
finalstrings = strings2.split('/')
for a in finalstrings:
if a in s2:
finaldiclist.append(a)
#建立卦象與二進制的關系字典
nice =0
n=0
for i in s2:
dicts[i] = format(n,'b').zfill(6)
n=n+1
print(dicts)
print(len(finaldiclist)*6/8)
#按字典解密寫入文件
for b in finaldiclist:
finalbin+=dicts[b]
with open('finalbin.txt','w+') as ff:
ff.write(finalbin)
接下來利用python的libnum庫,將二進制轉換為字符串得到第一個flag:
用binwalk分析一下內容,發現里面有一個壓縮包,進行提取得到以下文件:一個flag elf程序 ,passkey.txt,簡單看一下,接下來的第二題應該是逆向了。。待更新。。。
先到這 。