D0g2019-re game WP

分析

  • 程序进行了混淆,不过符号没有去掉并通过动态调试还是能够理清程序的思路。
  • 程序一开始先生成一个九宫格:
    在这里插入图片描述
    1 0 5 3 2 7 0 0 8
    8 0 9 0 5 0 0 2 0
    0 7 0 0 1 0 5 0 3
    4 9 0 1 0 0 3 0 0
    0 1 0 0 7 0 9 0 6
    7 0 3 2 9 0 4 8 0
    0 6 0 5 4 0 8 0 9
    0 0 4 0 0 1 0 3 0
    0 2 1 0 3 0 7 0 4
  • 然后获取九宫格中空格个数,再解决这个九宫格作为标准答案。
  • 将用户的输入进行两次置换:
    在这里插入图片描述
  • 该置换是进行了20轮的 input[strlen(input)/2+i]input[i] 的交换。
    在这里插入图片描述
  • 该置换是进行了20轮的 input[2*i]input[2*i+1] 的交换。
  • 再按input的长度进行一个函数变换:
    在这里插入图片描述
  • 然后将输入的数据挨个减去48,然后按行填入Dog数组中,最后比较Dog和sudo是否全等:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

脚本

import string
sudo='105327008809050020070010503490100300010070906703290480060540809004001030021030704'
ans='145327698839654127672819543496185372218473956753296481367542819984761235521938764'

out_ans=[]
raw_flag=[]

for i in range(len(sudo)):
    if(sudo[i]=='0'):
        out_ans.append(int(ans[i],10))

for i in range(40):
    for c in string.printable:
        e=chr((ord(c) & 0xF3 |~ ord(c) & 0xC) - 20)
        if e==str(out_ans[i]):
            raw_flag.append(c)
            break

for i in range(20):
    c=raw_flag[2*i]
    raw_flag[2*i]=raw_flag[2*i+1]
    raw_flag[2*i+1]=c

for i in range(20):
    c=raw_flag[20+i]
    raw_flag[20+i]=raw_flag[i]
    raw_flag[i]=c

print 'flag{'+''.join(raw_flag)+"}"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值