>
>
萌新赛部分MISC(签到、千字文、劝退、qrcode)
hdxw
萌新赛杂项_签到
http://game.ctf.show/r2/
hint: n进制转字符串/base-n
第一步:发现并提取隐藏信息
图片显示“fl4g_1s_n0t_h3r3”的意思是真flag不在图片里
隐藏信息在网页源码里,img标签和body标签之间。
提取隐藏信息的方法很多,下面列举几种
- F12,Elements,选中body标签,右键"Edit as HTML"
- 网页上右键,查看网页源代码,细心的可以发现浏览器的横向滚动条很长
- Ctrl+S,保存网页到本地文件
- curl http://game.ctf.show/r2/
这种不可见字符的隐藏方法还常见于压缩包的注释
第二步:解码
“空白”一共两种类型,空格和制表符
可以在文本编辑器中把全部“空格”替换为“0”,“\t”替换为“1”
得到二进制后转字符串,得到摩尔斯码
-.... -.... -.... -.-. -.... .---- -.... --... --... -... ....- -.. -.... ..... -.... . -.... --... ....- -.. -.... ..... -.... . -.... --... ....- ....- -.... .---- --... -..
摩尔斯解码得到十六进制,虽然是32位但是不是md5,“flag”转16进制后666开头(知识点)
666C61677B4D656E674D656E6744617D
十六进制转字符串得到flag
import re
# 二进制转字符串
def bin2str(bin):
b = re.findall(r'.{8}',bin)
string = ''
for i in b:
string += chr(int(i,2))
return string
# 十六进制转字符串
def hex2str(hexStr):
b = re.findall(r'.{2}',hexStr)
str = ''
for i in b:
str += chr(int(i,16))
return str
摩尔斯解码 http://www.zhongguosou.com/zonghe/moErSiCodeConverter.aspx
萌新赛杂项_千字文(写代码)
hint:使用pyzbar可以识别二维码(加个白边框,食用更佳)
附件是个二维码,内容是“这里只有二维码”
二维码中每一个格(25px*25px)也是一个二维码
因为rgb的值只调整了1,所以肉眼不可见,但可以用Stegsolve看出来
有大佬直接ps切割,然后在线批量扫成功通关
这里预期还是写代码实现,所以加了一个提示信息
直接识别25*25的二维码会失败,加一个1px的白边框就能识别(或者据说放大也能识别)
虽然有的拼音字符识别有错误,但flag还是可以正常出来的
from pyzbar import pyzbar
from PIL import Image
def decode_qr_code(img):
txt = pyzbar.decode(img, symbols=[pyzbar.ZBarSymbol.QRCODE])
if len(txt):
return txt[0].data.decode("utf-8")
else:
return ""
img = Image.open("千字文.png")
for w in range(2,27):
for h in range(2,27):
qrcode = Image.new('RGB', (27, 27),color=(255,255,255))
wq = w*25
hq = h*25
for x in range(wq,wq+25):
for y in range(hq,hq+25):
r,g,b = img.getpixel((x,y))
color = b
if color == 254:
color = 0
elif color == 1:
color = 255
qrcode.putpixel((x-wq+1,y-hq+1), (color,color,color))
# qrcode.show()
txt = decode_qr_code(qrcode)
if "flag" in txt:
print(w,h,txt)
萌新赛杂项_劝退警告(读代码)
题如其名
hint:python lambda参考的unctf2019-Think ,混淆用的这个http://www.onelinerizer.com/
final hint: 你与flag的距离可能只是一个数字(check[0]改为check[1])
第一层:解压出题目
动图尾部附加了压缩包,可以分离出来,也可以直接改扩展名为.zip
ctf中会遇到的解压缩包方法就那几种,爆破、明文攻击、伪加密
万变不离其宗,只要明白了各自的特点轻松松解压(除非有明确的提示需要爆破才用爆破)
一、压缩包注释提示做数独,解压密码是填完整的数独。
数独的英文是“sudoku”,压缩包里有同名图片是伪加密的数独图片
解数独得到解压密码,推荐一个在线玩数独的网站(与题目无关)https://www.oubk.com/
二、第二个压缩包有注释,压缩包里有一个“说明”文件,把压缩包注释的文字保存到文件,明文攻击
通过群里大佬的交流,发现这里有几个坑。
保存文件的大小不一致:电脑记事本保存时文件编码是ANSI(另存为时可以看到编码),每个汉字2字节;使用文本编辑器保存utf-8时需要没有bom头,bom头多占3字节
明文攻击无法停止:明文攻击时指定秘钥(文件crc32),明文攻击开始后第一步是恢复文件,当看到第二步的恢复口令时就可以停止了
三、第三个压缩包注释提示了密码位数和首尾两位,这里使用“爆破”的变形——掩码,掩码值是42????32
第二层:图片隐写
解压出文件“open your eye”,提示使用silenteye,密码默认,提取出flag.txt
第三层:反编译pyc
提取出的flag.txt,hex转为pyc文件,使用uncompyle6反编译得到源码
源码是lambda表达式,不能美化,没有恢复工具,本想考察读代码的能力
给出了混淆方法,可以通过简单的代码混淆后的状态推理出题目的源码结构(整体把握,总共有三个方法:encode、decode、check)
最后无奈hint给出了修改方法(一血没有提示就做出来了),执行后输出flag
或者也可以用re大佬@ThTsOd的方法,如下改完后当re做
import time
# 代码
time.sleep(3)
萌新赛杂项_qrcode
这题本打算添加到普通misc里的,放到萌新赛算是福利题了
625位二进制,正好是25*25二维码的大小
方法1:1全部替换为█,0全部替换为空格,替换后二维码宽度不够比较难识别,可以1替换为两个█,0替换为两个空格
方法2:python读文件写到图片并解码
from pyzbar import pyzbar
from PIL import Image
def decode_qr_code(img):
txt = pyzbar.decode(img, symbols=[pyzbar.ZBarSymbol.QRCODE])
if len(txt):
return txt[0].data.decode("utf-8")
else:
return "decode fail"
qrcode = Image.new('RGB', (27, 27),color=(255,255,255))
f = open("qrcode.txt")
txt = f.read()
x=y=1
for i in txt:
if i == "1":
color = 0
else:
color = 255
qrcode.putpixel((x,y), (color,color,color))
x += 1
if x > 25:
x = 1
y += 1
# qrcode.show()
print(decode_qr_code(qrcode))
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论