下载文件,用die查壳
发现无壳,且为64位
拖入ida,shift+f12查找字符串
发现关键字符串 well done
点进去,按ctrl+x交叉引用
按f5反汇编
发现一大串if,判断应该是输入的数要满足这些条件才行
这里解释一下strtol
C 库函数 long int strtol(const char *str, char **endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。
上面就是把输入的字符串转换为16进制
v9=f(v4)
点击f这个函数看看
发现是得到一个兔子序列中的第a1个数字
兔子序列即1,1,2,3,5,8,13……
v4那里有个endptr,猜测最后的flag就是v6,v7,v8,endptr
现在只需要知道v4,就能知道v9,也就能知道v11,v12,v13,进而得到v6,v7,v8,endptr
因为前三个相加
(v9-v10)+(v9-v11)+(v9-v12)=3*v9-(v10+v11+v12)=0x233F0E151C+0x1B45F81A32+0x244C071725=0x62d10d4673
又因为v4+v10+v11+v12=0x13A31412F8C
所以3*v9+v4=0x62d10d4673+0x13A31412F8C=0x19d024e75ff
0x19d024e75ff转为十进制是1773860189695
写脚本爆破
for v4 in range(3,100):
a = [1, 1]
for i in range(2,v4):
b=a[i-1]+a[i-2]
if 3*b+v4 == 1773860189695:
print(v4)
print(b)
a.append(b)
得到
所以v9=591286729879,v4=58
编写脚本
v9=591286729879
v4=58
print(hex(v9-0x233F0E151C))
print(hex(v9-0x1B45F81A32))
print(hex(v9-0x244C071725))
print(hex(v4+0x6543))
得到#0x666c61677bL
#0x6e65776265L
#0x655f686572L
#0x657d
666c61677b 6e65776265 655f686572 657d
对0x666c61677b6e65776265655f686572657d进行编码
得到结果flag{newbee_here}