Daily AlpacaHack Week5 (2025-12-29 ~ 2026-1-4)

Daily AlpacaHack の Writeup.
(2025/12/29 - 2026/1/4)

後から解いたものなど含むまとめ.

one-p-rsa (Crypto, 2025/12/29)

$$ed = k(p-1) + 1$$

$$c^d = (m^e)^d = m^{ed} = m^{k(p-1)+1}$$

$$m^{p-1} \equiv 1 \mod p$$

$$m^{k(p-1)} m \equiv m \mod p$$

from Crypto.Util.number import *

with open("chall.txt", "r") as f:
    p, e, ct = [int(x.split()[-1].strip()) for x in f.readlines()]
    
d = inverse(e, p-1)
m = pow(ct, d, p)

print(m)
flag = long_to_bytes(m)
print(flag)
        

RBG (Crypto, 2025/12/30)

$$e_{l+1} = 3e_l + 1337 + k_l N$$

$$m_{l+1}(m_l^3)^-1 \equiv m^{1337+k_l N} \mod N$$

$$1337a + Nb = 1$$

$$A^{a+b} B^{-b} \equiv m^{1337(a+b)-1337b+bN} \equiv m^{1337a + bN} \equiv m \mod N$$

from Crypto.Util.number import *
import gmpy2
import itertools

with open("./output.txt", "r") as f:
    out_lines = f.readlines()
    N = int(out_lines[0].split()[-1].strip())
    outs = [int(x.strip()) for x in out_lines[1::]]
    
m1337knN_list = []
for i in range(1,13):
    m1337knN_list.append(outs[i] * inverse(pow(outs[i-1], 3, N), N) % N)
    
kn_list = list(set(m1337knN_list))

g, x, y = gmpy2.gcdext(1337, N)

if g != 1:
    print("not coprime:", g)
    exit()
    
for p in itertools.permutations(range(3)):
    tmp_m = pow(kn_list[p[0]], x+y, N) * pow(kn_list[p[1]], -y, N) % N
    print(long_to_bytes(tmp_m))
        

108 (Misc, 2025/12/31)

Happy New Year (Misc, 2026/1/1)

super-tomato (Crypto, 2026/1/2)

from pwn import *

_, host, port = "nc 34.170.146.252 35506".split()
sh = remote(host, port)

prompt = sh.recvuntil("here is my 🍅:".encode())
print(prompt.decode())

p = int(sh.recvline().decode().strip())

d = p - 1

prompt = sh.recvuntil("what is your 🍅>".encode())
print(prompt.decode())

sh.sendline(str(d).encode())

sh.interactive()
        

Ruby Flag Checker (Rev, 2026/1/3)

def primes(n):
    res = [2, 3]
    x = 3
    while len(res) < n:
        x += 1
        if x % 2 != 0 and x % 3 != 0:
            res.append(x)
    return res

prime23 = primes(23)

enced = b"Coufhlj@bixm|UF\\JCjP^P<"

plain = bytes(p ^ c for p, c in zip(prime23, enced)).decode("ascii")
print(plain)
        

Fushigi Crawler (Web, 2026/1/4)

import requests
import json

url = "http://34.170.146.252:38098/api/crawl-request"
data = json.dumps({"url": "$URL"}) # https://webhook.site/
headers = {"Content-Type": "application/json"}
res = requests.post(url, data=data, headers=headers)