攻防世界Crypto-babyFibo

分析

附件内容:

import os
import libnum
from secret import flag

def fibo(n):
    assert n >= 0
    if n < 2:
        return n
    return fibo(n-1) + fibo(n-2)

s = fibo(1000)
m = libnum.s2n(flag+os.urandom((len(bin(s))-2)//8-len(flag)))
c = m^s
print(c)
  • s是斐波那契数的第1000个数
  • m=flag+随机数字然后再(String to Number)转为一个超大数字
  • c=m^s

那解题思路就是将其中设计的步骤反着来一遍

开搞

计算fibo(1000)

以下由三种方法计算fibo(1000)

由于直接递归1000不可行

方法一:动态规划:

def fibo(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a
s = fibo(1000)

方法二:直接调用库函数

import gmpy2
s = gmpy2.fib(1000)

Exploit

import libnum

def fibonacci(n):
    if n <= 0:
        return "Input should be a positive integer."
    fib_seq = [0, 1]
    while len(fib_seq) < n:
        fib_seq.append(fib_seq[-1] + fib_seq[-2])
    return fib_seq[n - 1]

# 这里是附件中给的字符串
c = 43104378128345818181217961835377190975779804452524643191544804229536124095677294719566215359919831933542699064892141754715180028183150724886016542388159082125737677224886528142312511700711365919689756090950704

# Compute the 1001st Fibonacci number
s = fibonacci(1001)

# XOR the ciphertext with the Fibonacci number to get the message
m = c ^ s

# Convert the message to a string
b = libnum.n2s(m)

print(b)

攻防世界Crypto-babyFibo
https://zer0ptr.github.io/2025/07/21/攻防世界Crypto-babyFibo/
Author
zer0ptr
Posted on
July 21, 2025
Licensed under