攻防世界unserialize3题解

首先看题目知道是一道反序列化的题,说实话对于我这种菜鸡也是有点难度,这篇文章也是给像我一样的菜鸡写的,听大佬说写文章也是一种学习方式就试一下各位大佬轻点

#1概述

1.首先说到反序列化在这里给大家提一嘴反序列化作用,压缩格式化储存在数据传输中会比较方便,我们把一个东西放在磁盘里我们要用的时候可以随时把他拿出来,无论什么时候调用都可以恢复原样,听大佬说是用来解决php对象传递的一个问题---php在执行结束后会将对象销毁,而下一个页面要用到刚刚销毁的对象就用不了了(此时下一个页面心中也许会有一万个草泥马奔腾而过)而你又不能不销毁他,不然对象占用的内存又不能释放出来,当 PHP 脚本创建一个对象,但在使用完毕后未及时销毁该对象,就会导致该对象所占用的内存无法释放,从而导致内存泄漏。所以就想出了一个办法,就是php序列化要用的时候就反序列化一样就可以了,口头化一点序列化就是把对象传化成可传输的字符串而反序列化就是将字符串还原成对象(就像乘法和除法一样是互相的逆运算)

至于对象是个什么东东,解释在这:https://www.php.cn/faq/485330.html

2.举个栗子

<?php
class chybeta{
var $test='guangdong';
}
$class1 = new chybeta; //这里就是创建一个对象啦
$class1_ser = serialize($class1);  //将这个对象序列化
print_r($class1_ser);
?>

结果就是输出将对象序列化后的可传输字符串

解释一下:

O:7:"chybeta":1:{s:4:"test";s:9:"guangdong";}

O是object对象的意思

7代表函数名有7个占位

chybeta是对象名

1代表有一个变量

s就是string字符串

3.魔法函数

常见的几个魔法函数:
        __construct()当一个对象创建时被调用

        __destruct()当一个对象销毁时被调用

        __toString()当一个对象被当作一个字符串使用

        __sleep() 在对象在被序列化之前运行

        __wakeup将在序列化之后立即被调用

当我们碰到这几个魔法函数就要好好想一下序列化和反序列化了,如果服务器能接收反序列化过的字符串,将其变量未经任何过滤放入到魔法函数中就容易存在漏洞

#2实战

拿到题目了就给了这个

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

让我们康康有什么不对劲的东西

看到了魔法函数wakeup()

__wakeup()漏洞:一个对象被序列化后如果其属性被修改就不会执行此函数

那么这道题的思路就出来了:将这个对象进行反序列化传值修改其属性就可以绕过了

<?php
class xctf{
    public $flag = '111';
    public function __wakeup(){
        exit('bad requests');
    }
}
$c new xctf();
print(serialize($c));
?>

得到输出,大括号前的1是属性的个数将其修改即可绕过__wakeup()使exit()不被执行

拿到flag

这道题利用的是反序列化的知识:当被反序列化的字符串对应的属性个数发生改变会使反序列化失效---__wakeup()不可执行,如果不将1改成2那么就直接调用__wakeup()从而返回bad requests

顺便提一嘴这是我自己创建的交流群,欢迎各位大佬和像我一样的小白进群交流

正在跳转icon-default.png?t=N7T8http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=6tbGG0yujcD27t_W-5dv4aHt0wKFamos&authKey=4Gzz03Keq%2BnT5ByxFnoBtRdmXfLcqMRm2y3QVbk3VOUNgeVkVWLIt96BRaVKN2h8&noverify=0&group_code=922397467

回答: 对于攻防世界pwn新手题,其中一个关键是要修改全局变量pwnme的内容。通过格式化字符串的方法,可以实现这个目标。格式化字符串的原理是利用输入的格式化字符串,修改内存中的指定位置的值。具体的方法可以参考CTF-wiki上对格式化字符串的总结。另外,还可以利用栈溢出漏洞来实现攻击。栈溢出漏洞的原理是当输入的数据超过了栈的缓冲区大小时,会覆盖到相邻的内存区域,包括函数返回地址等重要信息。通过溢出覆盖system函数的参数为"/bin/sh",就可以获取到shell权限。在IDA32中,可以通过查看字符串窗口,找到可以直接利用的字符串,比如system和/bin/sh。这样就可以猜测需要溢出覆盖system函数的参数,实现获取shell的目的。12<em>3</em> #### 引用[.reference_title] - *1* *2* [xctf攻防世界pwn基础题解(新手食用)](https://blog.youkuaiyun.com/lplp9822/article/details/89735167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [攻防世界 pwn 二进制漏洞简单题练习区 答题(1-10题解)](https://blog.youkuaiyun.com/qq_33957603/article/details/122450397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值