pop-study

 · 2020-4-7 · 次阅读


摘自:https://www.jianshu.com/p/e40b94f24361
POP:面向属性编程(Property-Oriented Programing)
用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链。在控制代码或者程序的执行流程后能够使用这一组低掉用链做一些工作了。

基本概念

POP链的构造是寻找程序当前环境中已经定义了或者能够动态加载的对象中的属性(函数方法)。将一些可能的调用组合在一起形成一个完整的、具有目的性的操作。反序列化过程是控制代码执行流程的方法之一,进行反序列化的数据能够被用户输入所控制。

类的构成

类成员包括由属性和方法构成,类属性存在于数据段,类方法存在于代码段,对于一个类来说,类的方法不占用类的空间,占空间的只有类的属性(占空间,大概就是占内存的同义)

序列化的定义:http://php.net/manual/zh/language.oop5.serialization.php

这里再记录一下
序列化:
所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

反序列化:
为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。如果想要在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义,可以通过包含一个定义该类的文件或使用函数spl_autoload_register来实现

由于无法控制对象的方法来调用,因而可以找一些会自己调用的魔术方法,常用魔术方法:

__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发
__invoke() //当脚本尝试将对象调用为函数时触发