NSSCTF round4 misc

Pixel_Signin

根据题目名称可能是要用python中的getpixel函数

看了一下大佬的脚本,然后自己再理解一下

from PIL import Image
import struct
width = 31
height = 31
img=Image.open("test.png")
s=[]
for i in range(width):
	for j in range(height):
		pi=img.getpixel((j,i))#getpixel函数是用来获取某一点像素的RGB颜色值,getpixel的参数是一个像素点的坐标
		for k in range(3):
			s.append(pi[k])#append用于在数组后加上一个新的元素
with open('1.txt', 'wb')as fp:#wb参数以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
	for x in s:
		string = struct.pack('B', x)#将x这个参数的值进行包装,最后返回一个包装后的字符串,包装的方法由这个B控制
		fp.write(string)

整体的思路差不多就是获取每一个像素点的RGB颜色值,然后再通struct.pack这个函数进行包装输出,返回字符串,把这些字符写入到1.txt文件里

Gur dhvpx oebja sbk whzcf bire gur ynml qbt vf na Ratyvfu-ynathntr cnatenz�n fragrapr gung pbagnvaf nyy gur yrggref bs gur nycunorg. Gur cuenfr vf pbzzbayl hfrq sbe gbhpu-glcvat cenpgvpr, grfgvat glcrjevgref naq pbzchgre xrlobneqf, qvfcynlvat rknzcyrf bs sbagf, naq bgure nccyvpngvbaf vaibyivat grkg jurer gur hfr bs nyy yrggref va gur nycunorg vf qrfverq.Gur rneyvrfg xabja nccrnenapr bs gur cuenfr jnf va Gur Obfgba Wbheany. Va na negvpyr gvgyrq Pheerag Abgrf va gur Sroehnel , rqvgvba, gur cuenfr vf zragvbarq nf n tbbq cenpgvpr fragrapr sbe jevgvat fghqragf N snibevgr pbcl frg ol jevgvat grnpuref sbe gurve chcvyf vf gur sbyybjvat, orpnhfr vg pbagnvaf rirel yrggre bs gur nycunorg N dhvpx oebja sbk whzcf bire gur ynml qbt. Qbmraf bs bgure arjfcncref choyvfurq gur cuenfr bire gur arkg srj zbaguf, nyy hfvat gur irefvba bs gur fragrapr fgnegvat jvgu N engure guna Gur. Gur rneyvrfg xabja hfr bs gur cuenfr fgnegvat jvgu Gur vf sebz gur  obbx Vyyhfgengvir Fubegunaq ol Yvaqn Oebafba. Gur zbqrea sbez fgnegvat jvgu Gur orpnzr zber pbzzba rira gubhtu vg vf fyvtugyl ybatre guna gur bevtvany fgnegvat jvgu N.N  rqvgvba bs gur Ybf Natryrf Urenyq Fhaqnl Zntnmvar erpbeqf gung jura gur Arj Lbex Urenyq jnf rdhvccvat na bssvpr jvgu glcrjevgref n srj lrnef ntb, fgnss sbhaq gung gur pbzzba cenpgvpr fragrapr bs abj vf gur gvzr sbe nyy tbbq zra gb pbzr gb gur nvq bs gur cnegl qvq abg snzvyvnevmr glcvfgf jvgu gur ragver nycunorg, naq ena bagb gjb yvarf va n arjfcncre pbyhza. AFFPGS{Unehxv_vf_AFF_FHCREZNA_fb_guvf_gnfx_vf_rnfl} Gurl jevgr gung n fgnss zrzore anzrq Neguhe S. Phegvf vairagrq gur dhvpx oebja sbk cnatenz gb nqqerff guvf.Nf gur hfr bs glcrjevgref terj va gur yngr gu praghel, gur cuenfr ortna nccrnevat va glcvat yrffba obbxf nf n cenpgvpr fragrapr. Rneyl rknzcyrf vapyhqr Ubj gb Orpbzr Rkcreg va Glcrjevgvat N Pbzcyrgr Vafgehpgbe Qrfvtarq Rfcrpvnyyl sbe gur Erzvatgba Glcrjevgre , naq Glcrjevgvat Vafgehpgbe naq Fgrabtencuref Unaq-obbx. Ol gur ghea bs gur gu praghel, gur cuenfr unq orpbzr jvqryl xabja. Va gur Wnahnel ,vffhr bs Cvgznaf Cubargvp Wbheany, vg vf ersreerq gb nf gur jryy xabja zrzbevmrq glcvat yvar rzoenpvat nyy gur yrggref bs gur nycunorg. Eboreg Onqra-Cbjryyf obbx Fpbhgvat sbe Oblf  hfrf gur cuenfr nf n cenpgvpr fragrapr sbe fvtanyvat.Gur svefg zrffntr frag ba gur Zbfpbj�Jnfuvatgba ubgyvar ba Nhthfg , , jnf gur grfg cuenfr GUR DHVPX OEBJA SBK WHZCRQ BIRE GUR YNML QBTF ONPX . Yngre, qhevat grfgvat, gur Ehffvna genafyngbef frag n zrffntr nfxvat gurve Nzrevpna pbhagrecnegf, Jung qbrf vg zrna jura lbhe crbcyr fnl Gur dhvpx oebja sbk whzcrq bire gur ynml qbt? Qhevat gur gu praghel, grpuavpvnaf grfgrq glcrjevgref naq gryrcevagref ol glcvat gur fragrapr.Vg vf gur fragrapr hfrq va gur naahny Mnare-Oybfre Angvbany Unaqjevgvat Pbzcrgvgvba, n phefvir jevgvat pbzcrgvgvba juvpu unf orra uryq va gur H.F. fvapr                                              

输出的字符是这些,也是看了wp之后才知道这个编码是rot13编码,所以顺便也学一下这个rot13编码

原理上来说是对26个小写字母以及26个大写字母进行操作,对原有字母的ASCII值 + 13或者ASCII-13,然后找到计算后的ASCII值对应的字母。通过这样的规则将一个字母替换为另一个字母,从而达到加密的目的。

规则如下:

a-m 对应替换为 n-z

n-z 对应替换为 a- m

A-M 对应替换为 N-Z

N-Z 对应替换为A-M

其他字符:例如数字、空白字符以及其他字符均保持不变,并且替换后大小写不会改变(小写a替换后是小写n,而不是大写N)

解密脚本:

#coding:utf-8

import string

def decoder(crypt_str,shift):
    crypt_list = list(crypt_str)
    plain_str = ""
    num = int(shift)
    for ch in crypt_list:
        ch = ord(ch)
        if ord('a') <= ch and ch <= ord('z'):
            ch = ch + num
            if ch > ord('z'):
                ch -= 26
        if ord('A') <= ch and ch <= ord('Z'):
            ch = ch +num
            if ch > ord('Z'):
                ch -= 26
        a=chr(ch)
        plain_str += a

    print(plain_str)

crypt_str = input("Crypto_text:")
print("!------decode------!")
shift=13
decoder(crypt_str,shift)

把解密出来的文本仔细看一下,实在找不到可以搜索一下NSSCTF

image-20220803145027512

Type Message

解压出来是这样四个音乐文件

image-20220804231327013

直接用工具进行DTMF解密

http://dialabc.com/sound/detect/index.html

D:

image-20220804231415832

T:

image-20220804231440397

M:

image-20220804231500103

F:

image-20220804231516773

D:627474238133

T:318161334374

M:733221535393

F:32217493

再用九键进行解密,每二位为一个字母

image-20220804231953391

D:627474238133

NSSCTF

T:318161334374

DTFMSIS

M:733221535393

DTFMSIS

F:32217493

EASY

NSSCTF{DTFMSISDTFMSISEASY}

Knight's Tour!

下载下来的压缩包发现打不开

image-20220805155109192

zip文件却是rar的文件头,把文件头改成zip的文件头504b0304

image-20220805155226309

这样就可以打开了,得到图片

image-20220805155332732

这张图的意思是:上面8*8的表格是棋盘,下面的图是走法

knight’tour就是一个骑士的问题,这个骑士的走法只能以L的方式进行走,也就是说如果它刚开始在第一格i,它只能走到n或者s

细节问题可以看一下这个视频

https://www.bilibili.com/video/BV1Ps411d72P?vd_source=7bedeac01146e3d539aca70732d2f202

因为整张表只有一个k,所以我们要看一下从哪里开始走第五步会是k

我们先从第一步开始判断,第一步是t,第二部是h,表格中存在这样的情况的位置只有(7,3)或(1,4),然而第三步是i的地方就只有是(7,3)了,所以起始位置应该是(7,3),但是这里第二步的h应该要先向右上角的h走,如果向左下角的h走,最后就不能无重复的走完了

image-20220805164841829

也就是这样一步一步往下走,最再根据下面的图的每个字母画上相对应的颜色,也就是:

img

然后将红色当成0,黄色当成1,最终会是下面这样:

01000011
01101000
00110001
01110110
01000000
01101100
01110010
01111001

在线转换一下:https://coding.tools/cn/binary-to-text

或者写个小脚本

import re
c="01000011 01101000 00110001 01110110 01000000 01101100 01110010 01111001"
c=re.split(" ",c)
flag=""
for i in range(0,len(c)):
    x=int(c[i],2)
    flag=flag+chr(x)
print(flag)

image-20220805172720591

转换结果就是Ch1v@lry

NSSCTF{Ch1v@lry}

posted @ 2022-08-05 17:28  Jinx8823  阅读(77)  评论(0编辑  收藏  举报