ctfshow 数学不及格--CTFReverse

下载文件,用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}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值