【CTF-RE】[ctf.show]数学不及格
得到了一个名为“re3”的文件,看似不是什么pe文件,但是能被64位的ida打开:
C语言中,如果main函数传参,第一个为参入参数的个数(int argc
),此后是每个的内容(char *argv[]
)
该程序规定参数5个:
strtol(str,未被成功转换的第一个位置,str的进制n):是把n进制的string转换成long long,一个long long占八个字节。
strtol("123!@#",&endptr,16)
:转换后,十六进制的123变成十进制的longlong,!开始没法换,endptr指向!@#
这里就是把第五个传参转成longlong后-25823给v4
f为斐波那契数列,返回其中的【v4-1】项:
数列长度为2-200:
v10,v11,v12读取2,3,4项参数,与v9计算
最后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}