祥云杯2020 线下一血Misc分享

  • A+
所属分类:逆向工程

本次线下赛由Tr0jAnV1rU4,chumen77,NonupleBroken三人出征,最终获得了一等奖(第三名)的成绩,现在就过程中遇到的一题misc分享下思路。

祥云杯2020 线下一血Misc分享
大约在冬季
-ABOUT IN WINTER-
祥云杯2020 线下一血Misc分享

祥云杯2020 线下一血Misc分享
右侧为TLS CTF组的三位师傅



题目是一个图片题,也算是比较技术流的隐写了(最少比stegslove一把梭的题质量好太多

给了三个文件 secret.png hint.md 以及 flag.crypto(这个地方同时考察了一个工具,后边再说。(题目文件在公众号回复“祥云杯”获取

祥云杯2020 线下一血Misc分享

hint中写的很清楚,需要我们了解颜色的本质,以及下半截中提到了G是最好的,很自然的想到色彩标准RGB中的G,首先拿stegslove查看了整个G色道,虽然有规整的黑白色块,最开始以为是二维码,dump下来大致分析后就知道并不是了。

用python处理一下图片看看G色道的值,这里对图片处理选择了每个色块距离右上角横竖距离均为5像素的位置(用中心应该更方便,但是当时没想到...)


# -*- coding: utf-8 -*-
# @Project: Hello Python
# @File : 20-图片处理
# @Author : Tr0jAn <[email protected]>
# @Date : 2020-12-13
from PIL import Image

img = Image.open('C:/Users/86176/Desktop/secret.png')
picture = img.load()

List = []
lower = 5
upper = int(560 - (560 / 20) + 5)
step = int(560 / 20)
for x in range(lower, upper +1, step):
for y in range(lower, upper + 1, step):
List.append(picture[x, y][1])
print(List)# [237, 96, 69, 58, 64, 63, 9, 101, 84, 208, 115, 21, 104, 116, 101, 105, 97, 105, 159, 84, 71, 58, 116, 75, 119, 116, 31, 116, 71, 126, 84, 103, 105, 143, 168, 105, 69, 104, 101, 75, 224, 188, 114, 75, 101, 132, 71, 101, 205, 126, 75, 146, 51, 165, 128, 113, 105, 152, 69, 116, 101, 89, 115, 154, 22, 64, 109, 141, 58, 104, 69, 68, 252, 114, 9, 236, 58, 115, 104, 180, 55, 104, 207, 105, 114, 58, 116, 101, 69, 75, 71, 58, 58, 84, 75, 58, 101, 84, 71, 69, 54, 116, 101, 115, 105, 115, 116, 126, 51, 75, 114, 75, 64, 69, 66, 71, 240, 89, 89, 101, 116, 101, 83, 101, 69, 58, 71, 51, 58, 114, 115, 89, 64, 104, 84, 89, 220, 122, 69, 64, 114, 89, 51, 89, 51, 179, 166, 58, 126, 126, 71, 69, 69, 71, 102, 69, 149, 101, 69, 69, 101, 51, 98, 101, 89, 11, 104, 116, 89, 191, 104, 104, 51, 115, 56, 101, 126, 5, 116, 31, 146, 69, 64, 93, 175, 84, 164, 101, 114, 185, 101, 75, 89, 51, 104, 56, 58, 105, 105, 104, 84, 71, 58, 73, 114, 115, 126, 43, 27, 89, 104, 51, 53, 105, 58, 115, 107, 104, 116, 232, 114, 51, 75, 89, 8, 28, 51, 246, 104, 85, 89, 116, 48, 69, 116, 125, 45, 186, 174, 115, 64, 176, 116, 116, 31, 222, 123, 64, 20, 104, 75, 114, 75, 72, 152, 69, 112, 104, 58, 58, 151, 33, 241, 126, 104, 116, 101, 105, 114, 183, 104, 64, 207, 75, 71, 51, 75, 165, 8, 115, 58, 0, 167, 115, 105, 224, 142, 116, 78, 101, 69, 116, 51, 116, 105, 105, 97, 240, 75, 114, 115, 71, 177, 104, 207, 236, 89, 89, 141, 75, 69, 104, 116, 89, 75, 235, 84, 75, 115, 101, 105, 84, 156, 11, 191, 146, 114, 71, 75, 126, 114, 246, 115, 89, 129, 89, 69, 75, 101, 104, 75, 53, 126, 71, 177, 84, 116, 104, 115, 100, 224, 64, 115, 16, 115, 64, 104, 193, 49, 116, 191, 64, 255, 251, 104, 84, 113, 105, 116, 89, 204, 126, 226, 184, 105, 64, 89, 53, 225, 101, 71, 180, 57, 71, 105, 85, 69, 174, 75, 51, 28, 188, 235, 170, 52, 105, 116, 114, 24, 179]

观察这些数值没什么思路,索性转了ascii码看看有没有什么信息


í`E:@? eTÐshteiaiŸTG:tKwttG~Tgi¨iEheKà¼rKe„GeÍ~K’3¥€qi˜EteYsš@m:hEDür ì:sh´7hÏir:teEKG::TK:[email protected]ðYYeteSeE:G3:[email protected]Ü[email protected]³¦:~~GEEGfE•eEEe3beYhtY¿hh3s8e~t’[email protected]]¯T¤er¹eKY3h8:iihTG:Irs~+Yh35i:skhtèr3K3öhUYt0Et}-º®[email protected]°ttÞ{@hKrKH˜Eph::—!ñ~hteir·h@ÏKG3Ks: §siàŽtNeEt3tiiaðKrsG±hÏìYYKEhtYKëTKseiTœ¿’rGK~rösYYEKehK5~G±Tthsdà@[email protected]Á1t¿@ÿûhTqitYÌ~â¸[email protected]áeG´9GiUE®K3¼ëª4itr³

乍一看还以为是某种加密,但是仔细查看后,发现有很多重复的字母而且就那几个例如:EeTshteia等等,统计下各个字符出现的次数,并按照出现次数从高到低排序

from collections import Counter
List = ['í', '`', 'E', ':', '@', '?', 't', 'e', 'T', 'Ð', 's', 'x15', 'h', 't', 'e', 'i', 'a', 'i', 'x9f', 'T', 'G', ':', 't', 'K', 'w', 't', 'x1f', 't', 'G', '~', 'T', 'g', 'i', 'x8f', '¨', 'i', 'E', 'h', 'e', 'K', 'à', '¼', 'r', 'K', 'e', 'x84', 'G', 'e', 'Í', '~', 'K', 'x92', '3', '¥', 'x80', 'q', 'i', 'x98', 'E', 't', 'e', 'Y', 's', 'x9a', 'x16', '@', 'm', 'x8d', ':', 'h', 'E', 'D', 'ü', 'r', 't', 'ì', ':', 's', 'h', '´', '7', 'h', 'Ï', 'i', 'r', ':', 't', 'e', 'E', 'K', 'G', ':', ':', 'T', 'K', ':', 'e', 'T', 'G', 'E', '6', 't', 'e', 's', 'i', 's', 't', '~', '3', 'K', 'r', 'K', '@', 'E', 'B', 'G', 'ð', 'Y', 'Y', 'e', 't', 'e', 'S', 'e', 'E', ':', 'G', '3', ':', 'r', 's', 'Y', '@', 'h', 'T', 'Y', 'Ü', 'z', 'E', '@', 'r', 'Y', '3', 'Y', '3', '³', '¦', ':', '~', '~', 'G', 'E', 'E', 'G', 'f', 'E', 'x95', 'e', 'E', 'E', 'e', '3', 'b', 'e', 'Y', 'x0b', 'h', 't', 'Y', '¿', 'h', 'h', '3', 's', '8', 'e', '~', 'x05', 't', 'x1f', 'x92', 'E', '@', ']', '¯', 'T', '¤', 'e', 'r', '¹', 'e', 'K', 'Y', '3', 'h', '8', ':', 'i', 'i', 'h', 'T', 'G', ':', 'I', 'r', 's', '~', '+', 'x1b', 'Y', 'h', '3', '5', 'i', ':', 's', 'k', 'h', 't', 'è', 'r', '3', 'K', 'Y', 'x08', 'x1c', '3', 'ö', 'h', 'U', 'Y', 't', '0', 'E', 't', '}', '-', 'º', '®', 's', '@', '°', 't', 't', 'x1f', 'Þ', '{', '@', 'x14', 'h', 'K', 'r', 'K', 'H', 'x98', 'E', 'p', 'h', ':', ':', 'x97', '!', 'ñ', '~', 'h', 't', 'e', 'i', 'r', '·', 'h', '@', 'Ï', 'K', 'G', '3', 'K', '¥', 'x08', 's', ':', 'x00', '§', 's', 'i', 'à', 'x8e', 't', 'N', 'e', 'E', 't', '3', 't', 'i', 'i', 'a', 'ð', 'K', 'r', 's', 'G', '±', 'h', 'Ï', 'ì', 'Y', 'Y', 'x8d', 'K', 'E', 'h', 't', 'Y', 'K', 'ë', 'T', 'K', 's', 'e', 'i', 'T', 'x9c', 'x0b', '¿', 'x92', 'r', 'G', 'K', '~', 'r', 'ö', 's', 'Y', 'x81', 'Y', 'E', 'K', 'e', 'h', 'K', '5', '~', 'G', '±', 'T', 't', 'h', 's', 'd', 'à', '@', 's', 'x10', 's', '@', 'h', 'Á', '1', 't', '¿', '@', 'ÿ', 'û', 'h', 'T', 'q', 'i', 't', 'Y', 'Ì', '~', 'â', '¸', 'i', '@', 'Y', '5', 'á', 'e', 'G', '´', '9', 'G', 'i', 'U', 'E', '®', 'K', '3', 'x1c', '¼', 'ë', 'ª', '4', 'i', 't', 'r', 'x18', '³']List = Counter(List)print(List)
# Counter({'t': 25, 'h': 24, 'e': 23, 'K': 22, 'E': 21, 'Y': 20, 'i': 19, 's': 18, ':': 17, 'G': 16, 'r': 15, '3': 14, '@': 13, 'T': 12, '~': 11, 'x1f': 3, 'à': 3, 'x92': 3, 'Ï': 3, '¿': 3, '5': 3, 't': 2, 'a': 2, '¼': 2, '¥': 2, 'q': 2, 'x98': 2, 'x8d': 2, 'ì': 2, '´': 2, 'ð': 2, '³': 2, 'x0b': 2, '8': 2, 'x08': 2, 'x1c': 2, 'ö': 2, 'U': 2, '®': 2, '±': 2, 'ë': 2, 'í': 1, '`': 1, '?': 1, 'Ð': 1, 'x15': 1, 'x9f': 1, 'w': 1, 'g': 1, 'x8f': 1, '¨': 1, 'x84': 1, 'Í': 1, 'x80': 1, 'x9a': 1, 'x16': 1, 'm': 1, 'D': 1, 'ü': 1, '7': 1, '6': 1, 'B': 1, 'S': 1, 'Ü': 1, 'z': 1, '¦': 1, 'f': 1, 'x95': 1, 'b': 1, 'x05': 1, ']': 1, '¯': 1, '¤': 1, '¹': 1, 'I': 1, '+': 1, 'x1b': 1, 'k': 1, 'è': 1, '0': 1, '}': 1, '-': 1, 'º': 1, '°': 1, 'Þ': 1, '{': 1, 'x14': 1, 'H': 1, 'p': 1, 'x97': 1, '!': 1, 'ñ': 1, '·': 1, 'x00': 1, '§': 1, 'x8e': 1, 'N': 1, 'x9c': 1, 'x81': 1, 'd': 1, 'x10': 1, 'Á': 1, '1': 1, 'ÿ': 1, 'û': 1, 'Ì': 1, 'â': 1, '¸': 1, 'á': 1, '9': 1, 'ª': 1, '4': 1, 'x18': 1})

不难发现按照频次拼接起来头几位是theKEYis:[email protected]~,成功拿到key,可以解密flag.crypto文件了,这里考察了一个叫做Encrypt的软件,直接拖进去输密码解密得到flag.txt

打开后是一大串Unicode,直接python打印

祥云杯2020 线下一血Misc分享


# -*- coding: utf-8 -*-# @Project: Hello Python# @File : 21-unciode打印# @Author : Tr0jAn <[email protected]># @Date : 2020-12-13code = "&#x1F499;&#x1F4DF;&#x1F63D;&#x1F602;&#x1F373;&#x2709;&#x1F49E;&#x1F4DF;&#x1F49E;&#x1F378;&#x1F300;&#x1F4D1;&#x1F42E;&#x1F3C9;&#x1F614;&#x1F436;&#x1F300;&#x1F368;&#x1F448;&#x1F334;&#x1F685;&#x1F33C;&#x1F378;&#x1F499;&#x1F4BE;&#x1F4E5;&#x1F351;&#x1F351;&#x1F487;"code = code.lower().replace("&#", "0").replace(";", "").split("0x")for i in code[1:]: print(chr(int(i, 16)), end="")# 💙📟😽😂🍳✉💞📟💞🍸🌀📑🐮🏉😔🐶🌀🍨👈🌴🚅🌼🍸💙💾📥🍑🍑💇

得到一串emoji,本地有base100codemojiemoji-aes以及Emoji Cipher等解emoji加密的脚本,逐个尝试发现是codemoji加密,解密得到flag

祥云杯2020 线下一血Misc分享

这个题很荣幸拿了一血,甚至主办方还过来问了我的思路,只不过后面就基本下班了...



我们欢迎每一个对技术充满热情的同学
如果你和我们一样,想做出点成绩
这里给你无限的空间,任你翱翔
进组方式,简历投递邮箱[email protected]

祥云杯2020 线下一血Misc分享

祥云杯2020 线下一血Misc分享
欢迎真正热爱技术的你!
Timeline Sec 团队
安全路上,与你并肩前行



本文始发于微信公众号(Timeline Sec):祥云杯2020 线下一血Misc分享

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: