- 博客(84)
- 资源 (27)
- 收藏
- 关注

原创 ciscn_2019_n_3 题解
Write Up知识点关键字样本运行静态分析求解思路求解脚本知识点关键字UAF fastbin样本ciscn_2019_n_3运行检查样本 32位小端程序,开启了栈保护和NX保护。运行样本 样本的运行结果如上图所示:该程序主要模仿了一个笔记管理的功能,选项1可以开辟新的节点,会让选中是整型还是文本;选项2会让我们根据索引删除一个节点;选型3可以打印一个节点中存储的数据信息;选项4主要是打印一个随机生成的金钱数目,告诉你没法购买Pro版本。 此处不赘述也不一一截图运行结果,读者可
2020-12-30 16:25:31
697
原创 Android 开发笔记 -- Service
android 四大组件之一:Service;三种不同的服务类型:一个 Service 既可以是启动服务也可以是绑定服务:两个类:创建启动服务继承 Service 或者 IntentService 类;实现 onStartCommand 方法 或者 onHandleIntent;使用 startService 方法启动服务,Service 子类需要 stopSelf(自身调用) 或者 stopService(外部调用,如:Activity);前台服务:分类:原理总结:一个线程中只有一个 L
2022-06-12 20:18:14
782
原创 Java 类、抽象类与接口
Java 类、抽象类与接口基本概念类、抽象类和接口的区别与联系为啥要使用接口?代码实例分析接口和抽象类在设计时如何选择?代码实例分析利用匿名类实现抽象类的实例化基本概念类: 类是构造对象的模板和蓝图; java 只支持单继承,但可以实现多个接口;public class Test { ...}抽象类: 用 abstract 修饰的类为抽象类,有抽象方法的类一定是抽象类,抽象类可以没有抽象方法; 抽象类不能实例化出对象;public abstract class Test
2022-05-29 18:56:58
613
原创 Android 开发笔记 -- Activity
Activity基本概念AndroidManifest 配置生命周期保留实例状态Activity 之间的导航Activity 状态更改配置更改Activity 或对话框显示在前台点击返回按钮任务和返回堆栈管理任务进程和应用生命周期基本概念 简单理解:用户界面,MVC 中属于 Controller,Activity 经常会启动属于其它应用的 Activity。AndroidManifest 配置下面是 Activity 在 manifest 中的基本配置:<application ...&g
2022-05-22 19:25:05
584
原创 Java 常用基础知识总结
Java 常用基础知识总结Java 数据类型Java 四个访问控制符Java 关键字位运算类的初始化顺序Java 重载和重写Java equals 与 ==Java 多态 与 泛型Java 接口和抽象类的区别容器超有用的容器的静态方法异常Java 触发类加载的 4 种情况Java 数据类型基本数据类型 / 8:基本类型包装类sizebooleanBoolean4字节,编译器使用 int 类型代替byteByte1字节,有符号charCharacter2字节
2022-05-02 10:08:47
350
原创 shell 编程学习笔记
shell 编程学习笔记概述第一个 shell 脚本变量字符串和引号总结概述 本篇博客记录一下 shell 编程的一些常规操作,欢迎大家留言评论。第一个 shell 脚本 在 Linux 下使用文本编辑器编写如下的代码,并保存为test.sh,可以不要后缀名,此时该文件一般是没有可执行权限的。使用命令chmod +x test.sh添加可执行权限,然后./test.sh即可执行。#!/bin/bash # 指定解释器,也可以用 #!/bin/shecho "fanxinli" #
2021-12-04 23:52:35
435
原创 Java 多线程的三种实现方式
多线程的三种实现方式概述实现 Runnable 接口继承 Thread 类使用 Callable + FutureTask总结概述 这里记录 Java 多线程实现的三种方式。实现 Runnable 接口 第一种方式,实现 Runnable 接口,实现 run 方法,然后用 Thread 类实例化,最后调用其 start 方法,代码如下。class RunnableDemoTest implements Runnable { private String name; Run
2021-11-28 19:58:49
265
原创 pwn题堆利用的一些姿势 -- exit_hook
exit_hook概述exit_hook 介绍一个例子总结pwn题堆利用的一些姿势 – free_hookpwn题堆利用的一些姿势 – malloc_hookpwn题堆利用的一些姿势 – IO_FILEpwn题堆利用的一些姿势 – setcontext概述 在做堆题的时候,经常会遇到保护全开的情况,其中对利用者影响最大的是 PIE 保护和 Full RELRO ,NX 保护和栈保护对堆利用来说影响都不大,一般利用也不会往这方面靠。开了 PIE 保护的话代码段的地址会变,需要泄露代码段基地址才能
2021-11-27 19:50:53
2498
原创 Java 版二分查找算法
二分查找算法概述二分查找总结概述 这里我用 Java 语言实现了二分查找算法,虽然该算法的思维非常容易理解,但是在细节之处,比如在查找的边界上有很多值得注意的地方,这里不容小视。二分查找 如下是代码所示,请大家注意边界的处理,具体解释的话可以参考这个链接 – 二分查找的几种写法。public class Test { public static void main(String[] args) { // find 5 in arr[4], arr[5],
2021-11-21 20:26:54
700
原创 python 中三种方法实现十六进制 str 到 bytes 的转换
十六进制 str 到 bytes 的转换概述str ⇒ bytes总结概述 这里记录做 ctf 题目过程中编写 python 脚本常碰到的字符和字节的转换问题,不同于一般的字符串转字节,和二进制打交道遇到的都是以字符串形式表示的十六进制串,需要将其转换为字节做进一步的处理,所以才有了本篇博客的记录点。str ⇒ bytes python 代码如下。# res 为测试样本res = "B75285C190E907B8E41AC3BD1D8E8546002144AFEF7032B511C6"
2021-11-15 23:23:53
8190
原创 java 版二叉树相关算法实现
二叉树相关算法概述二叉树总结概述 本博客对二叉树的相关算法使用 Java 语言做了个实现。二叉树import java.util.Deque;import java.util.LinkedList;import java.util.Stack;class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = va
2021-11-15 11:43:01
934
原创 从0到1 Android安全学习之路 -- Java 字节码和 Dalvik 字节码
Java 字节码和 Dalvik 字节码概述源代码样例Java 字节码Dalvik 字节码总结概述 本篇博客将讲述 Java 源代码到字节码,字节码转汇编,以及 Android 中 Java 源代码转 Dalvik 字节码,Dalvik 字节码转 smali 汇编的一些操作。主要是熟悉一些基本工具的使用,这里做个总结。源代码样例 这里提供一份最简单的源代码示例,示例在于精而不在于复杂,当然肯定越简单越好,将下面的代码保存为HelloWorld.java文件,后面转 Java 字节码和 Dalvi
2021-11-13 19:26:22
5456
原创 Java 版单链表操作
单链表概述单链表总结概述 这里记录一下单链表的一些操作,代码使用 Java 实现。单链表class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; }}public class Sing
2021-11-13 15:15:10
324
原创 常用递归算法解决的问题
常用递归算法解决的问题概述阶乘斐波拉契数列总结概述 这里记录一下常用递归算法解决的一些问题。掌握好递归算法就是要注意两个问题,第一个是先写递归出口即终止条件,然后才是自身函数的调用。当然在这中间或者末尾可以有其它的一些处理逻辑,比如打印之类的函数。阶乘 所谓阶乘,就是n! = n*(n-1)*...*2*1,示范代码如下。// javapublic static int factorial(int n) { if (n == 1) return 1; re
2021-11-11 16:30:04
2000
原创 KMP 算法笔记
KMP 算法笔记概述算法实现总结概述 这里仅仅做一个笔记,我将用 java 实现一个常见的 kmp 算法版本,关于该算法的讲解和理解,大家可以移步去该专栏 – 如何更好地理解和掌握 KMP 算法?,上面已经有很多前辈讲解的很透彻了。算法实现public class KMPTest { // test public static void main(String[] args) { String haystack = "aaabbababcabaaaa
2021-11-09 20:24:45
539
原创 关于 android 工具 uiautomatorviewer.bat 无法正常启动的问题
解决 uiautomatorviewer.bat 无法正常启动概述问题解决过程总结概述 .bat是 windows 下的批处理脚本,很多 android 工具都是以xxx.bat的方法来启动的,这些批处理脚本中命令的作用一般都是用来寻找 Java 环境变量和 jar 路径。因此使用 android 工具遇到 bat 脚本无法正常工作,这是一类问题,大家可以举一反三。问题解决过程 我遇到的问题报错和如下链接中的截图是一样的,uiautomatorviewer无法启动踩的坑。首先我个人安装的是目前最
2021-10-30 09:42:41
3132
原创 从0到1 Android安全学习之路 -- 环境篇
安卓( Android ),是一种基于 Linux 内核的自由及开放源代码的操作系统,主要用于移动设备,如智能手机和平板电脑,是美国谷歌公司旗下的移动操作系统。安卓之所以如此热门,在于其应用领域在近些年来得到了极大的扩展,衍生到了电视、数码相机、游戏机、穿戴设备等领域,所以研究安卓安全可以覆盖很大的受众范围。
2021-10-03 11:07:52
633
原创 2021-鹏城实验室网络安全技能大赛-pwn-babyheap 题解
Write Up文件信息漏洞定位利用分析WP总结文件信息 本题来自于2021年的鹏程杯比赛的pwn题,题目链接如下:2021-鹏程杯-pwn-babyheap。 该题目主要考查了libc-2.29.so及以上版本的off-by-null利用方式,本题目使用的是libc-2.31.so,知识点学习推荐博客glibc2.29下的off-by-null。同时作为堆题,保护全开,没有可用的show功能函数,必须使用IO_FILE来leak libc,知识点学习推荐博客pwn题堆利用的一些姿势 – IO_F
2021-09-28 20:42:31
2607
7
原创 CTF 逆向工具angr的学习笔记
angr概述基本用法总结概述 angr 简单介绍一下angr,借助官方的原话就是 – A powerful and user-friendly binary analysis platform!,一个功能强大且用户友好的二进制分析平台。这里主要总结一下使用angr解决ctf逆向题的一些用法和套路。 安装的话,大家可以直接使用pip安装,不过这里可能会遇到一个小坑。我在安装angr之前已经安装了pwntools,此时再安装angr,由于有一个依赖库两者需要的版本是不一样的,所以安装后导致pwnt
2021-09-14 23:12:09
4274
2
原创 羊城杯_2020_babyre 题解
babyre题目信息考查知识题目分析WP脚本总结题目信息 本题目来自于2020年羊城杯的逆向题,可以在buuoj上找到题目复现。考查知识 本题目考查的知识点有:DES/AES算法,SMC自修改代码,以及合理利用动态调试来快速解题。 关于动态调试,这里很多人可能会遇到环境问题,主要是因为题目调用了openssl的动态加密算法库,所以本地也得有一个。同时还需要注意openssl加密算法库的版本问题,该题目必须使用libcrypto.so.1.0.0。这里我给出该算法库文件 – libcrypto
2021-09-09 15:33:56
1383
原创 python z3库学习
z3库学习概述z3库的安装申明求解变量范围增加方程约束与求解总结概述 最近做逆向题,有很多线性方程需要用该库进行求解,故写篇博客记录一下。z3库的安装$ pip install z3# 上面命令失败的话可以尝试$ pip install z3_solver申明求解变量范围from z3 import *# a为整数解,Ints用于一次性申请多个a = Int("a")a, b = Ints("a b")# 有理数解a = Real("a")a, b = Reals("a
2021-09-08 15:41:14
2362
原创 python常用函数积累
常用函数积累概述进制转换字符和数字互转字符类字符编码 / str <==> byte总结概述 用python最大的感觉就是方便,因为python中有很多API提供了非常方便的操作,能够实现一些常见的进制转换,编码转换以及字符串的大部分操作,这里记录一下。进制转换In [4]: a = 10In [5]: bin(a) # 转二进制Out[5]: '0b1010'In [6]: oct(a) # 转八进制Out[6]: '0o12'In [7]: hex(
2021-09-07 10:49:21
223
原创 CTF pwn/re手在学习过程中的零碎操作积累
零碎操作积累概述使用指定版本的libc运行pwn题使用指定版本的libc编译源程序总结概述 谨以此片文章为我那不争气的记性做个记录,随便造福大家,另外如果各位看官也有些骚操作或者基操的话,也请不吝赐教,留言评论,在下定临表涕零,感激不尽。使用指定版本的libc运行pwn题 这里给几个下libc的网站:ubuntu glibc官网清华大学开源镜像站 使用指定版本libc运行pwn题的终端操作:# 指定libc$ LD_PRELOAD=/usr/local/libc/libc-2.2
2021-09-06 21:55:59
1632
原创 python实现tea/xtea/xxtea加密算法
tea/xtea/xxtea加密算法概述teaxteaxxtea总结概述 这里记录一下采用python实现三种加密算法的方式,话不多说,直接上代码。teafrom ctypes import *def encrypt(v, k): v0, v1 = c_uint32(v[0]), c_uint32(v[1]) delta = 0x9e3779b9 k0, k1, k2, k3 = k[0], k[1], k[2], k[3] total = c_uint3
2021-09-05 20:27:39
5686
原创 tea系列加密算法学习笔记
tea系列加密算法概述tea算法xtea算法xxtea算法总结概述 最近在做ctf逆向的题目中多次遇到了该算法,因此打算重写一篇完整的博客来详细学习下该算法。 TEA(Tiny Encryption Algorithm),是一种分组加密算法,实现过程比较简单,从其名字也能看出这是一种微型的加密算法,效率极高。该系列一共有三种算法,tea --> xtea --> xxtea,从右往左依次是前面的升级版。此系列算法都使用了一个神秘常数作为倍数,源于黄金比率,程序中一般写作0x9E3779
2021-09-03 10:56:22
4371
原创 x86汇编语言杂记
杂记概述汇编语言中"\x00"的妙用总结概述 这里记录一下在做ctf比赛过程中遇到的一些特殊汇编指令以及利用一些opcode来解题的方式,一来防止忘记,二来方便他人。汇编语言中"\x00"的妙用 本小节的灵感来自于pwn题 – starctf_2019_babyshell,buuoj上有复现,题目本身很简单,分析过程就不贴IDA截图了。题目的意思就是让我们直接输入一段shellcode,然后会执行它,当然输入的shellcode必须是在规定的一些字符内。如果完全按照这个要求去构造shellcod
2021-09-01 19:03:01
549
原创 CTF Blind pwn题型学习笔记
Blind pwn概述如何辨别漏洞类型逻辑漏洞盲打格式化字符串盲打原理阐述例题讲解axb_2019_fmt32栈溢出盲打堆盲打总结概述 所谓Blind pwn,即是在无法获得二进制程序文件的情况下对题目进行漏洞利用。这篇博客主要是将见到过的盲打pwn题做一个总结,大概可以分为以下几类盲打pwn题:逻辑漏洞盲打、格式化字符串盲打、栈溢出盲打、堆盲打。如何辨别漏洞类型 对于盲打题,首先第一步应该是判断属于哪种类型的盲打,判断的步骤也很简单,nc连上后,直接看程序提供的菜单功能。 一般来说,需要逻
2021-08-31 22:20:52
2312
4
原创 AFL (American fuzzy lop) 二进制程序模糊测试工具学习
AFL前言AFL的安装AFL运行界面介绍fuzzing -- 有源码的程序fuzzing -- 无源码的程序总结前言 在学习了一段时间的pwn后,我个人对漏洞挖掘也是充满了极大的兴趣,但是真实环境中的漏洞挖掘和CTF中的pwn题还是有很大区别的。原因在于,CTF中的pwn题代码量少,实现逻辑并不复杂,存在的漏洞也是比较明显的,一般都是通过代码审计就能发现;而在真实环境中,代码量大,实现逻辑复杂,虽然造成漏洞的代码可能和pwn题相差不大,但是在庞大的代码量下,通过代码审计的方式来发现漏洞并不是一个好的方
2021-08-14 15:00:05
6143
3
原创 2021DASCTF实战精英夏令营暨DASCTF July X CBCTF 4th -- WP [pwn]
WP概述EasyHeaprealNoOutputold_thing总结概述 前天又参加了一次激动人心的比赛,好吧,确实只能说是激动人心,毕竟没有物质回报,好的名次和中将名额总是和自己无缘。废话不多说,直接看wp。 所有题目和环境都在buuoj上有复现,这里感谢buuoj在我学习ctf过程中提供的做题环境以及时不时搞几场比赛来激励(打击/(ㄒoㄒ)/~~)我努力学习。EasyHeap 题目是常规的堆题,64位程序,保护全开,漏洞也算明显,当然对strdup函数功能不熟悉的同学可能需要调试后才能
2021-08-03 23:29:44
1485
4
原创 python实现二叉树的相关算法
二叉树的相关算法实现概述代码总结概述 二叉树,作为数据结构中重要的一员,掌握好其相关算法是非常有必要的。在本博客中,我将会用python实现二叉树的前序、中序以及后序遍历,同时也实现了利用前序+中序求后序,或者利用中序+后序求前序等相关操作。代码 话不多说,下面直接给代码,所有算法都用递归的方式求解,所以本身逻辑并不复杂,此处就不再详细解释其算法原理。class Node: def __init__(self, value): self.value = value
2021-07-21 16:24:25
357
原创 CTF之二进制逆向学习 -- 混淆算法积累
混淆算法积累概述JSFUCK总结概述 最近做逆向题,开始遇到代码混淆相关的知识点,这里做一个纪录,一来防止遗忘,二来供大家学习参考。JSFUCK jsfuck混淆是基于js的原子性,它可以用6个字符来实现js编程,这6个字符是()[]+!。如下代码所示,是alert(1)的混淆代码展示,将下面代码粘贴到控制台即会弹窗1。[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[]
2021-07-19 21:49:24
1097
1
原创 BUUCTF crackMe 题解
crackMe程序信息题目分析main函数分析sub_401830关键函数分析动态调试byte_416050求解总结程序信息 这道题目来自于哪个实际比赛,我没有去找,我个人是从buuoj上刷到的,位于re部分第二页,题目只有一分,做出来的人也比较多,看起来应该是个简单的题目。 之所以要写这个wp,是对题目的答案存在一些疑问,网上也有很多wp,我都看了一下,大致都出自于同一个人的手笔O(∩_∩)O。我个人感觉网上的wp分析过程都漏了一步,虽然这样得出的flag可以通过buuoj,但是这是个crack
2021-07-12 10:46:00
3759
20
原创 CTF之web学习记录 -- 网站信息搜集
网站信息搜集概述GitHackDirSearch总结概述 我个人自学web已经有了一段时间了,但总感觉少了些什么,从做题角度上来讲,遇到的web题要么是直接给了源码需要审计的,要么是会给足够的提示,让你知道是考察注入还是文件上传等。那么如果不给源码,不给提示呢,我们面对一个功能众多的网站该如何下手?此时就需要这一章的内容,我愿称其为web学习中灵魂的章节。 接下来我将根据做题的积累,介绍下ctf中常用的一些信息搜集思路和工具。GitHack GitHack 现在的开发人员使用git进行版
2021-07-06 20:57:23
774
原创 CTF之web学习记录 -- 命令注入
命令注入概述常见攻击方式使用管道符号escapeshellarg和escapeshellcmd命令执行漏洞修复总结概述 web服务器后端代码有时会调用一些执行系统命令的函数,以常见的php语言为例,使用system/exec/shell_exec/passthru/popen/proc_popen等函数可以执行系统命令。因此一旦我们可以控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。常见攻击方式使用管道符号 我们以一段简单的php代码为
2021-07-04 21:13:46
1516
4
原创 CTF之web学习记录 -- SSRF
SSRF概述SSRF原理SSRF漏洞修复一道例题总结概述 SSRF(Server-Side Request Forgery)服务器端请求伪造,是一种由攻击者构造请求,服务器端发起请求的安全漏洞。当然之所以要这样曲折,是因为SSRF的目标一般是外网无法访问的内部系统,所以需要用服务器端发送。SSRF原理 SSRF形成的原因在于服务器端提供了从其它服务器应用获取数据的功能且没有对目标地址做过滤和限制。通过该漏洞我们可以攻击内网的服务器,获取相应的资源信息,利用file协议读取内部网络文件等。 如
2021-06-29 20:49:13
2068
2
原创 pwn题堆利用的一些姿势 -- setcontext
setcontext概述setcontext介绍setcontext具体操作setcontext实例总结pwn题堆利用的一些姿势 – malloc_hookpwn题堆利用的一些姿势 – free_hookpwn题堆利用的一些姿势 – IO_FILE概述 在做堆题的时候,经常会遇到保护全开的情况,其中对利用者影响最大的是PIE保护和Full RELRO,NX保护和栈保护对堆利用来说影响都不大,一般利用也不会往这方面靠。开了PIE保护的话代码段的地址会变,需要泄露代码段基地址才能利用存储在bss段上
2021-06-27 20:13:06
3634
4
原创 CTF之二进制逆向分析 -- 密码学知识积累
密码学知识积累概述凯撒密码base64加密总结概述 在ctf比赛中,逆向这块很大一部分都是在考查密码学的知识,其中需要逆向的代码基本都会是一些加解密的操作,因此有必要学习和积累一些常见的密码学知识。当然这里我们并不太需要知道如何使用密码学上的方法去破解加密密文,如果一定要破解的话,也是有工具和对应程序实现的。因此我们要做的就是去熟悉这些密码学的加密方式,并在逆向代码中认出来。凯撒密码 凯撒密码(Caesar),相传为凯撒所创,属于古典密码学中的移位密码。这种加密方式比较简单,就是将字母的对应关系
2021-06-23 09:29:01
7887
原创 CTF之web学习记录 -- 文件上传
文件上传概述一句话木马常见攻击手段JS检测绕过攻击总结概述 所谓文件上传漏洞,就是web服务器对上传的文件没有做好检测和过滤,从而使得恶意用户可以上传脚本程序到服务器,进而获得服务器权限。这个恶意脚本文件,又被称为WebShell,因此也可以将WebShell脚本作为一种网页后门,一般通过上传的脚本文件,我们可以查看服务器的目录结构和文件,亦或者执行系统命令等。一句话木马 这里先介绍web服务器没有对上传的文件进行任何检测的情况下,我们应该如何攻击。 利用一句话木马,即上传一句话木马脚本文件
2021-06-21 12:25:08
1573
3
原创 2021 DASCTF X BUUOJ 五月大联动WP
DASCTF X BUUOJ 五月大联动WP概述pwnDASCTF_X_BUUOJ_2021_ticketDASCTF_X_BUUOJ_2021_cardre总结概述 这个五月我又参加了一次不留痕迹的ctf比赛,之所以叫不留痕迹,是因为总是拿不到好的名次????,比赛结束前1小时还能苟进前10,不过后面还是被反超了。不好在安慰自己,新手嘛,刚刚上路,稳扎稳打,持续努力,定有收获。 这个比赛完整环境可以在buuoj上找到,简单分析一下题目分布情况,pwn 2道,re 2道,web 2道,crypto
2021-05-30 19:36:03
1992
7
原创 CTF pwn题之虚拟机题型详解
虚拟机题型详解概述如何分析一个例子总结概述 随着对pwn题的学习,慢慢开始接触VM虚拟机的pwn题了,刚开始做这种类型的题时会发现代码量比较大,略显复杂,复杂的部分主要是在用程序实现虚拟机指令那里。 其实这种题做法和普通pwn类似,也是寻找漏洞,复杂的地方在于需要我们去分析出虚拟机实现的指令,然后用这些指令操作进行漏洞利用。如何分析 接下来介绍下如何分析,对于VM类型的pwn题,复杂的地方在于分析出该VM对应实现的指令,那么如何分析需要一定章法。这里需要简单知晓一些计算机组成原理和汇编语言的
2021-05-24 16:44:50
1759
libcrypto.so.1.1
2020-12-24
0ctf-2017-pwn-char
2021-02-05
level0 -- 攻防世界新手题
2021-01-19
hacknote.zip
2020-12-30
Seccon-CTF-2016-cheer_msg
2021-02-24
cmcc--simplerop
2021-03-28
simple_calc
2021-02-18
apprentice_www
2021-02-07
ciscn_2019_n_3
2020-12-30
secret_file
2020-12-24
get_started_3dsctf_2016|get_started_3dsctf_2016
2020-12-11
CSAWCTF-2018-pwn-shellcode|CSAWCTF-2018-pwn-shellcode
2020-12-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人