ZJCTF2019_final

反推蟒蛇

image-20210727101837401

1
2
3
4
5
6
7
8
9
10
11
from random import randint
from math import floor, sqrt
a= ''
flag = 'flag'
c = [ ord(d) for d in flag ]
b = randint(65, max(c) * 255
for d in range(len(flag)):
a += str(int(floor(float(b + c[d]) / 2 + sqrt(b * c[d])) % 255)) + ' '

print a

一开始看到这个255以为能凑,然后发现b+c[d]/2+sqrt(b*c[d])是可以凑成$\frac{(\sqrt b+ \sqrt{c_d})^2}{2}$​这么一个形式,然后数学推演,因为这个随机数必定是不随机,或者随机数并不起作用,我一开始以为是后者,但是推演到了瓶颈,推不下去了,回头重新做

发现数据不过1e7(也就不过一百万)那直接py爆破了啊

exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from random import randint
from math import floor, sqrt

flag=[57, 183, 124, 9, 149, 65, 245, 166, 175, 1, 226, 106, 216, 132, 224, 208, 139, 1, 188, 224, 9, 235, 106, 149, 141, 80]
table=[]
fflag=0
a=''
b=''
for k in range(65,128):
if int(floor(float(k*255 + ord('z')) / 2 + sqrt(k *255* ord('z'))) % 255)==flag[0]:
break
for i in range(26):
for j in range(128):
if int(floor(float(k*255 + j) / 2 + sqrt(k *255* j)) % 255)==flag[i]:
print(chr(j),end=' ')
print()
# A z
# j
# c
# t
# J f
# {
# T
# h
# i
# s
# 9 R
# a
# Q n
# d
# o
# m
# I
# s
# N
# o
# t
# S
# a
# J f
# e
# ^ }

因为最后多解,所以要自己拼一下

简单逆向

helloworld级别:

用apkide和d2j解析一下,得到flag在libGetFlag.so里面

image-20210727135922461

得解


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!