题目信息
题目信息如下:
可以看到,key1和key2的值都为1的时候,才能拿到flag。再网上看,发现key1和key2的值取决于a,b和c的值。
<?php
highlight_file(__FILE__);
$key1 = 0;
$key2 = 0;
$a = $_GET['a'];
$b = $_GET['b'];
if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){
if(isset($b) && '8b184b' === substr(md5($b),-6,6)){
$key1 = 1;
}else{
die("Emmm...再想想");
}
}else{
die("Emmm...");
}
$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL;
foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL;
}
$key2 = 1;
}else{
die("no hack");
}
}else{
die("no");
}
if($key1 && $key2){
include "Hgfks.php";
echo "You're right"."\n";
echo $flag;
}
?> Emmm...
相关知识
- 这段代码是一个简单的PHP脚本。它有两个输入参数 a 和 a和 a和b,这些参数应该通过GET请求从URL中获取。
- 代码检查$a是否被设置,并且它的整数值大于6000000,并且它的长度不超过3个字符。
- 符号‘@’可以阻止错误在屏幕上显示。
PHP支持错误控制运算符,即符号(@)。当它被添加到PHP表达式前面时,使用该表达式可能生成的错误消息将被忽略。 - 一个字符串在没遇到字符前都是可以跟数字进行比较的,所以我可以在传入的数的最后添加任意字符就可以绕过字符比较
解题过程
- a的值
使用科学计数法,如1e9 - b的值
利用模块的MD5方法对字符串i进行编码,注意哈希之前必须要规定字符串编码类型,最后转化为16进制输出。输出结果取取倒数的6位字符,进行对比。
下图为错误示范:
正确代码:
import hashlib
for i in range(100000):
a = hashlib.md5(str(i).encode('utf-8')).hexdigest()
if a[-6:] == '8b184b':
print(i)
print(a)
显示结果如下图所示:
3. c的值
- 首先,将GET请求中的参数c解码为一个数组,并将其赋值给变量$c。此处使用了@符号,表示对可能出现的错误进行压制。
- 将c变量进行json解码,并转换为一个array数组
- 判断 c 是否是一个数组,并且 c是否是一个数组,并且 c是否是一个数组,并且c[“m”]不是一个数字,并且$c[“m”]大于2022。
- 如果满足以上条件,则继续判断 c [ " n " ] 是否是一个数组,且长度为 2 ,并且 c["n"]是否是一个数组,且长度为2,并且 c["n"]是否是一个数组,且长度为2,并且c[“n”][0]也是一个数组。
- 如果满足以上条件,则使用array_search函数在 c [ " n " ] 数组中搜索值为 " D G G J " 的元素,并将结果赋值给变量 c["n"]数组中搜索值为"DGGJ"的元素,并将结果赋值给变量 c["n"]数组中搜索值为"DGGJ"的元素,并将结果赋值给变量d。如果找到了匹配的值,则继续执行;如果没有找到,输出"no…"并终止程序。
- 接下来,使用foreach循环遍历 c [ " n " ] 数组中的每个元素,如果某个元素的值等于 " D G G J " ,则输出 " n o . . . . . . " 并终止程序。否则,将变量 c["n"]数组中的每个元素,如果某个元素的值等于"DGGJ",则输出"no......"并终止程序。否则,将变量 c["n"]数组中的每个元素,如果某个元素的值等于"DGGJ",则输出"no......"并终止程序。否则,将变量key2赋值为1。