【CTF-RE】[ctf.show]数学不及格

Author Avatar
白菀枯
发表:2025-04-04 22:01:16
修改:2025-04-04 22:03:06

得到了一个名为“re3”的文件,看似不是什么pe文件,但是能被64位的ida打开:

C语言中,如果main函数传参,第一个为参入参数的个数(int argc),此后是每个的内容(char *argv[])

  1. 该程序规定参数5个:

strtol(str,未被成功转换的第一个位置,str的进制n):是把n进制的string转换成long long,一个long long占八个字节。

strtol("123!@#",&endptr,16):转换后,十六进制的123变成十进制的longlong,!开始没法换,endptr指向!@#

这里就是把第五个传参转成longlong后-25823给v4

  1. f为斐波那契数列,返回其中的【v4-1】项:

数列长度为2-200:

  1. v10,v11,v12读取2,3,4项参数,与v9计算

  2. 最后v4,v12,v11,v10还要再满足一定条件

综上,v9无外乎是斐波那契数列的前两百项,v4就相当于下标,据此v10,v11,v12就能反推出来。遍历找到那个v4即可:

def fibonacci(n):
    if n <= 0:
        return []
    elif n == 1:
        return [1]
    elif n == 2:
        return [1, 1]
    else:
        fib_seq = [1, 1]
        while len(fib_seq) < n:
            fib_seq.append(fib_seq[-1] + fib_seq[-2])
        return fib_seq


fib = fibonacci(201)

for i in range(2, 201):
    v4 = i
    v9 = fib[v4-1]
    v10 = v9 - 0x233F0E151C
    v11 = v9 - 0x1B45F81A32
    v12 = v9 - 0x244C071725
    if v4 + v12 + v11 + v10 == 0x13A31412F8C:
        print(hex(v10), hex(v11), hex(v12), hex(v4+25923))

v10=第一个参数=0x666c61677b

v11=第二个参数=0x6e65776265

v12=第三个参数=0x655f686572

v4还要加上第三个参数被减去的25923,再转换回十六进制的第三个参数=0x657d

HEX -> UFT-8 = flag{newbee_here}

评论