misc
lyh Lv1

#如来十三掌
打开网址,发现有如下文字
如来十三掌
wochao
,打开与佛论禅.然后注意要加上佛曰:或如是我闻:,冒号都是中文的。复制放在下面的文本框里。得到一行代码:MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9
然后发现这行代码有大小写字母还有数字,同时长度也是4的倍数。base64直接解密。十三也可能会导致往rot13方向想。
base64的特征:base64由大写字母(A-Z),小写字母(a-z),数字(0-9),+/组成。如果字符不足会用=补齐,特征很明显。

#give you flag
打开文件,发现后缀是gif动图,然后用stegsolve(图片隐写神器)打开
stegsolve下载地址这个是需要安装Java,然后配置环境变量才能使用的。具体网上自己搜吧。。

然后用stegsolve打开,点击Analyse,使用Frame Browser动图分解,发现如下二维码
wochao
使用画图软件
111补一下就行,我的画图升到win11了,画图不太好用。。。

然后是一点二维码的知识
222
二维码的一些知识,想看的可以看看

#stegano
stegano
打开附件,发现是一个pdf文件
stegano
然后就发现和招新赛那个题很像。ctrl+A全选,复制到word里面,

stgano

然后就发现AB的字符串。首先想到的是培根密码,但是培根密码都是五个一组来替换的。又想到了摩斯密码,有两种情况,将A替换成.B替换成-或者反过来。
(替换可以使用word里面的替换功能,我以前笨的一个个换的害)
放入摩斯密码在线解密网站即可
flag就不放了。

反思:密密麻麻的给我一种凯斯密码的错觉。。

#坚持60s
思路:

打开文件发现是一个小游戏,我们可以通过某些手段通关或者分析游戏文件来获得flag(我还玩了几把这个。)

知识点:
考察对jar文件的反编译能力

用360压缩打开附件
1
用IDEA打开PlaneGameFrame类

发现如下代码2
显然是base64解密,base64加解密即可。

反思:
反编译能力,这个类就是通过switch来判断坚持的时长,所以找到源码即可解密。

#gif
下载压缩包打开,发现有104张图片
3
然后用winhex查看一下图片的代码
l
发现都是jpg形式,然后观察到颜色只有两个,就想到了密码,因为我感觉misc好多与密码相关的。自然而然就想到了密码。只有两种编码,就想到了0和1.而且图片有104张,刚好是8的倍数!

然后通过python脚本把图片识别出来
y
得到字符串01100110011011000110000101100111011110110100011001110101010011100101111101100111011010010100011001111101
然后放到二进制转文本(其实还是要八个一组十六进制转文本)
注意两串数之间只能有一个空格
h

#掀桌子
首先打开题目,发现只给了一串密文,所以肯定是密码方面的让我们解密的c8e9aca0c6f2e5f3e8c4efe7a1a0d4e8e5a0e6ece1e7a0e9f3baa0e8eafae3f9e4eafae2eae4e3eaebfaebe3f5e7e9f3e4e3e8eaf9eaf3e2e4e6f2

观察密文特征,有0-9,a-f,不难猜测与十六进制有关。我们又知道两位十六进制可以显示一个字节(),所以可以通过脚本显示ASCII码
l
但是的出来的却是这个È鬠ÆòåóèÄïç¡ Ôèå æìáç éóº èêúãùäêúâêäãêëúëãõçéóäãèêùêóâäæò。。查了一下ASCII码,发现是128以后的。。而ASCII码的范围是0-127,所以对128取余。

即可得到flag。

通过这道题,我学到了ASCII码。我们用到的ASCII码一般都是0-127即7位的ASCII码,但是128-255是一些扩展型的ASCII码。学到了学到了。

#ext3

先看题目的描述,linux系统光盘,所以这应该就是一个Linux文件,flag肯定就藏在其中。用360压缩打开该文件

1
直接搜索flag就找到了flag.txt..
打开得到ZmxhZ3tzYWpiY2lienNrampjbmJoc2J2Y2pianN6Y3N6Ymt6an0=
base64解码即可。我看网上其他wp好像都挺复杂的。。还是我懂得太少了,一题多解多发散!

反思
有关Linux文件系统的题不一定要用Linux系统环境来做,Windows照样可以做。

#SimpleRaR
orz,这种题型实在没头绪(指该去大佬的blog取精了hh)第一篇blog用的WinRAR会提示压缩包里面有损坏的文件,但是3608行。。这时候就该用到我们的winHex神器啦!(自行百度下载)

这里说明一下winhex的用处。winhex是一个专门用来对付各种日常紧急情况的工具。(说了和没说一样。)
它可以用来检查和修复各种文件,恢复删除文件,硬盘损坏造成的数据丢失等。同时它还可以让你看到其他程序隐藏起来的文件和数据(比如图片隐藏)

用winHex打开压缩包,
lyh如果眼睛不好使看不到secret.png的话,就CTRL+f搜索吧(搜索png)。然后flag.txt结束之后就是png的文件了。应该是A8 3C 7A(从别人的wp看到的hh)。这里我们就要修复这个png文件了,涉及到RAR的文件结构,从网上找的,(如果有侵权请联系我,我立马删除!)

lyh
lyh

至此我们知道了文件头应该是十六进制的74,改成74即可,修改后重新打开压缩包,就会发现一个空白图片,然后用我们的图片隐写神器stegsolve,打开图片(这种杂项的题)这是stegsolve的具体使用方法,然后点击右箭头找找就找到了一张二维码的半张图片。然后它又提示了我们ps:双图层,这个没了解过,就去网上找相关的知识(指wp)

额。ps还没下载。。这个双图层的意思就是你可以使用ps将这个双图层分离,然后使用stegsolve可以找到二维码的上半部分和下半部分,拼在一起就行了。还要补习ps知识。。库里奥(哭辽~)

发现看别人的博客收获还蛮多的,我的建议是如果一道题不会,不要只打开一篇博客看,多看几篇,你会收获新东西的嘿嘿嘿

将secret.png继续用winHex打开,发现是gif后缀,把后缀改为gif之后放入ps,就会发现两个空白图层了。将两个空白图层提取出来,用stegsolve打开,不断点击箭头到最终出现二维码的图像,拼接到一起就行了。

这道题考查了非常多的知识点,根本不像一道1★的题。。。
网上很多WP说A8 3C 74是rar对png的文件头编码,这种说法是错误的,做学问切忌一知半解!
很多专门针对CTF而编写的工具是我们日常生活中用不到的,要多收集整理此类工具并灵活运用
(吐槽:360压缩压根不提示你文件头损坏=_=…),好像7z也不提示emmm

将secret.png导入ps,就会在右下角看到图层1和图层2.然后分别导出png格式。然后用stegsolve就可以找到二维码的上半部分和下半部分。然后截两张图片。截图有个小细节要注意,下半部分的不要留空格,要不会扫不出来(我就是这样。。)
lyh
lyh
用画图补全二维码图片应该都会吧,不再赘述了。手机微信扫一下就出来了。

#base64stego

打开stegoo.txt,将内容全部复制下来,强行解密,发现解不了。与是用python文本来解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import base64

data = []
a = open("stego.txt", "rt")
b = a.readlines()

for i in b:
c = base64.b64decode(i.encode("utf-8"))
data.append(c)
a.close()
print(data)

m=open("flag.txt", "wb")
for i in data:
m.write(i)
m.close()

将生成的flag.txt打开,得到一堆字符串
补充:我用的360压缩,能直接打开。但是看网上的wp发现有的还要密码。emmm(360压缩是真强大啊)。所以我就把压缩包也解一下密,供需要的小伙伴看~

zip伪加密
一个zip文件由三部分组成:压缩源文件数据区,压缩源文件目录区,压缩源文件目录结束标志。

伪加密原理:zip伪加密是在文件头中加密标志位做修改,然后在打开时误被识别为加密压缩包。

压缩源文件数据区:

lyh

50 4B 03 04:头文件标记
14 03:解压文件所需 pkware 版本
00 00:全局方式位标记(判断有无加密的重要标志)
08 00:压缩方式
68 BF:最后修改文件的时间
9B 48:最后修改文件的日期
FE 32 7D 4B:CRC-32校验
E9 0D 00 00:压缩后尺寸
B5 1B 00 00:未压缩尺寸
09 00:文件名长度
00 00:扩展记录长度

压缩源文件目录区:
lyh

50 4B 01 02:目录中文件文件头标记
3F 03:压缩使用的 pkware 版本
14 03:解压文件所需 pkware 版本
09 00:全局方式位标记(有无加密的重要标志,这个更改这里进行伪加密,改为00 00打开不会提示要密码了)
08 00:压缩方式
68 BF:最后修改文件的时间
9B 48:最后修改文件的日期
FE 32 7D 4B:CRC-32校验
E9 0D 00 00:压缩后尺寸
B5 1B 00 00:未压缩尺寸
09 00:文件名长度
24 00:扩展字段长度
00 00:文件注释长度
00 00:磁盘开始号
00 00:内部文件属性
20 80 ED 81:外部文件属性
00 00 00 00:局部头部偏移量

压缩源文件目录结束标志:

50 4B 05 06:目录结束标记
00 00:当前磁盘编号
00 00:目录区开始磁盘编号
01 00:本磁盘上纪录总数
01 00:目录区中纪录总数
5B 00 00 00:目录区尺寸大小
10 0E 00 00:目录区对第一张磁盘的偏移量
00 00:ZIP 文件注释长度

判断是否加密:

无加密:
压缩源文件数据区的全局加密应当为00 00
压缩源文件目录区的全局方式位标志应当为00 00

伪加密
压缩源文件数据区的全局加密应当为00 00
压缩源文件目录区的全局方式位标志应当为09 00

真加密
压缩源文件数据区的全局加密应当为09 00
压缩源文件目录区的全局方式位标记应当为09 00

使用winhex打开压缩包,根据观察这个文件使用了伪加密,所以将压缩源文件目录区的全局方式位改为00 00保存即可解压
lyh

学问莫要做到一知半解。应该刨根问底!

base64解码原理

base64编码用64个ascii字符作为基础来编码二进制内容。编码后的数据是一个字符串,包含的字符位:A-Za-z0-9+/共64个字符,其中=是填充字符。

编码规则:把3个8位字节转化为4个6位字节,再根据每个字节的值,用base64编码表中的值替换,不足4个字节的,补“=”,编码得到的字符串长度必为4的倍数。

编码步骤:
1.将待编码字符串各个字符转换为ASCII值
2.将得到的ASCII值转换为8位二进制
3.将得到的8位二进制字符串分割位6位一组(不足6位的末尾添0补上)
4.将每个6位二进制数列转换为十进制。(6位二进制最大值位63:111 111)
5.将转换得到的十进制值按照对应的base64编码表中的字符进行替换一下
6. 若编码后所得字符串长不是4的倍数。添加一个或者两个“=”补上i即可。

当编码的文本字节数是3的倍数时,刚好可以编码位4个字符

编码的文本字节数不是3的倍数时,剩下1个字符时

编码的文本字节数不是3的倍数时,剩下2个字符时

解码步骤:
1.将待解码字符串中的字符对应查找base64编码表中的序列值(末尾的“=”直接忽略)
2.将所得对应序列值转换为6位二进制字符串
3.将所有6位二进制字符串从左往右按8位分割(多的是补的0所以直接丢掉并不会影响数据还原结果)
4.将每个8位二进制字符串转换位十进制
5.再将十进制转换位对应的ASCII字符串即可。

base64隐写原理
它之所以能够进行信息的隐藏,原因就在于解码时的第三步,会有部分多余数据被丢弃,而且这些数据是我们进行补充的0,那要是我们不全用0进行补充,而是用1或者0进行填充(二进制),这样就可以隐藏信息了。
提取信息的话,将我们填充进去的数据拿出来然后组成一串二进制字符串进行转码即可。由于一串base64编码最多只有4bit的隐写空间,所以实现隐写需要大量的编码串。

下面是脚本
也顺便学习一下python。bin()函数:返回指定整数的二进制数值,但结果总以0b开头!readlines()函数:返回列表,包含所有的行。strip函数():删除开头与结尾指定的字符串或字符,如果什么的都没有则删除空格。zfill函数():zfill(width) width:指定字符串的长度,原字符串右对齐,前面补充零菜鸟教程zfill()

代码解题即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def base64change(s):
table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' # base64编码表,恰好索引值对应字母
for i in range(len(table)):
if table[i] == s:
return i


# 此方法用来获取隐藏信息二进制字符串
def base64solve():
f = open('C:\\Users\\admin\\Desktop\\stego.txt','r')
lines = f.readlines()

flag_bin = ''
for line in lines:
# print(line)
l = line.strip() # 去掉两边的空格
if l[-1] == '=':
if l[-2] == '=': # 含有两个=则包含4bit信息
# 将返回的十进制转换为二进制数,由于返回的二进制数为0b开头,所以从第三位开始取,然后用0填充头部为4位,再取后四位隐藏的信息
flag_bin += bin(base64change(l[-3]))[2:].zfill(4)[-4:]
else:# 只含一个=则包含二bit信息
flag_bin += bin(base64change(l[-2]))[2:].zfill(2)[-2:]
#print(flag_bin)
flag = ''
for i in range(len(flag_bin)//8):
flag += chr(int(flag_bin[i * 8:(i + 1) * 8], 2))
print(flag)


if __name__ == '__main__':
base64solve()
  • Post title:misc
  • Post author:lyh
  • Create time:2021-12-06 11:33:16
  • Post link:https://keep.xpoet.cn/2021/12/06/misc/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments