zl程序教程

您现在的位置是:首页 >  其他

当前栏目

[网络安全] 四十一.WHUCTF (4)三道隐写基础题目(文字解密、图片解密、佛语解码)

2023-03-31 10:33:33 时间

文章目录:

  • 一.Misc-版权保护 1.题目描述 2.解题思路
  • 二.Misc-过早了吗 1.题目描述 2.解题思路
  • 三.Misc-佛系青年BingGe 1.题目描述 2.解题思路
  • 四.总结

作者的github资源:

  • 逆向分析:https://github.com/eastmountyxz/ SystemSecurity-ReverseAnalysis
  • 网络安全:https://github.com/eastmountyxz/ NetworkSecuritySelf-study

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。网站目前可以访问,后续应该会关闭,初学者可以试试,但切勿破坏。


一.Misc-版权保护

1.题目描述

该题目解压之后包括两个文件,题目描述为“小p发现自己的文章被别人复制粘贴了,感到很气愤,于是他偷偷地将flag藏到了文章中,你能找到flag吗?格式 whuctf{}”。

打开内容如下,由很多“‍‌‌‌‍‍‌‍我‍‍‌‌‍‍‍‍最‍‌‌‌‍‌‍‍帅‍‌‌‍”组成。这该如何获取Flag呢?

2.解题思路

查看“题目.txt”看到很多重复的“我最帅”,结合题目版权保护猜测其主要考察 —— 宽字节隐写,其中零宽度字符用来作为一种水印参考ga1axy大佬的文章。

  • 浅谈基于零宽度字符的隐写方式

(1) 我们通过CyberChef显示文字Unicode编码内容。

CyberChef是一个简单、直观的Web应用程序,用于在Web浏览器中执行各种网络操作。这些操作包括简单的编码(如XOR或Base64)、更复杂的加密(如AES、DES和Blowfish)、创建二进制文件和hexdump、数据的压缩和解压缩、计算散列和校验和、IPv6和X.509解析、更改字符编码等。GitHub链接: - https://github.com/gchq/CyberChef

打开CyberChef主页显示如下图所示,比如对“Hello”进行MD5加密。

通常零宽度字符在一般的文本编辑器中是不可见的,比如:‌‌‌‌‍‎‍‎Hello,我们用‎‍CyberChef查看一下即可发现其中的奥秘。

(2) 如果我们直接用kali vim打开也可以看到隐藏的信息,并且值字与字之间相隔8个字符,且仅有 <200d> 和 <200c> 形式。在宽字节隐写下,u200d代表0 ,u200c代表1,它是不是能转换成二进制呢?

可以看到里面只有 <200d> 和 <200c> 这两种零宽度字符,稍微调整一下界面如下图所示:

(3) 编写Python脚本提取“我最帅”中的内容。如果遇到“u200d”则显示0,遇到“u200c”则显示1,并将结果内容当作比特串转换为ascii后显示。

#coding=utf8
import binascii

f = open('题目.txt','r',encoding='utf8')
lines = f.readline()
f.close()

#转换为二进制0和1
i = 0
content = ''
for x in lines:
    if x == 'u200d':
        content += '0'
    elif x == 'u200c':
        content += '1'
    #i=i+1
print("输出二进制:")
print(content)

#--------------------------------------------------------------------------------------

#base = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f]
base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('a'),ord('a')+6)]
#print(base)

#二进制 to 十进制: int(str,n=10) 
def bin2dec(string_num):
    return str(int(string_num, 2))

#十进制 to 十六进制: hex() 
def dec2hex(string_num):
    num = int(string_num)
    mid = []
    if num == 0:
        return '0'
    while True:
        if num == 0: break
        num,rem = divmod(num, 16)
        mid.append(base[rem])
    return ''.join([str(x) for x in mid[::-1]])

#二进制 to 十六进制: hex(int(str,2)) 
def bin2hex(string_num):
    return dec2hex(bin2dec(string_num))

#--------------------------------------------------------------------------------------

#转换为十六进制
k = 0
result = ''
num = ''
while k < len(content):
    if k!=0 and (k+1) % 4 == 0:
        num += content[k]
        result += bin2hex(num)  #二进制转十六进制
        #print(num)
        #print(bin2hex(num),'
')
        num = ''
    else:
        num += content[k]
    k += 1 
print("
输出十六进制:")
print(result)


#提取flag
result = result + '0'
flag = binascii.unhexlify(result)
print("
输出flag:")
print(flag)

输出结果如下图所示,whuctf结果为{Y0u_kn0w_h0w_t0_pr0tect111}。

同时,我们可以通过在线网站将0和1二进制直接转换为十六进制,然后调用binascii.unhexlify函数即可获取flag。

补充其他师傅的Python脚本方法:

with open( '题目.txt', 'rb') as f:
    str = f.read()
    print(str)
    length = len(str)
    i = 0
    s = 0
    sum = 0
    while i < length:
        if (int(str[i]) == 226 and int(str[i+1]) == 128 and int(str[i+2]) == 141):
            sum = sum*2
            s = s+1
            if s % 8 == 0:
                print(chr(sum), end='')
                sum = 0
        if (int(str[i]) == 226 and int(str[i+1]) == 128 and int(str[i+2]) == 140):
            sum = sum*2
            sum = sum+1
            s = s+1
            if s % 8 == 0:
                print(chr(sum), end='')
                sum = 0
        i = i+3

最后补充武大CTF师傅的WP代码和参考文献,确实跟他们学到很多,推荐大家学习。

  • 武汉大学CTF - PeiQi师傅
  • 2020_WHUCTF_Writeup - Ly-sec-l师傅
  • http://www.ga1axy.top/index.php/archives/36/#版权保护
  • whuctf.md - prontosil师傅
  • https://github.com/eastmountyxz/CTF-RE

二.Misc-过早了吗

1.题目描述

该题目提供的是一张早餐图片“yummy.jpeg”,同时提示信息为“一日之计在于晨,你过早了吗?这是我的早餐,有我喜欢的食物,有你喜欢的flag”。

看到这个题肯定想到是图片隐写,图片打开如下图所示,建议读者去我Github链接下载。

  • https://github.com/eastmountyxz/CTF-RE

2.解题思路

之前做过图片隐写的CTF题目,我的第一想法就是能否用Stegsolve工具获取二维码,然后扫描提取flag,如下图所示。哈哈,还是自己太菜了,想得太简单了~

但这道题目,并没有反映。

真正的解决方法是通过另一个工具steghide解出隐藏的内容。

Steghide是一款开源的隐写术软件,它可以让你在一张图片或者音频文件中隐藏你的秘密信息,而且你不会注意到图片或音频文件发生了任何的改变。Steghide是一个命令行软件,其安装语句为“apt-get install steghide”,大家在第一次使用时可以调用steghide --help查看帮助信息。

第一步,在Linux系统中安装steghide。

sudo apt-get install steghide

第二步,在steghide中输入如下命令获取信息。

通过steghide提取出c.txt,如下所示。

yxz@DESKTOP-KUPRQ86:~$ steghide extract -sf yummy.jpeg
Enter passphrase:
wrote extracted data to "c.txt".
yxz@DESKTOP-KUPRQ86:~$

打开c.txt文件如下:

ABAAABAABBABAAABAABAABAAAABBAAABBBBABBBABAAABBAABBAAAAAABBABBAABBBAABBABBBAAABAAAAAAABAABBAAAABBAAABAABAAAAAAAABABAAABABAAAAABAABABAABB

第三步,仅有A和B组成,这是培根(Bacon)密码,然后对其进行解密。

  • 推荐文章:培根密码——python解密

培根密码实际上就是一种替换密码,根据所给表一一对应转换即可加密解密 。

我们通过在线解密网址进行解密,网址为:https://tool.bugku.com/peigen/

最终的flag值为:

  • whuctf{ITISIMPORTANTTOEATBREAKFAST}

第四步,补充知识。 如果我们想在“mm.jpg”图片中隐藏一段密码。

密码为“secret.txt”中的内容“CSDN eastmount”,如下图所示:

使用如下命令即可实现:

steghide embed -cf [图片文件载体] -ef [待隐藏文件]
steghide embed -cf mm.jpg -ef secret.txt

此时我们用Notepad++等软件时候看不到隐藏信息的,如果想查看,则要输入如下命令:

steghide info mm.jpg

为了便于区分,我们将隐藏信息后的图片移动到另一个文件夹内解压,然后获取加密的文件,使用命令如下:

steghide extract -sf mm.jpg

最终提取“secret.txt”文件并获取密码“CSDN eastmount”。

是不是非常有意思,

参考及推荐文章:

  • WHUCTF官方WP
  • http://www.ga1axy.top/index.php/archives/36/#过早了吗 - ga1axy师傅
  • [安全工具] Steghide:Linux下流行命令行隐写工具-鸾林居士

三.Misc-佛系青年BingGe

1.题目描述

该题目提供的是一段描述,我看见我的朋友BingGe坐在信部网球场的栅栏边上看一本佛经,我很好奇,也过去看,只见上面写着:

佛曰:般羅穆僧冥神大侄所隸奢尼哆恐侄大藐若故曳咒室呐阿竟諳他缽悉爍諦哆咒豆苦缽尼帝所冥等上哆瑟俱薩諸諳伊冥特諳實怯他罰不參亦皤有婆僧藝俱羯怯至皤滅知真哆訶亦能怯瑟梵陀奢知呼故梵夢死有皤能薩曰俱穆勝竟怯明奢參世缽佛皤羯瑟奢孕梵逝楞呐醯故奢想謹提諦盡侄阿哆利俱吉罰老謹涅神能皤集實輸奢薩奢數哆波者俱勝俱所遠盡呐倒利闍盧諦罰薩梵曰度提大諦哆穆輸醯怯參侄諸娑梵伽知勝穆伊顛冥參道冥有

看到这个题知道是考察文字解密,比如之前分享过“王”字解密,那么这道题怎么做呢?

2.解题思路

在CTF Crypto中,解码佛语是常见题型。

第一步,我们通过在线网站解密佛语。

  • http://www.keyfc.net/bbs/tools/tudoucode.aspx

在网站中输入内容并点击“参悟佛所言的真意”,解码获取数据为:

767566536773bf1ef643676363676784e1d015847635575637560ff4f41d

注意:这里佛语前边要(中文冒号)加上“佛曰:” 或者 “如是我闻:”。同理,如果我们需要对字符串进行加密,如“flag{eastmount}”,则点击“听佛说宇宙的真谛”即可。

第二步,题目提醒“栅栏边上”,于是联想栅栏密码,多次尝试栅栏解密+hex to ascii,发现为6时能得到flag。

栅栏密码是一种置换密码。例如密文:TEOGSDYUTAENNHLNETAMSHVAED 解密过程:先将密文分为两行 T E O G S D Y U T A E N N H L N E T A M S H V A E D 再按上下上下的顺序组合成一句话:THE LONGEST DAY MUST HAVE AN END

通过在线网站解密得到结果: 7768756374667b6e305f315f616d5f6e30745f615f36756464683173747d

  • https://www.qqxiuzi.cn/bianma/zhalanmima.php

第三步,进行16进制解密获取flag。

import binascii
num = '7768756374667b6e305f315f616d5f6e30745f615f36756464683173747d'
flag = binascii.unhexlify(num)
print(flag)
#'whuctf{n0_1_am_n0t_a_6uddh1st}'

参考及推荐文章:

  • WHUCTF官方WP
  • 2020_WHUCTF_Writeup - Ly-sec-l师傅

四.总结

写到这里,这篇文章就介绍完毕,希望对您有所帮助。学安全近一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。

  • 一.Misc-版权保护
  • 1.题目描述 2.解题思路
  • 二.Misc-过早了吗 1.题目描述 2.解题思路
  • 三.Misc-佛系青年BingGe 1.题目描述 2.解题思路
  • 四.总结

CTF初学者个人建议:

  • 多做CTF题目,多参加CTF比赛,多交流经验
  • CTF题目推荐BUUCTF,比赛每个月都有很多,大赛小赛,比如XCTF、KCTF、WCTF等
  • 每个优秀的CTF选手都有自己的工具库、脚本库、词典库
  • 多向优秀的安全团队学习,关注他们的公众号,甚至加好友,组队比赛
  • CTF比赛对找工作有帮助,但后续建议和漏洞挖掘实际工作结合起来