KalmarCTF2025

Crypto

basic sums

py
with open("flag.txt", "rb") as f:
flag = f.read()

# I found this super cool function on stack overflow \o/ https://stackoverflow.com/questions/2267362/how-to-convert-an-integer-to-a-string-in-any-base
def numberToBase(n, b):
if n == 0:
return [0]
digits = []
while n:
digits.append(int(n % b))
n //= b
return digits[::-1]

assert len(flag) <= 45

flag = int.from_bytes(flag, 'big')

base = int(input("Give me a base! "))

if base < 2:
print("Base is too small")
quit()
if base > 256:
print("Base is too big")
quit()

print(f'Here you go! {sum(numberToBase(flag, base))}')

题目代码非常简单,我们会得到flag转换为n进制之后的数字之和,可以写成下面的形式

flag=anbn+an1bn1+an2bn2+...+a0b0flag=a_{n}b^{n}+a_{n-1}b^{n-1}+a_{n-2}b^{n-2}+...+a_{0}b^{0}
同时,不难看出有同时,不难看出有
flagsumsan+an1+an2+...+a1+a1(mod b1)flag\equiv sums\equiv a_{n}+a_{n-1}+a_{n-2}+...+a_{1}+a_{1}(mod\ b-1)

上面是我们选择的进制之间的最小公倍数,下面是flag的近似大小(肯定要比这个大)

所以,当模数足够大的时候,flag模它才能得到本身,同时我们也有

flagsums mod (b1)flag\equiv sums\ mod\ (b-1)

flagm mod lcm(n,b1)flag\equiv m\ mod\ lcm(n,b-1)

在b不断增大的情况下,对m不断地进行crt结果的合并,当最小公倍数增大到模数大于flag的值时,我们才能获取到flag的唯一解

flag=crt([m,sums],[lcm(n,b1),b1])flag=crt([m,sums],[lcm(n,b-1),b-1])

py
# sage
from pwn import *
from tqdm import trange

context(os='linux', arch='amd64', log_level='debug')
m = 0
n = 1
for i in trange(2,256):
p = remote('basic-sums.chal-kalmarc.tf', 2256)
p.sendlineafter(b'Give me a base! ',str(i).encode())
p.recvuntil(b'go! ')
m0 = int(p.recvline())
n0 = i-1
m = crt([m,m0],[n,n0])
n = lcm(n,n0)
p.close()
print(long_to_bytes(int(m)))
# b'kalmar{At_least_it_wasnt_lattices_right???!?}'


这图片起到了一定的迷惑作用,我还以为要构造格才做的出来,我寻思着我这格构造的好像也不怎么行啊,而且这么多组数据,要怎么整呢,然后就看到春哥做出来了,牛批!!!

所以上面其实是我看了春哥写的文档之后,思考了一番(过程应该没问题),觉得挺有意思的记录一下OvO

else

这个比赛的其他密码题,看看能不能继续偷师一下春哥,还有就是TPCTF那题伪随机数看看能不能学懂Lst4rexp,Orzzzzzzzz

TPCTF2025

Crypto

randomized random

py
# FROM python:3
import random
with open("flag.txt","rb") as f:
flag=f.read()
for i in range(2**64):
print(random.getrandbits(32)+flag[random.getrandbits(32)%len(flag)])
input()

看到getrandbits,可以立马想到MT19937,这里的话因为两个随机数“加”起来了,我们不好处理,但是可以看做是我们可以得到不连续的随机数中的高24位,但看了师傅们的wp都说了实际测试发现影响到了低20位,所以取得是高12位

然后就是不连续的MT19937

待我有空再钻研钻研