NSSCTF_Misc方向题复现1

2 篇文章 0 订阅

目录

1、套娃(xlsx)

2、神奇的二维码

3、为什么我什么都看不见

4、Take me hand

5、bqt


1、套娃(xlsx)

附件是一个xlsx文件,一般的xlsx文件做法就是先用010来看,一般可以转换成zip格式,然后进行解压。

该题解压后

还是有一个xlsx文档,继续进行改后缀解压,解到最后是一个加密的压缩包和一个xlsx文档,然后用010查看这个文档,在最后看到了密码

6e4c834d77cba03af41e1562a5bce84e

用这个密码解RC4key加密压缩包,得到RC4的密钥

ABCDEFGHIJKLMNOPQRSTUVWXYZ

加上之前解压过程中的一个txt文件中有RC4的密文

U2FsdGVkX19uI2lzmxYrQ9mc16y7la7qc7VTS8gLaUKa49gzXPclxRXVsRJxWz/p

然后用在线网站进行解密(其他的好像不太行~~~)

https://www.sojson.com/encrypt.html

ef1a73d40977a49b99b871980f355757

2、神奇的二维码

直接扫码是一个错误的flag,用010查看之后发现里面有RAR文件,然而用foremost是分离不出来的,要用binwalk

binwalk -e *.png

在当前目录下只有一个.png文件格式时,前面的文件名可以用*来代替

进入该分离出来的目录下,查看有什么文件

有一串密文并且可以看出用的是base64加密,直接对其进行解密

asdfghjkl1234567890

Tip:

对文件内容加密
base64 sample.txt
对文本加密
echo 'asdfghjkl1234567890' | base64
对文本解密
echo 'YXNkZmdoamtsMTIzNDU2Nzg5MA==' | base64 --decode
直接进行交互编码加密

交互式解密

回到题目上,对其他压缩包进行解压

发现看看flag在不在里面^_^.rarencode.txtflag.docflag.jpg是由716A.rar7104.rar17012.rar解压得到的

剩余的两个则需要用密码来解密,用上面得到的一串密码来试试哪个符合

成功解密看看flag在不在里面.rar

解密出来没用~~~

接着就是看flag.doc文件

一堆内容,根据前面解encode.txt文件可以大概猜测也是用base进行解码,这里用下面的脚本进行解码,自己编写的,没能输出用了哪种base(发现都是一直base64解码即可),还请多多指教

# -*- coding:utf-8 -*-
import base64
import sys

def interactive_decode(file_name):
    """
    交互式解码函数,用于解码指定文件中的Base64编码数据。
    :param file_name: 要解码的文件名
    :return: 解码后的字符串
    """
    s = ''
    with open(file_name, 'r', encoding='UTF-8') as f:
        s = "".join(f.readlines()).encode('utf-8')
        src = s
    decode_count = 0

    while True:
        decode_count += 1

        try:
            src = s
            s = base64.b16decode(s)
            s = str(s, 'utf-8')
            continue
        except Exception:
            pass

        try:
            src = s
            s = base64.b32decode(s)
            s = str(s, 'utf-8')
            continue
        except Exception:
            pass

        try:
            src = s
            s = base64.b64decode(s)
            s = str(s, 'utf-8')
            continue
        except Exception:
            break

    print("解码完成!结果如下:")
    print(s)
    print(f"共进行了 {decode_count} 次Base解码")


if __name__ == "__main__":
    """
    主程序入口,用于执行交互式解码函数。
    :return: None
    """
    if len(sys.argv) != 2:
        print("使用方法:python b.py <文件名>")
        sys.exit(1)

    file_name = sys.argv[1]
    interactive_decode(file_name)

comEON_YOuAreSOSoS0great

然后用这个密码解18394.rar

得到了一个MP3文件

Audacity工具进行查看,肉眼可见是莫斯密码,长的是-,短的是·,间隔是空格

-- --- .-. ... . .. ... ...- . .-. -.-- ...- . .-. -.-- . .- ... -.--

MORSEISVERYVERYEASY

转换成小写就是正确的flag了

morseisveryveryeasy

3、为什么我什么都看不见

用010看.png图片,在尾部看到了有RAR文件里有flag.txt

foremost分离不出来,binwalk分离出来的也还是you want...这句话,用steghide也无果(并不支持.png的格式)

然后这里就想到了不久前用过lsb的隐写脚本,应该这题就是用lsb隐写脚本进行把flag加密进去的,”解铃还须系铃人“,使用lsb隐写的脚本进行解码(当然还可以直接用zsteg、stegsolve直接出来,已经在kali中就懒得切系统了~~~)

python exp.py decode [文本字节] [要解密的图片] [保存到的文本]

lsb隐写脚本
# python exp.py decode [文本字节] [要解密的图片] [保存到的文本]
# python exp.py encode [原图] [txt文本] [新图]
from PIL import Image
import sys

def toasc(strr):
    return int(strr, 2)

#str1为所要提取的信息的长度(根据需要修改),str2为加密载体图片的路径,str3为提取文件的保存路径
def decode(str1,str2,str3):
    b=""
    im = Image.open(str2)
    lenth = int(str1)*8
    width,height = im.size[0],im.size[1]
    count = 0
    for h in range(height):
        for w in range(width):
            #获得(w,h)点像素的值
            pixel = im.getpixel((w, h))
            #此处余3,依次从R、G、B三个颜色通道获得最低位的隐藏信息
            if count%3==0:
                count+=1
                b=b+str((mod(int(pixel[0]),2)))
                if count ==lenth:
                    break
            if count%3==1:
                count+=1
                b=b+str((mod(int(pixel[1]),2)))
                if count ==lenth:
                    break
            if count%3==2:
                count+=1
                b=b+str((mod(int(pixel[2]),2)))
                if count ==lenth:
                    break
        if count == lenth:
            break

    with open(str3,"w",encoding='utf-8') as f:
        for i in range(0,len(b),8):
            #以每8位为一组二进制,转换为十进制
            stra = toasc(b[i:i+8])
            #将转换后的十进制数视为ascii码,再转换为字符串写入到文件中
            #print((stra))
            f.write(chr(stra))
    print("sussess")

def plus(string):
    #Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
    return string.zfill(8)

def get_key(strr):
    #获取要隐藏的文件内容
    with open(strr,"rb")  as f:
        s = f.read()
        string=""
        for i in range(len(s)):
         #逐个字节将要隐藏的文件内容转换为二进制,并拼接起来
         #1.先用ord()函数将s的内容逐个转换为ascii码
         #2.使用bin()函数将十进制的ascii码转换为二进制
         #3.由于bin()函数转换二进制后,二进制字符串的前面会有"0b"来表示这个字符串是二进制形式,所以用replace()替换为空
         #4.又由于ascii码转换二进制后是七位,而正常情况下每个字符由8位二进制组成,所以使用自定义函数plus将其填充为8位
            string=string+""+plus(bin(s[i]).replace('0b',''))
    #print(string)
    return string

def mod(x,y):
    return x%y

#str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径
def encode(str1,str2,str3):
    im = Image.open(str1)
    #获取图片的宽和高
    width,height= im.size[0],im.size[1]
    print("width:"+str(width))
    print("height:"+str(height))
    count = 0
    #获取需要隐藏的信息
    key = get_key(str2)
    keylen = len(key)
    for h in range(height):
        for w in range(width):
            pixel = im.getpixel((w,h))
            a=pixel[0]
            b=pixel[1]
            c=pixel[2]
            if count == keylen:
                break
            #下面的操作是将信息隐藏进去
            #分别将每个像素点的RGB值余2,这样可以去掉最低位的值
            #再从需要隐藏的信息中取出一位,转换为整型
            #两值相加,就把信息隐藏起来了
            a= a-mod(a,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            b =b-mod(b,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            c= c-mod(c,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            if count % 3 == 0:
                im.putpixel((w,h),(a,b,c))
    im.save(str3)

if __name__ == '__main__':
    if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2:
        print ('Usage: python test.py <cmd> [arg...] [opts...]')
        print ('  cmds:')
        print ('    encode image + flag -> image(encoded)')
        print ('    decode length + image(encoded) -> flag')
        sys.exit(1)
    cmd = sys.argv[1]
    if cmd != 'encode' and cmd != 'decode':
        print('wrong input')
        sys.exit(1)
    str1 = sys.argv[2]
    str2 = sys.argv[3]
    str3 = sys.argv[4]
    if cmd != 'encode' and cmd != 'decode':
        print ('Wrong cmd %s' % cmd)
        sys.exit(1)
    elif cmd=='encode':
        encode(str1,str2,str3)
    elif cmd=='decode':
        decode(str1,str2,str3)

附带加个lsb隐写加密:

python exp.py encode [原图] [txt文本] [新图]

也是用同一张图,隐写是会进行覆盖的

不想每次解密后都保存到一个txt文本中,然后再cat来查看的话可以用下面我改进后的代码(在上图中就用到了)

直接输出到命令行中

python exp.py decode [文本字节] [要解密的图片]
#python exp.py decode [文本字节] [要解密的图片]
from PIL import Image
import sys

def toasc(strr):
    return int(strr, 2)

def decode(str1,str2):
    b=""
    im = Image.open(str2)
    lenth = int(str1)*8
    width,height = im.size[0],im.size[1]
    count = 0
    for h in range(height):
        for w in range(width):
            pixel = im.getpixel((w, h))
            if count%3==0:
                count+=1
                b=b+str((mod(int(pixel[0]),2)))
                if count ==lenth:
                    break
            if count%3==1:
                count+=1
                b=b+str((mod(int(pixel[1]),2)))
                if count ==lenth:
                    break
            if count%3==2:
                count+=1
                b=b+str((mod(int(pixel[2]),2)))
                if count ==lenth:
                    break
        if count == lenth:
            break

    for i in range(0,len(b),8):
        stra = toasc(b[i:i+8])
        print(chr(stra), end='')  # 直接打印解码后的字符,取消换行符

def plus(string):
    return string.zfill(8)

def get_key(strr):
    with open(strr,"rb") as f:
        s = f.read()
        string=""
        for i in range(len(s)):
            string=string+""+plus(bin(s[i]).replace('0b',''))
    return string

def mod(x,y):
    return x%y

def encode(str1,str2,str3):
    im = Image.open(str1)
    #获取图片的宽和高
    width,height= im.size[0],im.size[1]
    print("width:"+str(width))
    print("height:"+str(height))
    count = 0
    #获取需要隐藏的信息
    key = get_key(str2)
    keylen = len(key)
    for h in range(height):
        for w in range(width):
            pixel = im.getpixel((w,h))
            a=pixel[0]
            b=pixel[1]
            c=pixel[2]
            if count == keylen:
                break
            #下面的操作是将信息隐藏进去
            #分别将每个像素点的RGB值余2,这样可以去掉最低位的值
            #再从需要隐藏的信息中取出一位,转换为整型
            #两值相加,就把信息隐藏起来了
            a= a-mod(a,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            b =b-mod(b,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            c= c-mod(c,2)+int(key[count])
            count+=1
            if count == keylen:
                im.putpixel((w,h),(a,b,c))
                break
            if count % 3 == 0:
                im.putpixel((w,h),(a,b,c))
    im.save(str3)

# 确保正确缩进 if __name__ == '__main__' 部分
if __name__ == '__main__':
    if '-h' in sys.argv or '--help' in sys.argv or len(sys.argv) < 2:
        print ('Usage: python test.py <cmd> [arg...] [opts...]')
        print ('  cmds:')
        print ('    encode image + flag -> image(encoded)')
        print ('    decode length + image(encoded) -> flag')
        sys.exit(1)
    cmd = sys.argv[1]
    if cmd != 'encode' and cmd != 'decode':
        print('wrong input')
        sys.exit(1)
    str1 = sys.argv[2]
    str2 = sys.argv[3]
    if cmd=='encode':
        # 对于encode命令,仍需要第三个参数来指定加密图片的保存路径
        if len(sys.argv) < 4:
            print('Encode command requires an output file path.')
            sys.exit(1)
        str3 = sys.argv[4]
        encode(str1,str2,str3)
    elif cmd=='decode':
        # 解码命令不再需要第三个参数
        decode(str1,str2)

stegsolve:

zsteg:

4、Take me hand

一个流量包

据题意,直接滚动找404请求,不一会就找到了

然后找它发送的包,得到明文flag

也可以直接搜关键词的~~~

还能用工具直接找

%7B:{ %21:}

5、bqt

用010查看,可以发现是PDF文件

加上.pdf的后缀名

一般是pdf隐写

加上后缀可以正常打开,crtl+A全选,改颜色,看到有一串字,复制出来

c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd

是十六进制,用脚本将它们两两分组

# 两两分开
s = 'c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd'
result = ''
for i in range(0, len(s), 2):
    result += s[i:i+2] + ' '
print(result)
# c8 e9 ac a0 c3 f4 e6 e5 f2 a1 a0 d4 e8 e5 a0 e6 ec e1 e7 a0 e9 f3 ba a0 e6 ec e1 e7 fb f7 e5 e6 e5 ef e9 e4 ea e7 ef e5 e4 f3 e6 e9 ef f2 f0 e5 e6 e4 e6 e7 e7 e6 e4 f3 e5 fd

转10进制:

# 将十六进制字符串两两分开并转换为十进制
s = 'c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd'

result = []
for i in range(0, len(s), 2):
    decimal_value = int(s[i:i+2], 16)
    result.append(decimal_value)

# 输出转换后的十进制列表
print(result)

# 如果需要输出以空格分隔的字符串形式
print(' '.join(map(str, result)))
200 233 172 160 195 244 230 229 242 161 160 212 232 229 160 230 236 225 231 160 233 243 186 160 230 236 225 231 251 247 229 230 229 239 233 228 234 231 239 229 228 243 230 233 239 242 240 229 230 228 230 231 231 230 228 243 229 253

然后-128

numbers = [200, 233, 172, 160, 195, 244, 230, 229, 242, 161, 160, 212, 232, 229, 160, 230, 236, 225, 231, 160, 233, 243, 186, 160, 230, 236, 225, 231, 251, 247, 229, 230, 229, 239, 233, 228, 234, 231, 239, 229, 228, 243, 230, 233, 239, 242, 240, 229, 230, 228, 230, 231, 231, 230, 228, 243, 229, 253]

result = []
for num in numbers:
    result.append(num - 128)

print(result)
72, 105, 44, 32, 67, 116, 102, 101, 114, 33, 32, 84, 104, 101, 32, 102, 108, 97, 103, 32, 105, 115, 58, 32, 102, 108, 97, 103, 123, 119, 101, 102, 101, 111, 105, 100, 106, 103, 111, 101, 100, 115, 102, 105, 111, 114, 112, 101, 102, 100, 102, 103, 103, 102, 100, 115, 101, 125

然后转ASCII码

exp:
m = "c8e9aca0c3f4e6e5f2a1a0d4e8e5a0e6ece1e7a0e9f3baa0e6ece1e7fbf7e5e6e5efe9e4eae7efe5e4f3e6e9eff2f0e5e6e4e6e7e7e6e4f3e5fd"
n=""
for i in range(0,len(m),2):
    hex = m[i:i+2]
    n+= chr(int(hex,16)-128)
print(n)
Hi, Ctfer! The flag is: flag{wefeoidjgoedsfiorpefdfggfdse}
  • 32
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值