web25
拿到一段代码后,开始分析
error_reporting(0); include(“flag.php”); if(isset($_GET[‘r’])){ $r =
G
E
T
[
′
r
′
]
;
m
t
s
r
a
n
d
(
h
e
x
d
e
c
(
s
u
b
s
t
r
(
m
d
5
(
_GET['r']; mt_srand(hexdec(substr(md5(
G?ET[′r′];mts?rand(hexdec(substr(md5(flag), 0,8)));
r
a
n
d
=
i
n
t
v
a
l
(
rand = intval(
rand=intval(r)-intval(mt_rand()); if((!KaTeX parse error: Expected '}', got 'EOF' at end of input: …)){ if(_COOKIE[‘token’]==(mt_rand()+mt_rand())){ echo $flag; } }else{ echo $rand; } }else{ highlight_file(FILE); echo system(‘cat /proc/version’);
- mt_srand(hexdec(substr(md5($flag), 0,8)));
将flag进行md5加密,返回从第一个到第八个数,再将数字加密 - !
r
a
n
d
:
满
足
这
个
条
件
表
示
rand:满足这个条件表示
rand:满足这个条件表示rand=0,即r=mt_rand()
- 再满足token=mt_rand()+mt_rand() ,这里不是说token等于mt_rand()的两倍,而是token等于第一次加密的值加上第二次加密的值,因为生成的随机数可以说是一个线性变换,即可得到flag
- 现在为了获得flag,即获得第一次加密的值即可,
mt_scrand(seed)这个函数的意思,是通过分发seed种子,然后种子有了后,靠mt_rand()生成随机数, 要获得第一次加密的值就需要获得种子,由函数得:r=0时,得到随机数rand - 再通过脚本,由随机数推得原种子,利用脚本,得到种子
- 再利用种子得到第一次随机得到的数和第一次随机值与第二次随机值的和
尝试多个种子,最终得到对应的token以及第一次的随机数r,使用wp修改参数得到wp
|