CTFSHOW36D杯官方WP

名称:36D杯

平台:https://ctf.show

0x1 密码学

1.签到

密文:W9@F0>:2?0D9:07=28X/3/TUW/o/7/PUo/ST7/T/6/R

解题思路
提示rot,使用网站https://www.qqxiuzi.cn/bianma/ROT5-13-18-47.php进行解密,得到:

密码1_1

(hou_mian_shi_flag)^b^%&(^@^f^!&@^$%f^%^e^#

使用脚本进行替换

# -*- coding: utf-8 -*-
# @Author: ynm3000
# @Date:   2020-05-06 17:51:23
# @Last Modified by:   ynm3000
# @Last Modified time: 2020-05-06 22:22:42
# @email: kw2vgyt@gmail.com
# @link: https://ctf.show


org_str = "!@#$%^&*()"
string = "^b^%&(^@^f^!&@^$%f^%^e^#"
res = ''

for i in string:
    res += str(org_str.find(i)+1) if org_str.find(i)>-1 else i

print('flag{'+bytes.decode(bytes.fromhex(res),encoding='utf-8')+'}')
得到flag:

flag{keyboard_enc}

2.rsaEZ

解题思路

根据公钥得到私钥

python solve.py --verbose --key test/public.key --private

密码2_1

根据私钥逐个进行解密

openssl rsautl -decrypt -in test/encrypted.message1 -inkey test/private.key -out test/flag1.txt
openssl rsautl -decrypt -in test/encrypted.message2 -inkey test/private.key -out test/flag2.txt
openssl rsautl -decrypt -in test/encrypted.message3 -inkey test/private.key -out test/flag3.txt

读取flag

cat test/flag1.txt test/flag2.txt test/flag3.txt

密码2_2

flag{3b6d3806-4b2b-11e7-95a0-000c29d7e93d}

3.justShow

密文:hlcgoyfsjqknyifnpd:bcdefghijklmnopqrstuvwxyza

解题思路: 根据提示进行凯撒移位,发现后半部分以b开头,以a结束,即移位1,得到:

gkbfnxeripjmxhemoc:abcdefghijklmnopqrstuvwxyz

26位key的密码大胆猜测为普莱菲尔密码,使用下面网站进行解密 http://ctf.ssleye.com/playfair.html

得到flag: mima3

flagisctfshowicome
flag{ctfshowicome}

0x2 杂项

1.签到

解题思路:加群即可

2.Match3Game

解题思路: 连接地址后,得到主程序如图:

zx2_1

使用脚本自动计算,脚本如下:

from pwn import *
import time
r=remote("124.156.121.112",28008)
#r=process("./a.out")
context.log_level='warn'
board=[]

def checkmatch():
    for x in range(8):
        for y in range(8):
            if(y+1<8 and y+2<8 and board[x][y]==board[x][y+1]==board[x][y+2]):
                return True
            if(x+1<8 and x+2<8 and board[x][y]==board[x+1][y]==board[x+2][y]):
                return True
    return False

def checkmove(x,y,d):
    #hor
    if d==0:
        if(y+1>=8):
            return False
        temp=board[x][y]
        board[x][y]=board[x][y+1]
        board[x][y+1]=temp
        result=checkmatch()
        temp=board[x][y]
        board[x][y]=board[x][y+1]
        board[x][y+1]=temp
    #vec
    elif d==1:
        if(x+1>=8):
            return False
        temp=board[x][y]
        board[x][y]=board[x+1][y]
        board[x+1][y]=temp
        result=checkmatch()
        temp=board[x][y]
        board[x][y]=board[x+1][y]
        board[x+1][y]=temp
    return result
move=""
t1=time.time()
r.sendline()

while(1):
    move=""
    board=[]
    r.recvuntil("-----------------\n")
    r.recvline()
    for i in range(8):
        board.append(list(r.recvline()[1:-1]))

    for i in range(8):
        for j in range(8):
            if(checkmove(i,j,0)):
                move=str(j)+str(i)+'D'
            if(checkmove(i,j,1)):
                move=str(j)+str(i)+'S'
            if(move==""):
                continue
    else:
        r.sendline(move)
    #print(move)
    t2=time.time()
    if(t2-t1>38):
        context.log_level='debug'

3.暗中观察

解题思路: 直接使用wireshark追踪tcp流,可以看到登陆数据包,并截获登陆密码为:

teqtbz=ctfshowys168com

zx3_1

继续查看数据包,得到压缩包

zx3_2

使用上面的登陆密码解压缩,得到flag.txt

flag{36D_36D}

4.爱拼才会赢

出题思路

2019年的各种大型比赛经常出现拼图题目,venom圣诞时还专门出了一道拼图题

这些题目都是flag在图片上,所以有的没必要完全拼上,但这不是理想的拼图,既然要拼就必必须须全拼上。

所以这里采用hash的方式验证是否全拼完。为了解题方便我手动写了一个简陋的拼图界面。

解题思路

总结一句就是动脑越多解题越省劲

23*13的拼图看着不多,才298块,拼起来确实有点多题目所给链接是码云的gitpage,故意留了 http://ctfshow.gitee.io/subject_puzzle/README.md

可以通过这个了解拼图结果的验证逻辑或者也可以通过

http://ctfshow.gitee.io/subject_puzzle/js/data_init.js

这里是所有的逻辑代码,没有混淆(多善良的出题人)

从界面可以知道题图碎片是一个个单独的图片,还给了原图图片。

网页源码留了注释“其他高级功能等待大佬们的开发”

以上是所有可以得到的信息。

方法1、硬拼

就是拼,拼完就给flag

方法2、巧妙的拼

这就是网页里注释信息的意思。

静态网页的元素什么的都是可以动态操纵的,可以F12在console里执行代码改变网页的元素或事件,也就是改变拼图的功能代码,下面给几个例子

// 点击图片进行交换,开始拼图后再执行
let page_one = null;
let page_two = null;

function change_div(){
    var tmp_bg = page_one.css("background-image");
    page_one.css("background-image",page_two.css("background-image"));
    page_two.css("background-image",tmp_bg);
    check_now();
}

$(".hang div").click(function(){
    if(!page_one){
        page_one = $(this);
        $("h1").text("page_one");
    }else if(!page_two){
        page_two = $(this);
        $("h1").text("page_two");
        change_div();
        page_one = null;
        page_two = null;
    }
});
// 拼图导出字符串,可用于存档
var origin_str = '';
$(".hang div").each(function(i,e){
  var base = bg2base($(e).css("background-image"));
  if(base == 'empty'){ base = '';}
  origin_str += base;
});
console.log(origin_str);
// 字符串回显拼图,这里给出了拼成后的字符串,执行后即完成拼图
var origin_str = '5c2b316b52956639ece7fegac857dabcf8g0fff582b4b724d8cha4ag3341094d03760108290e04f1f38a70e1e25edcc50d96e6e53837g81a9f7ca1f77f835380614a435d7915403646ddf4ae5h1d026922458e994c0c1gehb875g2g926f997e41cfc1471c2ahc9fdd60f3234c08f8c922f3afaea72cbb23060g3fbf23cdh2ee0f6dgc613b0749d1h1e19db182cc1a89b8h5g6f472g2d4ef0d28g3b7b786g5554affgeg49b66a4b3gb99a7a77bhb3cc51874he9100bed94ac67dece86a0c4aabbfh7hg59e0a0h3hd45a4f123e642365a7cd11a97gbg2abd275f215025eeg67d9ca62881cgd9598990b19h8842bfef633fg11febc36c586h16b50gg784627e3556a3c7856dd5cae39g8d6edf173d1b068b44d3g420abd0a25ba59398d791cf2h734gba4868d10507e8adbe';
$(".hang div").each(function(i,e){
    if(i*2 < origin_str.length){
        $(e).css("background-image","url('./data/"+origin_str.substr(i*2,2)+".jpg')");
    }
});
check_now();

有了以上几个功能拼图时间至少可以减少一半,更多强大的功能自行开发

方法3、下载文件代码拼

既然给出了原图和拼图碎片,可以通过比较图片色值的方法“自动拼图”(原图可能需要稍作处理),然后串联文件名得到flag

这也是比较理想的解题方法,通过js了解验证逻辑和flag计算方法然后自行代码实现“拼图”

最后,虽然碎片图片文件名是有规律的,原本图片名是从小到大排序,但是为了防止根据文件名进行拼图,在使用碎片之前已经随机打散了一次,所以这条路是不通的。

5.ez-qrcode

解题思路

说再多都不如自己做做,原题wp

https://yous.be/2014/12/07/seccon-ctf-2014-qr-easy-write-up/

这里只是改了二维码的内容,题目中给的“部分”二维码已经包含了所有数据,要做的就是“手动解码”。

听说BJD比赛还是那个比赛有类似的题,这我还真不知道,最早我是在xctf做题遇到的然后搜到了这个原题wp

6.42

解题思路

没有任何难度简直就是送分题,附件压缩包尾部附加了图片zx5_1

图片是“幻影坦克”,制作过程自行搜索。即在背景是白色和黑色时分别显示不同的图片,当然这难不倒善于图片隐写的各位大佬的。

图片背景是黑色时就能看到flag(黑色可以试试QQ中的转发)

再来说说压缩包,是“zip炸弹”,被做题的大佬发现了我很高兴,这个压缩包原本只有42kb,但完全解压后保证能撑爆你的磁盘(https://unforgettable.dk/

解压密码就是42(文件名、题目名),用7zip打开可以看到压缩包中内容(大小,crc什么的)都是相同的,所以拿出一个0.dll来就行(对解题没有关系)

无关扩展:压缩包还有一种特殊的是“包含自身”的压缩包,有兴趣的自己研究

7.《JOJO的奇妙冒险》

解题思路

预期解 直接挂载/boot/efi

下载文件后根据提示,使用tobecontinue密码进行解压(脑洞)

得到flag文件,接近300M,查看后发现是16进制字符,转为二进制文件

使用EmEditor 替换0xa 为 0x0a “ ”为“” 然后替换”0x” 为 “”

zx6_0

得到16进制文本,使用HxD 生成二进制文件

zx6_1

使用脚本解密base64字符串,得到压缩包

# -*- coding: utf-8 -*-
# @Author: ynm3000
# @Date:   2020-05-07 15:56:02
# @Last Modified by:   ynm3000
# @Last Modified time: 2020-05-07 19:35:52
# @email: kw2vgyt@gmail.com
# @link: https://ctf.show
import os
import base64   
import sys
f = open("C:\\Users\\CTFshow\\Desktop\\36D杯官方wp\\题目\\杂项\\杂项6\\flag.txt", 'r', 1000)

strs=f.read()
f.close()
img = base64.b64decode(strs) 

ff = open("C:\\Users\\CTFshow\\Desktop\\36D杯官方wp\\题目\\杂项\\杂项6\\flag.txt", 'wb', 1000)

ff.write(img)  
ff.close()

得到一个压缩包,使用提示密码(JOESTAR)在kali里面解压

得到文件virt.qcow2

zx6_4

为QEMU文件,下载64位qemu

https://qemu.weilnetz.de/w64/2020/qemu-w64-setup-20200201.exe

配置环境变量

zx6_6

此时缺少uefi,从kali里面复制/usr/share/OVMF/OVMF.fd出来到qemu根目录uefi

新建批处理文件,配置虚拟机启动参数

qemu-system-x86_64.exe -drive file=virt.qcow2,index=5,media=disk -pflash uefi

启动虚拟机

zx6_7

使用用户名root 密码 tobecontinue 登陆

重启虚拟机,加入init参数

zx6_8

mount命令挂载分区到/mnt

mount -o r,w /

出现异常情况,下载下面ISO到qemu根目录,重启

https://mirrors.tuna.tsinghua.edu.cn/alpine/latest-stable/releases/x86_64/alpine-standard-3.11_rc1-x86_64.iso

修改批处理文件为:

qemu-system-x86_64 -drive file=alpine-virt-3.11.1-x86_64.iso,index=2,media=cdrom -drive file=virt.qcow2,index=3,media=disk -m 1024

修改/mnt/etc/fstab中 / 的uuid

poweroff关闭虚拟机

删除cdrom

重启,系统恢复正常

zx6_a

查看操作记录

cat /root/.bash_history

到/boot/efi中寻找flag

非预期解

得到一个带密码的压缩文件 使用给的第二个密码解密得到.qcow2镜像文件

用7z粗略地看了一下,发现一个flag文件

zx6_b

提出来是一串十进制数

zx6_c

直觉告诉我flag和这个有关,当ascii码转一下试试

zx6_d

不可读

凭着多年逆向签到题的宝贵经验,尝试用前几组数字和后几组数字分别和’flag’‘galf’做异或,发现了神奇的东西

zx6_e

19,18,17,16…排列

写了脚本直接拿到了倒着的flag

zx6_f

8.RunTheEXE

预期解

删除导入的DLL引用

zx8_1

非预期

自制一个dll模块

zx8_3

zx8_2

0x3 web

web题目全部wp请移步y1ng师傅博客

CTFshow 36D Web Writeup

0x4 pwn

pwn题目全部wp请移步fmyy师傅博客

CTFshow 36D pwn Writeup

0x5 逆向

更新中

CTFshow 36D rev Writeup

致谢与引用

WP引用:

y1ng admin Luz fmyy

出题人:

y1ng guoke ynm3000 ThTsOd admin 铭憨憨 笑天 summerN 不会修电脑 神说要有光

感谢所有支持CTFshow的朋友们!我们下次比赛不见不散!