2022CCS极客少年网络安全挑战赛部分Writeup

前言 

        极客少年挑战赛作为CCS成都网络安全大会的重磅赛事,自去年举办以来,已成为我国官方举办的面向未成年人规模最大、影响最盛、覆盖范围最广、参赛人数最多的网络攻防技能赛事之一。本届挑战赛在去年基础上进一步提升赛题设置合理性和专业性,以网络安全理论为基石,设置最前沿的CTF(夺旗赛)实战考察,既契合青少年知识储备,又强化网络安全专业技能,让参赛青少年在竞技中深度体验网络安全的趣味。

本次挑战赛将以“线上答题+线上交流”形式进行,参赛选手在线解题,内容涉及网络安全法律法规、数据安全、人工智能安全、二进制安全、Web漏洞与渗透(Web)、软件逆向(Reverse Engineering)、漏洞挖掘和利用(Pwn)等前沿网络安全知识。

目录:

一、Web

      1.1 DSOS

二、Reverse

      2.1 easy_re

      2.2 Fllaa

三、Misc

      3.1 1+1=all

 

Web

DSOS

1.访问网站发现DS_Store,.DS_Store 是 Desktop Services Store 的缩写,是 macOS 操作系统上的一个不可见文件。

 

2.访问.DS_Store,并下载txt文件

 

  1. 打开txt文件后发现 “flag here!c 4 f a 0 f 1 2 e 2 d 1 b c 0 a e 2 e e 2 4 d f 0 1 2 e 0 c b 7 . t x t”,将文件名去除空格后并访问此文件

 

3.访问后发现flag{1a0675f0ece1f96bd4d896862096134c}

 

 

FLAG:flag{1a0675f0ece1f96bd4d896862096134c}

Reverse

easy_re

1.打开文件并解压缩发现是一个pyc文件,应该是pyc逆向成py

 

  1. 将解压后的pyc文件放入在线网站进行反编译得到py脚本

 

  1. 分析后发现是一个异或的操作,直接写脚本,将操作逆序。

 

脚本如下:

import base64

def decode(message):

s = ''

message = base64.b64decode(message)

for i in message:

x = i-5

x = x ^ 50

s += chr(x)

return s

message = 'WWNYWk5cWEZQckdQVlQ='

flag = decode(message)

print(flag)

  1. 执行脚本得到flag

 

FLAG: flag{easy_pyc}

Fllaa

jeb静态分析

1.在程序的Mainactivity中我们发现他加载了fllaa.so文件,我们将原apk文件的后缀名改为zip并提取出来

 

2.接下来是获取输入部分

 

3.然后我们将字符串加密后使用安卓的反射机制调用函数对输入进行处理

 

4.最后就是check函数

 

ida动态调试

5.因为每次都要调用decode函数,特别特别麻烦,并且在so文件中RC4的密钥也是被加密过的

 

所以我们选择动态调试

反射机制调用的函数

6.通过动调可以知道在jeb中分析的反射机制调用的函数就是base64编码

魔改RC4

7.然后对base64编码后的部分进行魔改的RC4,魔改过程如下

将所有的密文异或0xC6

 

 

8.密钥流异或时多异或一个0x73

 

9.通过动调我们可以知道decode后的RC4_key为Hikari#a0344y3y#19301211

然后就是写脚本解密了

解密部分

#include<stdio.h>

#include <string.h>



void Rc4_init(unsigned char* S, unsigned char*K,unsigned char* key, unsigned long len)

{

	unsigned char  tmp = 0;

	for (int i = 0; i < 256; ++i)

	{

		S[i] = i;

		K[i] = key[i % len];

	}

	int j = 0;

	for (int i = 0; i < 256; ++i)

	{

		j = (j + S[i] + K[i]) % 256;

		tmp = S[i];

		S[i] = S[j];

		S[j] = tmp;

	}

	return;

}

void Rc4_encrypt(unsigned char* S, unsigned  char* flag,char*flag1)

{

	int len = strlen(flag1);

	int i = 0, j = 0,t = 0 ;

	unsigned char tmp = 0;

	for (unsigned long k = 0; k < len; ++k)

	{

		i = (i + 1) % 256;

		j = (j + S[i]) % 256;

		tmp = S[i];

		S[i] = S[j];

		S[j] = tmp;

		t = (S[i] + S[j]) % 256;

		flag[k] ^= S[t];

	}

}

int main()

{

	unsigned char S[256] = { 0 };

	unsigned char K[256] = { 0 };

	char code[512] = { 0xF0, 0x90, 0x10, 0xB7, 0xD1, 0x6E, 0x1D, 0x9A, 0xF0, 0x6D, 0xD8, 0x86, 0x3C, 0xC1, 0xB5, 0x4F,

	0x4D, 0x96, 0x9A, 0x85, 0xD9, 0xEC, 0x42, 0x5A, 0xCB, 0x16, 0x42, 0x9A, 0x4D, 0x32, 0x51, 0xD6,

	0xC6, 0x71, 0x6D, 0xB6, 0xF3, 0x04, 0x48, 0x3A, 0xC2, 0x26, 0x2D, 0xE4, 0x4D, 0x27, 0xBC, 0x3C };

	char decode[100] = { 0 };

	char key[] = "Hikari#a0344y3y#19301211";

	Rc4_init(S, K,(unsigned char*)key, strlen(key));

	for (int i = 0; i < 48; ++i) {

		code[i] ^= 0x73;

	}

	Rc4_encrypt(S, (unsigned char*)code, code);

	for (int i = 0; i < 48; ++i) {

		code[i] ^= 0xC6;

	}

	printf("%s", code);

	return 0;

}

10.得到结果ZmxhZ3stZmxsQF9zMF9uQDF2ZSMjeW91X2ZpbmRfbWUhISF9后进行base64解码

 

FLAG: flag{-fll@s0n@1ve##youfindme!!!}

Misc

1+1=all

  1. 将附件解压后打开是一个txt文件和zip压缩包文件

 

  1. 将flag1.zip打开后发现是二进制,应该是二进制转图片,字数为16000个字符,因此可以判断图片大小应该是400x400

 

  1. 将字符串放入脚本转成图片,设定大小为400x400。

脚本如下:

from PIL import Image

MAX = 400

#二维码大小

pic = Image.new("RGB",(MAX, MAX))

str = """二进制文件太长了这里直接省略啦emmmmm"""

# str为获取的01片段

i=0

for y in range (0,MAX):

    for x in range (0,MAX):

        if(str[i] == '1'):

            pic.putpixel([x,y],(0, 0, 0))

        else:

            pic.putpixel([x,y],(255,255,255))

        i = i+1

pic.show()

pic.save("1.png")
  1. 打开跑出来的图片发现是一半的二维码,那么另一半应该在压缩包中。

 

 

  1. 打开压缩包发现存在密码

 

  1. 使用压缩包密码爆破工具ARCHPR,得到密码pp8

 

  1. 打开后竟然不是二维码,将flag2.png拖入winhex查看

 

  1. 通过以往刷题经验,应该是修改图片宽度和高度,要使图片能够拼合图片长宽应该和前面一半二维码的尺寸一样,因此,通过对比将flag2.png的图片大小改成和flag1一样。

修改前

修改后

 

得到图片

 

  1. 将图片进行拼合,扫码后得到flag

 

 

 

 

FLAG: flag{adca24b024aeaecc74ed901e2426486c}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,我们需要分析题目所提供的代码: ```php <?php error_reporting(0); if ($_FILES["upload"]["error"] > 0) { echo "Error: " . $_FILES["upload"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["upload"]["name"] . "<br />"; echo "Type: " . $_FILES["upload"]["type"] . "<br />"; echo "Size: " . ($_FILES["upload"]["size"] / 1024) . " Kb<br />"; move_uploaded_file($_FILES["upload"]["tmp_name"], "upload/" . $_FILES["upload"]["name"]); echo "Stored in: " . "upload/" . $_FILES["upload"]["name"]; } ?> ``` 从上述代码中我们可以发现,这是一个文件上传的代码,该代码运行后会将用户上传的文件存储到 `upload` 目录下。 但是,该代码没有对上传的文件类型进行限制,这意味着我们可以上传任何类型的文件,甚至是一些恶意的文件。我们可以尝试上传一些常见的恶意文件,比如 `webshell`。 我们可以在本地创建一个 `webshell.php` 文件,然后上传到服务器上的 `upload` 目录。上传完成后,我们可以访问 `http://xxx.xxx.xxx.xxx/upload/webshell.php` 来执行我们上传的 `webshell`。 最后,我们需要注意的是,该上传脚本没有做任何安全性检查,这意味着我们可以上传任意大小的文件,这可能会影响服务器的性能,甚至导致服务器崩溃。因此,在实际应用中,我们应该对上传的文件大小进行限制,同时对上传的文件类型进行检查,从而确保服务器的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王八七七

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

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

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

打赏作者

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

抵扣说明:

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

余额充值