ctf-misc 个人笔记(有空闲更新)

 标题一、解码和编码

  1. base64解密和加密及其隐写

(1)base64编码后面常带有等号,且编码中会出现大小写字母,数字,还有加号和斜杠。我常用下面的网站进行解码和编码:

https://the-x.cn/zh-cn/encodings/Ba删掉我se64.aspx

同时也能保存为文件,十分方便

(2)base64隐写

可用python代码(借用【精选】[MISC]Base64隐写_Weird0_的博客-CSDN博客的代码

def b64ord(char):
    if char in 'abcdefghijklmnopqrstuvwxyz':
        return ord(char) - 71
    elif char in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ':
        return ord(char) - 65
    elif char in '0123456789':
        return ord(char) + 4
    elif char == '+':
        return 62
    elif char == '/':
        return 63
    else: return

with open('flag.txt', 'r') as f:
    ostr = f.read()

info = ''
flag = ''
count = 0

for i in ostr:
    if i == '\n':
        count += 1
ostr = ostr.splitlines()

for i in range(0, count):
    tmp = ''

    if '==' in ostr[i]:
        code = b64ord(ostr[i][-3])
        tmp = str(bin(code))[-4::]
        #由于python会在二进制数前加上'0b',所以采取以下操作去掉
        if code <= 1:
            tmp = '000' + tmp[-1]
        elif 2<= code <= 3:
            tmp = '00' + tmp[-2::]
        elif 4<= code <= 7:
            tmp = '0' + tmp[-3::]

    elif '=' in ostr[i]:
        code = b64ord(ostr[i][-2])
        tmp = str(bin(code))[-2::]
        if code <= 1:
            tmp = '0' + tmp[-1]

    info += tmp

#将得到的结果拼接起来
for i in range(0, len(info), 8):
    flag += chr(int(info[i:i+8], 2))
print(flag)

 2.其他编码

(1)base编码家族

除常见的base64外,还有base32,base16,base100等,各自有各自的特点

(2)其他编码

除此之外还有各种各样的编码,需要不断地学习积累经验

可以使用工具尝试各种各样的解密与加密,来寻找究竟是哪种编码

标题二、图片隐写及python处理图片

 使用工具如下

1.010 Editor:010 Editor是一款功能强大的代码编辑器,可在官网下载;2.stegsolve;3.Vmcare虚拟机

。与之有关的考点有

(1)文件头,文件尾

常见文件头和文件尾有

  • JPEG 文件头:FF D8 FF 文件尾:FF D9(jpg文件属性中可隐藏信息)
  • PNG 文件头:89 50 4E 47 0D 0A 1A 0A 文件尾:AE 42 60 82
  • ZIP Archive (zip) 文件头:50 4B 03 04 文件尾:50 4B
  • RAR Archive (rar) 文件头:52 61 72 21

 例如文件头尾缺失,文件头尾与文件格式不符等

(附上一题个人花较大精力的)

有题目将全部二进制倒过来,较为简单,倒序输出即可。我写的题是82 60 42 AE,是将每八位二进制一组给倒过来,应当使用python脚本将整个文本倒序,称作切片输出:

with open("input_file_addr",'rb') as input_file:    #旧文件
    with open("output_file_addr",'rb') as output_file:    #新文件
        output_file.write(input_file.read()[::-1])

 便能得到正确文件

(2)信息隐写

比较简单的比如将base64,或者flag字符串直接复制到文件尾后面,不会影响文件;

也有将文件隐写在文件中,在010中可使用search寻找连续可识别字符串,找到可疑隐写信息(比如(补写)),此时需要使用VMware虚拟机,自行创建一个kali系统,在终端下载一个binwalk或foremost(个人常用binwalk)将终端用cd命令进入文件所在目录,使用:

binwalk -e 114514.png

会出现一系列信息,同时在同一目录下会出现一个文件夹,里面就是分离出来的文件,之后便可实现下一步解题

(3)lsb隐写

此隐写我常用到stegsolve,将图片导入此应用程序,可以点击下面<>一个一个观察图片中是否出现可疑的黑点或者其他,并记下左上角的颜色及序号,在Analyse选项中点击Date Extract,保存为文本文件或者二进制文件(还有Frame Brower可查看gif的每一帧)

 除了较为简单的stegsolve,还有在kali系统的steghide工具可以分离jpg中lsb隐写的文件,使用

steghide extract -sf    文件名字,之后输入密码,当然一般没有密码。

(4)盲水印隐写

(待补充)

(5)像素点隐写(python处理图片)

(2023geekchanllenaage)一题xqr给了一张二维码的图片,扫描之后是正常的什么信息都获取不了,拖进010之后看见隐藏了一个png文件,将其分离出来之后,是缺少定位符并且十分模糊的图片,根据大佬的思路,可以选择查看图片的像素点

(用gpt搞了一段代码(不会python╭ (T □ T)╮))

from PIL import Image
#获取图片
image = Image.open('path_to_your_image.jpg')
# 获取图片的宽度和高度
width, height = image.size
# 计算像素点数量
pixel_count = width * height
# 打印结果
print("该图片由", pixel_count, "个像素点组成")

 (二维码就不放了)可以得到第一个清晰的图片是有5625个像素点,第二张是有625个,说明第一张的图片像素点九个就组成一个,说明第一张图片长宽是第二张的三倍(属性中也可以看出来)第一种方法是根据大佬的思路,把第一个图片以间隔为3读取像素点,第二个图片直接读取像素点,分别转换成2进制,这样两个图片的数据就一样长, 可以全部异或,最后再把得到的数据转成二维码放大三倍就能出真正的二维码,直接扫出flag

from PIL import Image
#打开图片xqr读取数据
image = Image.open("path1")
width,height = image.size
XQRpixel =""
for y in range(0,height,3):
    for x in range(0,width,3):
        if image.getpixel((x,y))[0] == 0:#黑色
            XQRpixel += "0"
        else:
            XQRpixel += "1"
#打开另一个图片读取数据
image = Image.open("path2")
width,height = image.size
XORpixel = ""
for y in range(0,height):
     for x in range(0,width):
        if image.getpixel((x,y))[0] == 0:#黑色
            XORpixel += "0"
        else:
            XORpixel += "1"
#俩数据异或一下再生成图片
data = ""
for i in range(len(XQRpixel)):
       data += chr( ((ord(XQRpixel[i]) - 48) ^ (ord(XORpixel[i]) - 48)) + 48)
print(data)
image = Image.new("RGB",(3*width,3*height),(255,255,255))
for y in range(width):
    for x in range(height):
        if data[y*width + x] == '0':
            for i in range(3):
                for j in range(3):
                    image.putpixel((3 * x + i, 3 * y + j), (255, 255, 255))
            else:
                for i in range(3):
                    for j in range(3):
                        image.putpixel((3 * x + i, 3 * y + j), (0, 0, 0))
image.show()

 第二种思路是wp中的思路,发现定位角缺失,应该是和图片异或有关

标题三、音频隐写

(使用工具:1、Audacity)

(1)波形图(wav)

当听到一些刺耳的声音可以猜想是波形图,当然也有直接就是莫斯电码,可以选择直接手记。

将音频文件拖入Audacty中,可能会出现波形图例如一上一下的线条,可以联想到二进制数据,将波峰记作1,波谷作为0,再进入下一步。也有可能是摩斯电码,将波形图缩小,可以看到明显的一长一短和间隔,可以手记。

(2)频谱图

可以在旁边的选项中打开频谱图,一些简单的题应该可以直接看到flag

(3)(做的音频题较少,等以后收集)

标题四、docx文件隐写

有少数题将flag隐藏在docx文件中

flag可以放在批注中;

也可以放在扉页中,将扉页全选,再改变颜色,就可以出现;

还有一些间隔中不正常的回车,可以用ctrl+f搜到,也可以用选择并改变颜色;

flag也可以放在一些字体的名称,看见选择那些与正文字体不符的字,就可以在上面看见字体名称。

标题五、流量分析(不会)

(以后补充) 

标题六、压缩包隐写

 (1)伪压缩

将压缩包放入010中,观察其字节流,压缩源文件数据区中50 4B 03 04 是其文件头标志,随后是两位十六进制,说明解压所需版本,之后就是四位数字是全局方式位标记,四个数字中第二个是奇数代表是加密,偶数2代表是未加密。压缩源文件目录区中 50 4B 01 02 是开头,后面八位数字是代表了压缩和解压所需的版本,后面四位数字也是全局方式位标记,也是第二位数字代表了是否加密。之后将两者的决定是否加密的数字进行比较。如果两者都是偶数,那早就直接打开了;如果前偶后奇,说明是伪加密,伪加密的处理方法很多:

1,比较简单的有用linux系统中的binwalk -e指令可以直接无视伪加密

2,可以用ZipCenOp.jar检查

当然,有些时候是不行的,得另外找办法。

标题六、自己一些解题方法记录

1.游戏的exe文件和data.win文件

(2023geekchanllenage)中的smliemo的题中文件附带了游戏的文件和data.win,可以通过直接打游戏获得,之前也做过关于将exe文件进行逆向分析,当然这是杂项题,就没有往这方面想过。

根据官方给出的wp,我们可以通过特定的工具来进行对date.win文件的分析:可以通过

名为UndertaleModTool的工具 (下载网址https://github.com/krzys-h/UndertaleModTool/releases)打开data.win,下面直接引用wp的图片

可以发现中间有一段base64的编码,直接解码可以得到flag。

(.win文件是Windows操作系统中的一个文件类型。它是一种用于存储Windows程序或游戏的可执行文件。这些文件通常具有.exe文件扩展名,但也可能具有其他扩展名,如.com.bat等。

.win文件是经过编译的二进制文件,其中包含了程序的机器码指令,用于操作计算机的硬件和软件资源。当用户双击或运行.win文件时,操作系统会加载和执行其中的指令,从而启动程序或游戏。)

2.Tupper(2024beginctf)

简单的Tupper自指公式应用,具体可以看这篇文章,https://blog.csdn.net/weixin_44143678/article/details/119869423

根据k值的不同,可以弄出各种各样的图像。首先解包之后是很多分开的txt文档,可以用脚本将其和在一块,也可用控制台语言和在一块:type *.txt>hbtxt。这个是按照数字顺序排序的,如果文档不以数字为名,则考虑使用脚本,之后base64解码后,将数字放入工具中,便可得到flag。

3.你知道中国文化吗

解包出来,是一大串大写字母和少数数字和三四个符号,可知是base32加密,将除开符号的部分解密,可知是八卦加密,难点在于对符号的替换,分别对应的是$-S,&-7,@-2,发现是社会主义核心价值观解密,之后就是栅栏解密,便可解出

 标题七、一些通用方法

 1.python反编译

工具: Uncompyle6 和 pyinstxtractor 

(1)在Win11系统中,这种图标的exe文件一般是由Pyinstaller编译出的文件,使用pyinstxtractor工具可将其反编译,下载地址:PyInstaller Extractor download | SourceForge.net

 首先,我们先将pyinstxtractor.py工具与我们要反编译的exe文件放入同一个工作目录下,然后在当前目录打开终端,输入python pyinstxtractor.py ezpython.py,便会生成ezpython.exe_extracted文件夹我们需要找到同名的文件,有些时候需要加上.pyc的后缀。

然而由于反编译中的特性,这个pyc文件在反编译中由于缺少pyc文件特有的magic number和一些数字(不同python版本导致pyc不同),导致反编译失败。我们要了解这些magic number以及如何添加:python Magic Number对照表以及pyc修复方法 - iPlayForSG - 博客园 (cnblogs.com)

添加magic number就行,其他都可以为0。修复成功后,就要使用Uncompyle6工具,对pyc文件进行反编译。用win+r打开终端,cd到要反编译的文件夹,使用uncompyle6 -o ezpython.py ezpython.pyc,就会直接生成对应py文件,但是这种就算出错也会在py里显示,不是非常方便,也可使用uncompyle6.exe .\ezpython.pyc 指令来实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值