[XCTF-Reverse] 94 school-ctf-winter-2015_whats-the-hell-500

题目直接给了cxx的原码。这个库说是google上能搜到,位在不知道叫什么的情况下基本也是搜不到。

结合自己理解来吧。程序里有3种不同的结构

  1. I-------I 这个一开始理解成 I - --(--I) 这样5个减号就得2(I -(I-2))后来看不是这样理解的得2没问题,他理解成一条线段。通过--运算得2
  2. 第2种构如果知道第1种是线段就好办了,它是平面.A就是算出面积长*宽,第2段就是高3宽5得3*5
  3. 第3种就是立方体,.V就是算体积 如第4段的 5*3*4
    if (p[3]+p[5] != pow((I-------I).A,2) * (I-----I)+(I---I)) error();   // (3*3) ** 2 * 2 + 1 == 163

    if (p[3]+p[4] != pow((o-----------o
                          |           !
                          !           !
                          !           !
                          o-----------o).A,2)+(I---I)) error();  // (5*3) ** 2 + 1  == 226

    if (p[4]*p[5] != (pow((o-------------o
                           |             !
                           !             !
                           !             !
                           o-------------o).A,2)-(I---I))*(I-----I)*pow(I-------I,2)) error(); // ((6*3) ** 2 - 1)*2* 3**2 = 5814

    if (p[7]+p[8] != (o-----------o
                      |L           \
                      | L           \
                      |  L           \
                      |   o-----------o|!      // x=5,y=3,z=4
                      o   |           !        // 5*3*4 * 2**2 - (3*2)**2 +1 == 205
                       L  |           !
                        L |           !
                         L|           !
                          o-----------o).V*pow(I-----I,2) - pow((o-------o    // x=3,y=2  
                                                                 |       !
                                                                 !       !
                                                                 o-------o).A,2) + (I---I)) error();

有了这个就可以把12个式子算出来了,再通过一个简单爆破得到13个字符

#0-2
flag = ''
for i in range(0x20, 0x7f):
    for j in range(0x20, 0x7f):
        for k in range(0x20, 0x7f):
                if i+j == 101 and j+k==143 and i*k==5035:
                        flag += chr(i)+chr(j)+chr(k)
                        print('['+chr(i)+chr(j)+chr(k) + ']')
#50_     
#3-5
for i in range(0x20, 0x7f):
    for j in range(0x20, 0x7f):
        for k in range(0x20, 0x7f):
                if i+j == 226 and i+k==163 and j*k==5814:
                        flag += chr(i)+chr(j)+chr(k)
                        print('['+chr(i)+chr(j)+chr(k) + ']')
#pr3
for i in range(0x20, 0x7f):
    for j in range(0x20, 0x7f):
        for k in range(0x20, 0x7f):
                if j+k == 205 and i+k==173 and i*j==9744:
                        flag += chr(i)+chr(j)+chr(k)
                        print('['+chr(i)+chr(j)+chr(k) + ']')
#Tty
for i in range(0x20, 0x7f):
    for j in range(0x20, 0x7f):
        for k in range(0x20, 0x7f):
                if i+j*k == 5375 and j+i*k==4670 and i+j==205:
                        flag += chr(i)+chr(j)+chr(k)
                        print('['+chr(i)+chr(j)+chr(k) + ']')
#_n0
flag +='w'
print(flag)
#50_pr3TtY_n0w  
#50_pr3TtYn_0  提交内容

坑:网站上的flag不仅位数少了,而且后一段的字符顺序算错了。只有提交错的才对。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值