BCTF Writeup
team:我是狗汪汪
author:redrain,金龜子,ztz,hellove,cbuteng,琴心劍氣,saline
0x00 MISC
MISC100初來乍到
描述
米特尼克剛到中國人生地不熟,想要找到一些中國的駭客朋友幫助他,他知道Capture The Flag奪旗競賽是駭客雲集的地方,於是也報名參加了中國第一次全國性的CTF大賽 @BCTF百度杯網路安全技術對抗賽。而要進入BCTF圈交流,[email protected],才能找到一個密語。
解題
很簡單,微博上at了後會多個粉絲,檢視簡介即有flag。
MISC200內網冒險
描述
為了收集更多參加 BCTF 大賽的中國駭客朋友的資訊,米特尼克決定嘗試滲透進入 BCTF 的內網以獲取更多的資訊。透過資訊蒐集和網路監聽,他發現了進入內部資料庫的一個入口代理,並且在代理入口處拿到了少量流量資料。正當他想繼續收集更多信 息的時候,他的行跡被發現並被踢出了網路。 http://bctf.cn/files/downloads /misc200_23633b6b34ccf6f2769d35407f6b2665.pcap 入口代理:218.2.197.236:12345
解題
下載得到pcap,丟wireshark如圖
埠53 使用工具TCPDNS Tools將本機作為dns伺服器
ping目標域名或者使用nslookup -vc得到ip nc連線後輸入所得到ip獲得flag
MISC300 誘捕陷阱
描述
米特尼克從FBI探員凱瑟琳郵箱中發現了一位中國安全專家發給她的郵件,郵件內容如下: 我在THU高校部署了一些誘騙系統,捕獲到了與米特尼克網路攻擊行為相關的資料,見附件,我覺得你們有必要深入分析一下。當然如果你們沒有能力分析的話,可以聘用我做技術顧問,不過我的諮詢費用很高哦。 附件:http://bctf.cn/files/downloads/dionaea.bistream.38930db22ae8cc6a2e589672ca39dca9 米特尼克非常急迫地想知道這位中國安全專家到底發現了什麼?
提示
[hint0]: 也許蜜罐replay會幫助你:) [hint1]: 好吧,再提示另一段蜜罐log,只能說這麼多了. http://bctf.cn/files/downloads/kippo.ttylog.692ce16db7d940cb9ec52a8419800423
解題
描述中附件得到一份dionaea的蜜罐log,但是未再win下搭建成功,後來給力hint是一份linux下的蜜罐系統kippo的log,成功搭建並重現攻擊過程
kippo中axel無法使用,下載只能透過curl,透過復現找到了後門地址2792326331/fool
解密後得到真實ip:166.111.132.187 將後門下載http://166.111.132.187/fool 接下來就交給妹子逆向這個後門了:) 這裡的這個跳轉不能讓它跳
下面是載入一些列舉程式和模組需要用到的函式
提權操作
挨個列舉程式,檢查有沒有百度防毒的程式。
這裡我們只需要將這幾個跳轉改了就好了。
過了那個百度防毒程式的驗證那兒。Key就自己跳出來了呢
0x01 PPC & Crypto
PPC & Crypto100 混沌密碼鎖
描述
據傳說,米特尼克進任何門都是不需要鑰匙的,無論是金鎖銀鎖 還是密碼鎖。使用偽造身份在BAT安全部門工作的時候,有一扇帶著密碼鎖的大門吸引了他的注意。門後面到底藏著什麼呢?米特尼克決定一探究竟。 http://bctf.cn/files/downloads/passcode_396331980c645d184ff793fdcbcb739b.py 218.2.197.242:9991 218.2.197.243:9991
解題
下載原始碼後閱讀
#!python
#-*- coding:utf-8 -*-
import base64,binascii,zlib
import os,random
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
def abc(str):
return sha.new(str).hexdigest()
def bin2dec(string_num):
return str(int(string_num, 2))
def hex2dec(string_num):
return str(int(string_num.upper(), 16))
def dec2bin(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 2)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def dec2hex(string_num):
num = int(string_num)
mid = []
while True:
if num == 0: break
num,rem = divmod(num, 16)
mid.append(base[rem])
return ''.join([str(x) for x in mid[::-1]])
def hex2bin(string_num):
return dec2bin(hex2dec(string_num.upper()))
def bin2hex(string_num):
return dec2hex(bin2dec(string_num))
def reverse(string):
return string[::-1]
def read_key():
os.system('cat flag')
def gb2312(string):
return string.decode('gb2312')
answer='78864179732635837913920409948348078659913609452869425042153399132863903834522365250250429645163517228356622776978637910679538418927909881502654275707069810737850807610916192563069593664094605159740448670132065615956224727012954218390602806577537456281222826375'
func_names = ['fun1', 'fun2', 'fun3', 'fun4', 'fun5', 'fun6', 'fun7', 'fun8', 'fun9']
f={}
f['fun1']=reverse
f['fun2']=base64.b64decode
f['fun3']=zlib.decompress
f['fun4']=dec2hex
f['fun5']=binascii.unhexlify
f['fun6']=gb2312
f['fun7']=bin2dec
f['fun8']=hex2bin
f['fun9']=hex2dec
def check_equal(a, b):
if a == b:
return True
try:
if int(a) == int(b):
return True
except:
return False
return False
def main():
print "Welcome to Secure Passcode System"
print "First, please choose function combination:"
in1=raw_input('f1: ')
f1='fun'+in1[:1]
in2=raw_input('f2: ')
f2='fun'+in2[:1]
in3=raw_input('f3: ')
f3='fun'+in3[:1]
in4=raw_input('f4: ')
f4='fun'+in4[:1]
if f1 not in func_names or f2 not in func_names or f3 not in func_names or f4 not in func_names:
print 'invalid function combination'
exit()
try:
answer_hash = f['fun6'](f['fun2'](f[f1](f[f2](f[f3](f[f4](answer))))))
except:
print "Wrong function combination, you bad guy!"
exit()
if len(answer_hash) == 0:
print 'You must be doing some little dirty trick! Stop it!'
exit()
usercode = raw_input('Your passcode: ')
try:
user_hash = f['fun6'](f['fun2'](f[f1](f[f2](f[f3](f[f4](usercode))))))
if user_hash == answer_hash:
if check_equal(answer, usercode):
print "This passcode has been locked, please use the new one\n"
else:
print "Welcome back! The door always open for you, your majesty! "
read_key()
else:
print "Sorry, bad passcode.\n"
except:
print "Sorry, bad passcode. Please try again."
if __name__ == '__main__':
main()
新增continue,跑了一下,結果是fun3,fun5,fun1,fun4 媽蛋,結果是This passcode has been locked, please use the new one 發現read_key()
,使用python的 zlib.compress函式
#!python
usercode= hex2dec(reverse(binasci.b2a_hex(zlib.compress(f[f1](f[f2](f[f3](f[f4](usercode)))),4))))
PPC & Crypto200 他鄉遇故知
描述
逃離到中國的米特尼克與以前的老朋友都失去了聯絡,這讓他常 常懷念逝去的時光。在一次潛入某著名外企嘗試獲取重要資料的行動中,米特尼克還沒有拿到目標檔案就不幸被保安發現了。在逃離的過程中,他闖進了一個辦公 室,結果驚奇地發現自己二十年前的老朋友 Tupper 就在眼前。更神奇的是,Tupper 知道米特尼克需要什麼,給了他想要的東西並且幫助他成功脫逃。你知道米特尼克拿到的資訊是什麼嗎? http://bctf.cn/files/downloads/meeting-tupper_baaa58809f2a0435cb5f282ce4249fdf.txt
解題
二人對話應該是Tupper的自指公式中的k值,谷歌後瞭解到Tupper自指公式是用來繪製圖的 再wiki上找到了的程式跑不出後面兩段k值,後來又再csdn上找到了一段程式解決 使用程式如下:
#!python
def Tupper_self_referential_formula(fd, k):
size = 61
def f(x,y):
d = ((-size * x) - (y % size))
e = reduce(lambda x,y: x*y, [2 for x in range(-d)]) if d else 1
f = ((y / size) / e)
g = f % 2
return 0.5 < g
for y in range(k+size - 1, k-1, -1):
line = ""
for x in range(0, 1000):
if f(x,y):
line += "@"
else:
line += " "
line += '\n'
fd.write(line)
if __name__ == '__main__':
d = k值
e = k值
f = open('ans2','w')
Tupper_self_referential_formula(f,d)
Tupper_self_referential_formula(f,e)
f.close()
'''
row = 17
print len(str(a))
ans = str(bin(a))[2:]
print len(ans)
col = len(ans) / row + 1
print col
f =open('ans1','w')
for i in range(0,row - 1):
f.write(ans[col * i: col * (i+1)])
f.write('\n')
f.close()
'''
'''
row = 61
print len(str(d))
ans = str(bin(d))[2:]
print len(ans)
col = len(ans) / row + 1
print col
##f =open('ans1','w')
for i in range(0,col):
f.write(ans[row * i: row * (i+1)])
f.write(ans[row * i + row: row * (i+2)])
f.write('\n')
f.close()
'''
使用註釋的程式碼速度會更快
解出flag: p1e4se-d0nt-g1ve-up-cur1ng 。。。不要放棄治療麼。。。我已經病入膏肓了
PPC & Crypto400 地鐵難擠
描述
米特尼克需要用社工辦法拿到THU安全專 家的磁碟映象以瞭解更多資訊,於是他收買了THU專家的博士生,來到BJ市需要與博士生當面聯絡。但是,來到BJ市之後遇到的第一個問題就是交通。BJ市 人滿為患,上下地鐵時人們也不先下後上,而是互相擠。左邊的人想擠到右邊下車,右邊的人也想擠到左邊上車。你作為米特尼克在BJ的一位小夥伴,能否幫他和 所有乘客設計一個儘量少移動次數的方案,使得需要上車的人都上車,需要下車的人都下車。 218.2.197.242:6000 or 218.2.197.243:6000
解題
nc 連上去,需要爆破 4 位給定的 sha1, 每次進入系統的需要爆破的內容不同,有時間限制。 直接 4 個 for 迴圈,時間複製度為 O(62^4) python 無法在規定時間內完成。 採用分散式爆破或者多程式 接著 讓所有的 L 移動到右邊,所有的移動到左邊,中間是空格 4 種情況 空格跟左邊相鄰的位置交換 空格跟左邊隔著的一個位置交換位置 空格跟右邊相鄰的位置交換, 空格跟右邊隔著的一個位置交換。 然後要求用最小的步數,採用 bfs。 然後執行跑 100 輪出現 flag
0x02 REVERSE
REVERSE100 最難得題目
描述
米特尼克路被各路大神追查痛苦飢渴難耐。順手撿起身邊一個水杯,開啟瓶蓋,居然寫著one more,實在太神奇了。 http://bctf.cn/files/downloads/re_100.8cd4820cbd1300bda951e694298f73a0
解題
放入OD之後,發現有反除錯,要把這幾個反除錯的跳轉改了就好了。
然後把messagebox nop掉
然後執行,等他執行完畢,就可以看到key了。Th3_H4rd3st_H3r3
REVERSE200 小菜一碟
首先,下面是將這些數字從字元轉換成記憶體中的數字。
將這些數字初始化到記憶體中,如果遇到記憶體不是FF的那麼就跳想下一個記憶體地址。
初始化完畢之後就是這樣了:
最重要的部分就是下面這個演算法: 下面這個演算法是求整數商,MagicNumber是0x66666667,一共移位了34位,帶入公式o=2^n/c C是MagicNumber,n是34,這樣就可以求得o為0xA,也就是10進位制的10,那麼下面就是用一個數來對10求商。
再下面也是一樣的。用上面求商那個式子的被除數來對0xA求餘。也就是求模。
並且要滿足下面的比較
上面的這部分演算法總結一下 過程就是
(bit6*bit7/10+bit7*1)%10==bit1
比較第二位和bit6*bit7%10的關係
比較bit6*bit7/10+bit7是不是大於等於10
由於第二次是8可以確定第6位一定是0.1.2中的一個
如果都成立第二位鑑於bit6*bit7%10
之後第二次迴圈開始,第7位的部分變成固定值8。再次滿足上述條件並滿足最後減處來的小於等於1 這裡就根據關係湊數字吧 湊了幾組199XX11,697XX25等,然後根據下面去確定
好下來下面這個1404這個地方,這裡call了一個00CF1000 此處這個call可以用黑盒的辦法處理。
上面這個[ebp-0x58] 確定是不是運算結果大於100,失敗 bx的值和之前輸入的值有關 bl位低位4數 這裡有點忘記了,動態調一下。 然後就很容易去定了第8位和第9位為09 大不了湊幾組就知道規律了比分析快多了。 下面這個迴圈就是在比較剩餘的那些數字了。不對的地方改一下就好了。
最後的結果是:6970825096996108
REVERSE400 神秘系統
首先在xp裡面將虛擬機器MBR覆蓋為神秘系統的MBR,然後用IDA+VM除錯。 在7C00斷下來:
下面是在計算aLoading___|的長度為
讀取螢幕上游標的當前位置
下面是顯示Loading這個字串。
下面使用int13中斷來讀取系統扇區 讀系統的第二個扇區開始讀A個扇區。
下圖是第二個扇區的一部分。確實不知道是什麼。。。先往後看吧。
將這些資料讀到0x8000處
下面是在螢幕上面輸出Access code:
繼續,這裡要求你輸入一個0-9的數字
下面是在解密剛剛從第二扇區讀入的資料
解密完畢之後,就會跳到8000去執行。如果我們這時候輸入的不對的話,那麼就會錯了。
這裡應該是和系統進入的時候一樣的,首先會在8000處有一個段跳轉指令,然後繼續執行
然後我們看看MBR開始的地方,看上去很相似啊。。
我們試一下吧。
0xDA ^ 0xEB = 31
0x3B ^ 0x08 = 33
0x71 ^ 0x42 = 33
0x74 ^ 0x47 = 37
我們再試試 1337,就進入系統了。
如果我們用記事本開啟這個檔案的話,可以看到:
下面使用了int16的0號功能,也就是從鍵盤上讀ASCII碼
下面這個地方就是解析我們輸入的字元。
輸入的大於2位的話,就會判斷是不是wr 如果是wr的話,就匹配引數
然後正式進入wr的處理函式 這裡產生隨機數
寫入檔案
下面是對檔名稱進行加密
儲存加密後的檔名字
根據這個存放檔名字的函式,我們可以知道,他將這個檔案按照一定的格式儲存在記憶體中的。
首先一個作業系統要有適當的格式來儲存檔案,如果一個檔案是按照這種格式來儲存的話,那麼系統中的所有檔案都是按照這種格式來儲存的,我們可以透過我們寫入的檔案來逆向出系統儲存檔案的方式。
後門再分析檔案儲存的加密演算法,然後我們在記憶體中搜尋符合格式要求的內容,那麼這一塊內容就是要找的檔案。然後我們再根據逆出來的加密演算法就可以解密檔案了。
最後解密出的檔案是 Dear CTFer, if you see this message, you have completely unerstood my OS. Congratulations! Here is what you want: BCTF{6e4636cd8bcfa93213c83f4b8314ef00}
0x03 PWN
PWN100後門程式
描述
米特尼克拿到了BAT資料中心的口令後,為了確保口令被更改後仍能登陸資料中心,他從一位小夥伴那拿到了一個後門程式植入進了伺服器。這個後門程式沒有任何說明,但是米特尼克迅速找到了使用方法。後門程式:http://bctf.cn/files/downloads/backdoor_844d899c6320ac74a471e3c0db5e902e 安裝地址:218.2.197.250:1337 安裝地址2:218.2.197.249:1337
解題
主要思路: 經過分析,發現程式的主要功能是將使用者輸入與<baidu-rocks,froM-china-with-love>
輪番異或並判斷結果是否等於n0b4ckd00r。
如果這個判斷透過,就會把從第10個位元組的剩餘輸入資料作為函式呼叫。
因此要利用這個我們的shellcode要用n0b4ckd00r開頭並且用<baidu-rocks,froM-china-with-love>
異或一遍然後傳送給伺服器。 需要注意的是要保證scanf能完整接受shellcode,它會把0x20等字元截斷造成shellcode無法執行。 shellcode用的是這個:http://www.shell-storm.org/shellcode/files/shellcode-857.php
PWN200身無分文
描述
米特尼克在BAT上班時,發現很多同事都在用新款Android手機,很是羨慕,他也想搞一部,來替換他那部用了“二十多年”的摩托羅拉手機。但是他在BAT公司還沒拿到第一筆工資,用假身份申請的信用卡在租房與日常飲食上也快刷爆了,可以說是身無分文了。這卻難不倒米特尼克,他發現了這個銷售手機的線上商店。商店地址:218.2.197.251:1234 http://bctf.cn/files/downloads/mobile_shop_4d904f700ef95bae39936cd9c0829d31
解題
主要思路:
下載程式後載入ida,找到顯示選單函式sub_8048b80。
透過這個函式的呼叫者我們找到接受引數的函式sub_8048C00,而該函式會呼叫購買手機的函式(sub_8048840)、顯示選單的函式等等,而sub_8048840中會對傳入的引數進行校驗:
檢查是否為‘-’
開頭,如果不是,用strtol把字串引數轉換成數字,如果一次購買的商品大於8則退出,否則
a1[8 - result]
加一,如果此處我們能控制讓傳入的引數為負數,那麼就可以在a1 + 8的任意地址+1了,此處可以更改sub_8048C00的返回地址。 因為函式會檢查傳入引數是否以‘-’開頭,所以傳入一個以空格開頭的字串‘ -1’,這樣就能繞過檢測並且在經過strtol函式後還能轉換為-1,至此,可以達到改a1 + 8之上任意地址了。 來看sub_8048A30函式,函式接受傳入的信用卡號存放在變數中,我們可以在此處存放shellcode,然後透過上面的地址操作更改地址為變數的地址就可以exploit了。
所以,透過這點就可以利用上面的任意地址修改,將返回地址修改為我們存放的shellcode的地址就可以達到exploit了。
0x04 WEB
Web100
進入題目後看到了幾個人的名字對應的連線,其中的引數格式是id={32位字串},id後面的數字目測都很像MD5,就去cmd5解了下,發現md5值都是 (對應的名字+三位數字)的md5值,那麼現在提示要求獲得Alice的的檔案,就嘗試去猜測一下Alice的id看看 交給burp,切換到burp的Intruder,然後把id出設定一個payload位置:
然後指定paylad為Alice+三位數字取md5運算:
然後就可以attack
最後可以看到結果為Alice479時候出現了正確的頁面,訪問一下,原始碼中看到了<!-- $_POST['key=OUR MOTTO'] -->
的提示,圖片是BT5的圖片,就嘗試bt5的motto,各種大小寫,逗號,空格的嘗試之後,得到又一個提示config.php.bak 下載之後得到的東西在chrome console中得到了flag:
話說。。。主辦方你們敢不敢不要換程式碼了。。。今天覆現的時候發現flag和之前提交的不一樣。。。還好有以前的截圖,這倆flag我也忘記了哪個是第一天我們提交的了
Web200
訪問題目頁面提交提示只能在本地執行,然後F12 把ip的值改為了127.0.0.1提交,彈出了一個401登陸認證,admin/admin 就進去了,彈出來一個遊戲頁面,但是坑爹的怪物根本打不死啊有木有!!! 跑去看agnet1.js的程式碼,ctrl+f了下BCTF,找到了生成key的函式:
繼續ctrl+f看哪裡呼叫了,找到了呼叫的地方:
就看到進入之前的那個if判斷,根據變數名字猜到了deadghost=10就是打死十個怪物才會彈出key,開始找到了player的一個life屬性,發現是5,還有些攻擊間隔之類的變數,就直接改這些值,跑去傻逼呵呵的打死了10只怪物到了小黃門前面彈出了flag,但是坑爹的是一直就不對! 返回來仔細看程式碼原來life和移動速度也參加了生成key的運算,這些屬性不能改,看程式碼好心煩啊好蛋疼,從if那看到authnum的第二個引數是deafghost,就是打死的怪物數量,是定值10,繼續傻逼呵呵的跑去看authnum的第一個引數是怎麼算出來的,看的好亂,忽然就發現2b了,直接chrome的js console應該就ok,f12過去,輸入 authnum(gameObj.key,10) 出來了flag:
Web300
根據<form class="form-signin" action="test.php.bak">-->
中下載到的原始碼,根據裡面key和room長度的判斷以及那個正則,構造出了一個合適的url:query.php?key=abcd123AB124564&room=xxx room哪裡貌似可以執行, 當room=$(2*3))時輸入如下:
不過只能返回%d數字。。。。。 後面繼續嘗試其他各種猥瑣命令,redrain大牛說如果命令返回值有多行或者為空似乎都不會傳給room去執行,可以用ls 和萬用字元來判斷檔案是否存在,類似於盲注,透過返回頁面判斷這個檔案活目錄在不在。。.即 room=$(ls B) 如果頁面返回那串180xxx的隨機數,說麼這個檔案或目錄一個字元為B,繼續room=$(ls BX) 這樣去匹配,同時控制整個room長度小於15就ok了,然後手工帝就用黃金右手去跑了,逗比的跑去寫了個程式發現還沒人家的右手跑的快,呵呵呵了: 最後跑出來flag:
WEB400冰山一角
描述
在上一個站點中米特尼克學會了特殊的Web技巧,在開始滲透前,他會左顧右盼裝作看風景。他對BAT這個公司的好奇與日俱增,似乎BAT並不像是表面上看起來的那樣,僅僅是個網際網路公司。他追尋一系列蛛絲馬跡找到了這個站點,裡面似乎隱藏著BAT的一項核心機密。站點入口:http://218.2.197.240:1337/0cf813c68c3af2ea51f3e8e1b8ca1141/index.php(注意:本題flag非“BCTF{可見字串}”形式)
解題
訪問url是一個登入視窗:
在經過掃描後發現開放了mongodb埠,於是直接mongodb注入:
得到這個頁面:
透過提示得知存在you_guys_fxxking_smart.php/jpg
兩個檔案,訪問php又是一個登入視窗。。
而jpg則是程式碼提示:
透過程式碼提示,可以看到關鍵語句的password經過了hash函式加密,而第三個引數true告訴我們加密後的密文是二進位制輸出的,所以構造一個經過加密後存在SQL隱碼攻擊的密文就可以。 金鑰可以透過提示:“I love the first letter of my name”以及“<meta name="author" content="bob">
”得到為b,於是我寫了一個指令碼呼叫hash的所有支援函式並遍歷輸出尋找SQL隱碼攻擊語句,同時也沒閒著用burpsuite對登入視窗進行爆破(驗證碼複用)。 然後爆破成功,密碼9384。 得到這個:
猜測可能是hash中的某函式加密過了,於是把密碼取出來扔cmd5試,在試到sha512的時候成功了,最後兩個密碼解密還原得到flag。
Web500
存在一個支付的bug,取消交易可以無限刷rmb和btc 首先用rmb買入btc,然後交易管理中取消該交易,此時burp抓包,重放此包n次可刷n倍rmb 刷btc也是一樣,先買入一枚btc,然後搞價賣出,此時為掛單狀態,然後取消交易,此時抓包,重放此包n次可刷n倍btc 刷夠200btc就可以盲打到後臺,在rmb提現處可以xss,打到cookie進入後臺,發現一處蛋疼蛋疼的注入,在後臺返利處:
抓包獲得的id=’可以注入 Id=xxx’當id號有效時會出現http 500錯誤 雖然提交 id=xxx and 1=1 和 id=xxx and 1=2 之後返回頁面相同 但是提交and 1=1之後再提交 單引號就不會丟擲http 500錯誤 提交 and 1=2 之後 再提交單引號會報錯 所以可以用第二次請求加單引號去驗證上次請求的結果。
而且只要條件為真,id號就失效,選片換下一個id號
由此思路,可以寫程式去實現: 首先發包生成返利 Id=xxx +payload進行盲注 發id=xxx加單引號驗證上步結果 如果3中未出現http 500 則繼續更換下一個payload。若出現http 2000則 重新生成返利id
然後就迴圈2-5步驟貌似就能跑資料了。當然都是YY的。沒寫出來。
相關文章
- SSCTF Writeup2020-08-19
- JCTF Writeup2020-08-19
- HCTF writeup(web)2020-08-19Web
- wargame narnia writeup2020-08-19GAM
- 太湖杯writeup2020-11-22
- 0ctf writeup2020-08-19
- 360hackgame writeup2020-08-19GAM
- Wargama-leviathan Writeup2020-08-19GAM
- CoolShell解密遊戲的WriteUp2020-08-19解密遊戲
- guestbook(hackme web部分writeup)2020-10-31Web
- 三道MISC的writeup2022-12-08
- xss挑戰賽writeup2020-08-19
- web_ping的writeup2018-08-19Web
- CTFSHOW-WEB入門 writeup2020-09-29Web
- Alictf2014 Writeup2020-08-19TF2
- cmseasy&內網滲透 Writeup2021-08-19內網
- 2016hctf writeup2017-03-04
- Hack.lu 2014 Writeup2020-08-19
- 31C3 CTF web關writeup2020-08-19Web
- CTF-safer-than-rot13-writeup2021-07-20
- Flare-on5 Challenge6 magic -Writeup2018-09-20
- CTF——WriteUp(2020招新)2020-11-04
- Misc_BUUCTF_WriteUp | 面具下的flag2024-10-30
- Web_Bugku_WriteUp | 變數12024-03-17Web變數
- 無聲杯 xss 挑戰賽 writeup2020-08-19
- 技術分享 | "錦行杯"比賽 Writeup2021-02-02
- 網鼎杯-writeup-第二場-babyRSA2018-08-24
- xctf攻防世界—Web新手練習區 writeup2020-12-22Web
- 2020湖湘杯部分writeup2020-11-02
- 【Writeup】Pwnable.kr 0x02 collision2017-07-29
- XSS挑戰第一期Writeup2020-08-19
- XSS挑戰第二期 Writeup2020-08-19
- 第五季極客大挑戰writeup2020-08-19
- 【阿菜Writeup】Security Innovation Smart Contract CTF2021-08-26
- 第一屆BMZCTF公開賽-WEB-Writeup2020-12-30Web
- 阿里雲CTF逆向題“尤拉”詳細Writeup2024-04-30阿里
- 32C3 CTF 兩個Web題目的Writeup2020-08-19Web
- 幾期『三個白帽』小競賽的writeup2020-08-19