w3812247 发表于 2023-1-29 13:31

解题领红包之八之解析(还没解全)

1、访问https://2023challenge.52pojie.cn/
2、进入到黑页面,查看源码

一共有两个有用的字符串,先说第一个
01 1 001 1 001 1 01 1 0001 1 00001 01 1 001 1 1 001 1 0111 011 1 101100 1 1 0 10 1 011 0 01 0000 1 10000 001 1 01 1 0 011 0 00 10 011 0 010 100 1 1011 000 1 1 0 0 11 01111101==========
解析:
全都是数字0和1,应该是一串二进制,通过提示,字符串形如flag{*****},那么这串二进制里应该包含},通过查询,ascii中01111101就是},所以我把这串二进制用ascii进行了解析,得到了如下结果:
https://www.qqxiuzi.cn/bianma/ascii.htm
01100110→f
01101100→l
01100001→a
01100111→g
00110111→7
01111011→{
00110101→5
01100100→d
00110000→0
00110110→6
01100010→b
01100101→e
00110110→6
00110011→3
01111101→}
flag7{5d06be63}
3、解析第二个字符串
++++++++++[>++++++++++>++++++++++>+++++>++++++++++++<<<<-]>++.++++++.>---.<-----.>>-..>+++.<+++++.---.+.---.+++++++.<+++.+.>-.>++.
这个是brainfuck语言,及其小众,好难完全看不懂,但是网上有大神用python编了一个解释器
https://blog.csdn.net/WinterShiver/article/details/124850971
源码我也贴出来
CONST_INF = int(1e7 + 7)


class Table:
    def __init__(self):
      self.register =
      self.ptr = 0

    def table_expand(self):
      if self.ptr == 0:
            self.ptr += len(self.register)
            self.register = * len(self.register) + self.register
      elif self.ptr == len(self.register) - 1:
            self.register = self.register + * len(self.register)
      else:
            pass

    def valid_check(self):
      assert self.ptr >= 0 and self.ptr < len(self.register)

    def ptr_l(self):
      self.table_expand()
      self.ptr -= 1
      self.valid_check()

    def ptr_r(self):
      self.table_expand()
      self.ptr += 1
      self.valid_check()

    def add1(self):
      self.valid_check()
      self.register += 1

    def sub1(self):
      self.valid_check()
      self.register -= 1

    def set(self, value):
      self.valid_check()
      self.register = value

    def get(self):
      self.valid_check()
      return self.register


class Env:
    def __init__(self):
      self.table = Table()

    def process(self, code, inp):
      num_ins, ptr_ins = 0, 0
      ptr_inp = 0
      outp = ""
      while ptr_ins < len(code):
            if code == '>':
                self.table.ptr_l()
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            elif code == '<':
                self.table.ptr_r()
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            elif code == '+':
                self.table.add1()
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            elif code == '-':
                self.table.sub1()
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            elif code == '.':
                outp += chr(self.table.get())
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            elif code == ',':
                if ptr_inp < len(inp):
                  self.table.set(ord(inp))
                  ptr_inp += 1
                else:
                  raise ValueError('Input exhausted')
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            elif code == '[':
                if self.table.get() == 0:
                  while ptr_ins < len(code) and code != ']':
                        num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            elif code == ']':
                if self.table.get() != 0:
                  while ptr_ins >= 0 and code != '[':
                        num_ins, ptr_ins = num_ins + 1, ptr_ins - 1
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            else:
                num_ins, ptr_ins = num_ins + 1, ptr_ins + 1
            assert num_ins < CONST_INF
      return outp


if __name__ == '__main__':
    interpreter = Env()

    # hello world
    hello_world_code = '>++++++++[ < +++++++++ > -] < . > ++++[ < +++++++ > -] < +.+++++++..+++.>>++++++[ < +++++++ > -] < ++.------------. > ++++++[ < +++++++++ > -] < +. < .+++.------.--------.>> > ++++[ < ++++++++ > -] < +.'
    hello_world_code='++++++++++[>++++++++++>++++++++++>+++++>++++++++++++<<<<-]>++.++++++.>---.<-----.>>-..>+++.<+++++.---.+.---.+++++++.<+++.+.>-.>++.'
    print(interpreter.process(hello_world_code, None))

    # toUpper
    toUpper_code = ', ----------[----------------------., ----------]'
    print(interpreter.process(toUpper_code, 'hello\n'))


运行结果如下:
flag11{63418de7}

4、根据网页源码的提示,dns可以获取到相应的提示,于是,我测试了2023challenge.52pojie.cn的A记录、CNAME记录、txt记录,
在windows cmd命令行中查询域名txt记录代码:
nslookup -qt=txt 2023challenge.52pojie.cn
结果如下:
_52pojie_2023_happy_new_year=flagB{substr(md5(uid+\"_happy_new_year_\"+floor(timestamp/600)),0,8)}
这个串很明显是js的写法,
uid是自己的uid,可以通过https://www.52pojie.cn/home.php?mod=space&do=profile查询,然后跟了一个字符串,然后是当前的时间戳除以600(这个数字取整)
以上3个串拼起来以后,使用md5进行加密,然后取得前8位,根据我的uid,我的计算结果如下:
flagB{36b4178d}


我自己只解析出来了这几个flag,感觉视频中开头的flag6得使用电话拨号去碰,还有就是视频的最后有一串模糊的对话应该也是。其他的我还没有找到。
页: [1]
查看完整版本: 解题领红包之八之解析(还没解全)