[CTF] 攻防世界MISC高手区部分题目WriteUp(2)

记录一些有意思的题目

7-2

下载解压得到一个文件夹,里面有一堆文件,对所有文件名进行 base64 解码

# coding=utf-8
import os
import base64

for name in os.listdir("/root/桌面/problem"):
    print name
    # 由于文件名不是4的倍数,需要在后面补‘=’
    missing_padding = 4 - len(name) % 4
    if missing_padding:
        name += '=' * missing_padding
    print str(base64.b64decode(name.encode()))

看到输出的信息里只有这个文件解码后不是乱码:YWluaWRleGluZ3podWFuZw
base64
打开文件后看到里面存在一对花括号,那么很有可能这些数字解码后就是flag

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 74 94 22 42 91 23 {82 42 82 52 63 21 42 22 73 21 }00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

这次使用的是9键加密,第一个数字代表9键键盘下的数字,第二个数字代表该数字下的第几个字母。解密后再用一次凯撒加密即可得到 flag

wdflag{ylyoselfve}

ewm

下载解压后得到一个文件夹,打开看到里面是一堆二维码的部分图块,按大小被分为了 small 和 big 两部分,总共两个二维码,可以把图片拖到 word 里拼图,拼完的二维码扫出来就是 flag,而且两组图片拼图的结果都是一样的,这里给一个拼图的脚本(并不能完美的拼出来,但已经可以扫出来了)

import os
from PIL import Image
# 由于二维码并没有被完整的切开,都保留了一部分边缘
# 所以可以遍历所有图片来找到两个边缘符合的图片进行拼图

# 设置已知的图片
def set_image(in_file, x, y):
    code[y][x] = in_file
    file.remove(in_file)

# 找到一张图片的右边一张
def find_right(in_file):
    result = ''
    pixes = Image.open(os.path.join(current_path, in_file)).load()
    # 计算出已知图片的右侧像素值(以二进制存储)
    pix = 0
    for row in range(width):
        r, g, b = pixes[width-1, row]
        pix <<= 1
        if r + g + b > 255:
            pix += 1
    # 用同样的方法在剩下的图片里找到与已知图片边缘相符的图片
    for fi in file:
        pixes = Image.open(os.path.join(current_path, fi)).load()
        pix2 = 0
        for row in range(width):
            r, g, b = pixes[0, row]
            pix2 <<= 1
            if r + g + b > 255:
                pix2 += 1
        if pix == pix2:
            result = fi
            file.remove(fi)
            break
    return result

# 找到一张图片的下边一张
def find_bottom(in_file):
    result = ''
    pixes = Image.open(os.path.join(current_path, in_file)).load()
    pix = 0
    for col in range(width):
        r, g, b = pixes[col, width-1]
        pix <<= 1
        if r+g+b > 255:
            pix += 1
    for fi in file:
        pixes = Image.open(os.path.join(current_path, fi)).load()
        pix2 = 0
        for col in range(width):
            r, g, b = pixes[col, 0]
            pix2 <<= 1
            if r + g + b > 255:
                pix2 += 1
        if pix == pix2:
            result = fi
            file.remove(fi)
            break
    return result


if __name__ == '__main__':
	# 读取所有拼图文件
    current_path = r"C:\Users\28919\Desktop\big"  # r"C:\Users\28919\Desktop\small"
    file = [name for name in os.listdir(current_path)]
	# 计算拼图的大小
    n = int(len(file) ** 0.5)
	# 创建储存图片的数组
    code = [['' for i in range(n)] for i in range(n)]
	# 设置单张图片的边长
    width = 51
    # width = 42

    fail = False
	# 给出3个定位点,让脚本根据已知的图片进行拼图
    set_image('ebb9e03faca4_big.jpg', 0, 0)
    set_image('be557e464b98_big.jpg', 4, 0)
    set_image('13d9bb15c1c5_big.jpg', 0, 4)
	# 由于存在多张边缘相似的图片,对small进行拼图的时候需要多给一个数据
	# 但还是不能完美拼出来,但是拼出的结果可以扫出flag
    # set_image('f56e68b804ae_small.jpg', 0, 0)
    # set_image('dee457f4f9e0_small.jpg', 5, 0)
    # set_image('8e92d38c074c_small.jpg', 0, 5)
    # set_image('bb57a891b8c1_small.jpg', 0, 1)

    for y in range(n):
        if fail:
            break
        for x in range(n):
        	# 对未知的图片进行查找
            if code[y][x] == '':
                print('Find%d,%d' % (x, y))
                if x == 0:
                	# 如果是最左边的图片需要通过上方的图片来拼图
                    code[y][0] = find_bottom(code[y-1][0])
                else:
                	# 通过左边的图片进行拼图
                    code[y][x] = find_right(code[y][x-1])
                # 找不到就直接退出
                if code[y][x] == '':
                    fail = True
                    break
                else:
                    for i in code:
                        print(i)
    if fail:
        print('拼图失败!')
	# 根据已找到的图片拼出最终的图片
    image = Image.new('RGB', (n*width, n*width), (255, 255, 255))
    for y in range(n):
        for x in range(n):
            if code[y][x] != '':
                p = Image.open(os.path.join(current_path, code[y][x]))
                image.paste(p, (width * x, width * y))
    image.save(r'C:\Users\28919\Desktop\flag.png')

脚本拼图的结果:
big
small

flag{g00d_g00d_study_1jf8988}

Mysterious-GIF

下载得一个 gif 文件,分帧看看不到什么异常,丢到 kali 里用 binwalk 跑一遍
binwalk
发现有一个 zip 文件,用 foremost 命令分离出来,得到一个 temp.zip 文件
temp
这压缩包里就一个256字节的文件却占用112K的空间,明显不对劲,再用 binwalk 命令跑一下
binwalk
发现有一堆文件,再把它们分离出来(这里用binwalk分离的话可以自动解压),得到 partaa.enc 到 partke.enc 共计265个文件,enc文件是RSA加密后的文件,所以还需要找到私钥进行解密

先来了解一下 gif 的文件结构 https://blog.csdn.net/xlvector/article/details/589214
以 0x21FE 开头的注释扩展 (Comment Extension) 可以记录一些信息,我们在 010Editor 里搜索 21FE 看到有一些16进制字符
在这里插入图片描述
21FE后的80表示注释的长度,gif 的每一帧都有一个这样的注释,可以一个个将其复制出来,也可以在 kali 里用 strings 命令跑出来(最后一行开头的8是多余的,需要删掉)
strings
16进制转为字符串,给它加个文件头即可得到RSA的私钥

-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDdMNbL5qVWiCQrX2w69q/7y3ShIPueptxfAwRQbROre30c6Uw/oK8weZTx44m0ALouhV46KcQJkhrqg8Oy3s5Y5FV1wCK766u2WLwVrWMIUJG1jDDrRvYPIcQ5UqCp5EDQCioRMGcUZEg2uvl142LDBAaeOLzFM4e2JczS+0r85mPRrCSxjLKLaLwIIQnZXIpXSURV/wjhwWR1fJGG8Q+ucEApaXscNCUF44bPm4HPCJ/0mrDCTWH/Y2CPVJkNk+o0V7VOtHKsML4NCNAJH44W/IRwJntNW+N8HrgpRkFughmNjcwlEkrtUKG1sRCy//WhuDunV2phSRQvHotBZvydAgMBAAECggEBAJyaN3mlkunw+aq7pKUagv6CzdBGyd9JxDyApk1K7OI8TBhsFM/3tBFeA1Y/Av+uhCLrygrkBye/ic7/+05o8S9+egMkRXNHKAuyR3gRikwYvxEKcJgjZZLRFVyAY7/lGv4wNBh3bIPDfF1Dg9szYnkwIH9lLEFyemM74AiAYlcqdVdZIE/bq2Z4JO0t9HCgHZNfQ7JdRfejNJQVYUD01Qu5dMtOR4eIMdbWkhbVXw2TE0H7xQxtjwT6zUrpqEvvO7e3FHEsBIX65VRXRLbv9OoayJxcRqX8eJkRi4L/Yzo4KTpEmkduJLXsFwt3aqQTbjZHXOlTT4NEdsH2p0TsCAECgYEA/e1bszO0a1+cBaDQjQO+Pv9BsJFDB3o1LGuUHMNS8FDpn3J46UkYyk52vIa0v4TcjqSSHNIvXW0TDEUkbNFA1HpUxVxlw0Bieeh8Bg3HfXyQBhXvdTD7k0lsDmMEo4UPKYS6D5cYWyrwhd5nCD0LrxebgO75RxL5QEIE+4CVIQkCgYEA3v8R/XKRVJPE4aEeg7pQ4uTvcFxjENNexxf6K4xpY4Lf9clIvdecRhC2t1HdR+xSulU/RSaRrzHcw3xg+L1uO0s1t5S7f3nu3aihIXkcgGSqXCZ1VHzBmeC40TVsfAybs7qJ0xY6T5q8Mnx2Ob5Z3lIGuyhjeVatFII2Sdz2J/UCgYEAteA15zQojSPNH+bgmbBNqtev2GUjSo7I2UkwrC1nEYQS4cbfPdDCdd0fhMdDXU4vn+fWU9hkXpmKpCY+AccblVUNtNMKfIB4SHMxqjBia8o1anZ5rknoV8WmJOPdZbYfdxB/KD2ED4DBCFGVILyAyuew1PfWCodXiiP/Z5jgt+kCgYEArsxqoa0o1o9uiR7u+HsX5INoXT9OOGY3qQDWjURnaCWywMujRYy5ZwK690AooLRStNUV33K4SAhh8KqSqOh0e+4ckWb5Apfl8cK5a6+v88T09X8AAdY5PBG3Teb+vs5zTpMublTCKJw2YazGT8UyVN8ff53NO9QBoE3hmEyod/ECgYA9k0xyCJzcveKdxry6pjQxk9FZz3AtEp1ocV5VowagV+ONez/HccF8GJO8BDqlP6XkcLUtsnp6tYReEICIHKw5C+fwAXlFItm09aEVTXw+xzLJb2Sr6gATPWM5qVaubxfsb5mXH/wD9iCLhJSorK0RHZktPbEs5ytDsqBHd5PFFw==
-----END PRIVATE KEY-----

然后脚本解密所有文件并输出就得到flag了

# coding=utf-8
import os
import Crypto.PublicKey.RSA
import Crypto.Cipher.PKCS1_v1_5
path = r"F:\ShareFile\_out.gif.extracted"
# 读取所有文件
file = [name for name in os.listdir(path)]
flag = b''
# 载入私钥
cipher = Crypto.Cipher.PKCS1_v1_5.new(Crypto.PublicKey.RSA.importKey(open(r'F:\ShareFile\private.txt','rb').read()))
for fi in file:
    message = open(os.path.join(path,fi),'rb').read()
    flag += cipher.decrypt(message,b'rsa')
open(r'F:\ShareFile\flag.jpg','wb').write(flag)

flag

FelicityIsFun

crc

下载解压得到一个加密的zip文件,尝试暴力破解,解不出来
zip
但是里面 1.txt、2.txt、3.txt 都只有6字节,可以根据CRC的值把原文破解出来,爆破工具:https://github.com/theonlypwner/crc32
crc爆破
看到得到的结果中只有 forum_ 是一个有意义的字符,猜测原文为 forum_
但是文件内容太少不能进行明文攻击,继续尝试爆破出来另外两个文件
crc爆破
crc爆破
在结果中找到另外两个有意义的字符:91ctf_com_66 连起来就是 forum_91ctf_com_66
尝试用这串字符作为密码解压,解压成功,得到一个内容为二进制的 txt 文件,转为字符串得到一个 HTML 标签:

<img src=“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARgAAAEYCAIAAAAI7H7bAAAFR0lEQVR4nO3dQY5bNxBAQU+Q+1/ZOUGIgHlqN2eqtoYljfQfuGiQ/Pr9+/cv4P/5609/APgOhAQBIUFASBAQEgSEBAEhQUBIEPj78G9fX19jnyOXD5onv43Dh7/7GPkLLnmvSecnyooEASFBQEgQEBIEhAQBIUFASBAQEgROA9mDJftq8wHf09PJux/l7hPmD8DrT5QVCQJCgoCQICAkCAgJAkKCgJAgICQIXA5kD5bMGQ/u5oyT08mD/YPL/XuTP/EdWpEgICQICAkCQoKAkCAgJAgICQJCgkA/kH1aPqs9WDK4XDLhfZ0VCQJCgoCQICAkCAgJAkKCgJAgICQI/MSB7ORxu3dD0qdPTv6ZrEgQEBIEhAQBIUFASBAQEgSEBAEhQaAfyH7XHZf5Ib2Tu3EP9v9e+z/hLysSJIQEASFBQEgQEBIEhAQBIUFASBC4HMg+va1y/22wk7PaJTfqPv1E/bIiQUJIEBASBIQEASFBQEgQEBIEhASBrye2H26wZAS5f9z5M58oKxIEhAQBIUFASBAQEgSEBAEhQUBIEBgdyOYjyMkXnNwuerDkvQ6efqKuWZEgICQICAkCQoKAkCAgJAgICQJCgsDokcWTd63evWBuyfHIB0tmmkuG9desSBAQEgSEBAEhQUBIEBASBIQEASFB4HIgu8TTF4/ezWon9wvn8g3Iex4AKxIEhAQBIUFASBAQEgSEBAEhQUBIEDgdWbzkQOA7k/tql2wX3e/pw6LPrEgQEBIEhAQBIUFASBAQEgSEBAEhQeC0Q3Zy0+LkPO7p85aXDH/3HxZ95/r3siJBQEgQEBIEhAQBIUFASBAQEgSEBIHLI4uX3N25ZFZ78PT8dMmv/MQlwlYkCAgJAkKCgJAgICQICAkCQoKAkCDwbe+QnRwm7t/4eWfJtmVHFsNPISQICAkCQoKAkCAgJAgICQJCgsDlHbJLdiYOD9022H+x73c9A9mRxfBxQoKAkCAgJAgICQJCgoCQICAkCPR3yN6ZvKF1cgS55Duc3BQ8OSXfM8a1IkFASBAQEgSEBAEhQUBIEBASBIQEgdNAdslJvN916prPT/P3WnJR7MGe04ytSBAQEgSEBAEhQUBIEBASBIQEASFBoL9DNp92LRm63b1gPnV9+pTm/SPj6yfKigQBIUFASBAQEgSEBAEhQUBIEBASBC7vkD1YMj+9s+Qo5oMlxyNPWnIusYEsfJyQICAkCAgJAkKCgJAgICQICAkC/Q7ZgyWTtUmTM+inL6U9eOLvsiJBQEgQEBIEhAQBIUFASBAQEgSEBIHTQHbJrtX9m0yXDC73f4w7kwcdX394KxIEhAQBIUFASBAQEgSEBAEhQUBIEDgNZJ/emjq5G3dywjtpzw2tFy84zIoEASFBQEgQEBIEhAQBIUFASBAQEgQujyx+emI4uZN0cl/t03t4J9/rE3+yFQkCQoKAkCAgJAgICQJCgoCQICAkCPR3yE7e+HlnydbUJbPa3J5dq//mE7+yFQkCQoKAkCAgJAgICQJCgoCQICAkCPQD2adNDkmX7DI+mPyTl5xm7A5Z+JOEBAEhQUBIEBASBIQEASFBQEgQ+IkD2SWT0HwEObmVeNKS7b3nr9eKBAEhQUBIEBASBIQEASFBQEgQEBIE+oHsknHnnckh6eG9Jg9VXvJeB/kO2U9cL2tFgoCQICAkCAgJAkKCgJAgICQICAkCX58YTm3w9G2wk/8r9/TI+JoVCQJCgoCQICAkCAgJAkKCgJAgICQInAaywH9kRYKAkCAgJAgICQJCgoCQICAkCAgJAkKCwD96oQOE684L1QAAAABJRU5ErkJggg==”>

Base64转图片得到一张二维码,扫描即得到 flag

flag{owid0-o91hf-9iahg}

4433

下载解压得到一张 jpg 图片,用 StegSolve 打开发现图片太大显示不全,用 Photoshop 将图片缩小后打开,在 Red plane 1 里发现了一个疑似二维码的东西
疑似二维码
再打开原图找到指定位置发现一个清晰的二维码
二维码
扫描得到 …–.----…–… ,应该是摩斯电码,但不知道怎么分割,根据题目名称尝试以 4433 进行分割解码得到VYGUD,然而flag并不是这个,在摩斯电码中存在一些常用的缩写,VY 代表 VERY,GUD 代表 GOOD,所以正确的flag是 VERYGOOD

flag{VERYGOOD}

challenge_how_many_Vigenère

下载解压得到一段密文,题目让我们恢复明文,又根据 Vigenère 知为维吉尼亚加密,直接用爆破网站暴力破解 https://www.guballa.de/vigenere-solver(打开可能有点慢)
维吉尼亚密码的密钥越长越容易破解,调整好参数后破解:
维吉尼亚破解
得到密钥和明文:

密钥:ohihzkssefkmqxqbkihybnynvndzkdlqvhwhgywaftmeteecqprzjczvnmhnzwyasmlwbwvaqitejbfofycejjlcbpk
明文:aliceleavestheteapartyandentersthegardenwhereshecomesuponthreelivingplayingcardspaintingthewhiterosesonarosetreeredbecausethequeenofheartshateswhiterosesaprocessionofmorecardskingsandqueensandeventhewhiterabbitentersthegardenalicethenmeetsthekingandqueenthequeenafiguredifficulttopleaseintroduceshertrademarkphraseoffwithhisheadwhichsheuttersattheslightestdissatisfactionwithasubjectaliceisinvitedorsomemightsayorderedtoplayagameofcroquetwiththequeenandtherestofhersubjectsbutthegamequicklydescendsintochaosliveflamingosareusedasmalletsandhedgehogsasballsandaliceonceagainmeetsthecheshirecatthequeenofheartsthenordersthecattobebeheadedonlytohaveherexecutionercomplainthatthisisimpossiblesincetheheadisallthatcanbeseenofhimbecausethecatbelongstotheduchessthequeenispromptedtoreleasetheduchessfromprisontoresolvethematter

稍作处理得到:

Alice leaves the tea party and enters the garden where she comes upon three living playing cards painting the white roses on a rose tree red because the queen of hearts hates white roses. A procession of more cards, kings and queens and even the white rabbit enters the garden. Alice then meets the king and queen. The queen, a figure difficult to please, introduces her trademark phrase “off with his head”, which she utters at the slightest dissatisfaction with a subject. Alice is invited (or some might say ordered) to play a game of croquet with the queen and the rest of her subjects, but the game quickly descends into chaos. Live flamingos are used as mallets and hedgehogs as balls, and alice once again meets the cheshire cat. The queen of hearts then orders the cat to be beheaded, only to have her executioner complain that this is impossible since the head is all that can be seen of him. Because the cat belongs to the duchess. The queen is prompted to release the duchess from prison to resolve the matter.

看到这不用去 Google 也能猜到是爱丽丝梦游仙境,英文名称为 Alice’s Adventures in Wonderland,去掉空格和 ’ 再把大写换成小写,用破解得到的密钥加密即得到 flag

LCTF{osqjdcsvzjxfkoutsvdmoqcegnqc}

流量分析

下载得到一个流量包,全部是SQL注入的流量,在文件菜单里选择导出对象将所有HTTP对象导出
导出对象
观察文件名不难发现:只有倒数第四和倒数第二个数字在变化,用 dir 命令跑一遍发现有部分文件大小和其他的不一样,而且都是倒数第二个数字最大的
dir
将492字节和518字节的文件后缀名改为 html 打开对比一下
492
518
感觉518字节的文件应该有我们需要的信息
dir | findstr 518 打印出所有518字节的文件(Linux下用 ls -l | grep 518
findstr
按照倒数第四个数字的大小顺序将倒数第二个数字依次排列得到

102 108 97 103 123 99 50 98 98 102 57 99 101 99 100 97 102 54 53 54 99 102 53 50 52 100 48 49 52 99 53 98 102 48 52 54 99 125

将以上 Ascii 码转为字符得到 flag

flag{c2bbf9cecdaf656cf524d014c5bf046c}

未完待续…

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值