解题领红包之八之解析(还没解全)
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]