base64stego (来源:攻防世界)

1.关卡描述


2.解题步骤


分析:

首先题目就告诉了我们base64,stego不知道是什么可能是某个工具,描述又提到十三,那么存在ROT13解密的可能性。(笔记:stego是Steganography的缩写,即隐写)

下载附件,发现是一个加密的zip文件,没有什么密码提示,估计就是伪加密了

利用010editor找到并修改09改成00

解密之后,看到文本内容:

base64解码一下:

又去解码了一小段:

发现结果是一样的,利用脚本试试,发现也不行

那么,我们先ROT13一下:

base64之后:

又试了一下先base64再rot13,还是不行,完全不知道怎么做了。

=================================

参考资料:

看题目来源是olympicCTF,这是俄罗斯2014 年有道 misc 题是关于 Base64 的隐写题,那我们直接写解码,这里的思路是先循环解密base64字符串,提取出可以隐写的最后2-4位,再拼接最后转回ascii码flag就出来了

import base64
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
base64=''def deBase64(base64_):data=''Bytes=""num=0for i in range(len(base64_)):if base64_[i] == '=':data = "00"num -= 2#一个“=”可以隐藏2bit数据else:data = bin(base64chars.find(base64_[i]))[2:]#base64chars共64个数,二进制表示0111111,所以舍弃八位二进制的最高位Bytes += data.zfill(6)#不够六位二进制的前面补0,不断往后加成字符串return Bytes[num:]#返回隐藏的数据内容with open('stego.txt','rb') as f:#rb:以二进制格式打开一个文件用于只读,文件指针将会放在文件的开头。这是默认模式flag = ''bin_str = ''for line in f .readlines():#readlines()方法用于读取所有行(直到结束符 EOF)并返回列表base64 = str(line,"utf-8").strip("\n")#去掉每行头尾空白if(not base64.count('=')):continue#该行无“=”则下一行bin_str += deBase64(base64)#将隐藏的内容拼接成字符串for j in range(0,len(bin_str),8):flag += chr(int(bin_str[j:j+8],2))#以字节为单位,将二进制转化为对应ASCII码字符print("flag{{{}}}".format(flag.strip(b'\x00'.decode())))#去除不可见字符显示

===========

接下来来学习一下base64隐写的原理

复习一下 Base64 吧:

https://www.tr0y.wang/2017/06/14/Base64steg/#%E5%A4%8D%E4%B9%A0%E4%B8%80%E4%B8%8B-Base64-%E5%90%A7

BASE64 是一种编码方式, 是一种可逆的编码方式.

编码后的数据是一个字符串, 包含的字符为: A-Za-z0-9+/

共 64 个字符:26 + 26 + 10 + 1 + 1 = 64

其实是 65 个字符, = 是填充字符.

64 个字符需要 6 位二进制来表示, 表示成数值为 0~63.

这样, 长度为 3 个字节的数据经过 Base64 编码后就变为 4 个字节

编码

比如, 字符串”Tr0”经过 Base64 编码后变为”VHIw”

上面说的字符串长度为 3 个字节的数据位数是 8x3=24, 可以精确地分成 6x4.

如果字节数不是 3 的倍数, 则位数就不是 6 的倍数, 那么就不能精确地划分成 6 位的块.

此时, 需在原数据二进制值后面添加零, 使其字节数是 6 的倍数.

然后, 在编码后的字符串后面添加 1 个或 2 个等号”=”, 表示所添加的零值字节数.

比如, 字符串”Tr0y”经过 Base64 编码后变为”VHIweQ==”

橙色底纹就是添加的 0.

这是 Base64 编码的方式.

解码

解码就是编码的逆过程.

  1. 把 Base64 字符串去掉等号, 转为二进制数(VHIweQ== -> VHIweQ -> 010101000111001000110000011110010000).
  2. 从左到右, 8 个位一组, 多余位的扔掉, 转为对应的 ASCII 码(01010100 01110010 00110000 01111001 0000 -> 扔掉最后 4 位 -> 01010100 01110010 00110000 01111001 -> Tr0y)

隐写原理

注意红色的 0, 我们在解码的时候将其丢弃了, 所以这里的值不会影响解码. 所以我们可以在这进行隐写.

为什么等号的那部分 0 不能用于隐写? 因为修改那里的二进制值会导致等号数量变化, 解码的第 1 步会受影响. 自然也就破坏了源字符串.

而红色部分的 0 是作为最后一个字符二进制的组成部分, 还原时只用到了最后一个字符二进制的前部分, 后面的部分就不会影响还原.

唯一的影响就是最后一个字符会变化. 如下图

如果你直接解密’VHIweQ==’与’VHIweR==’, 得到的结果都是’Tr0y’.

当然, 一行 base64 顶多能有 2 个等号, 也就是有 2*2 位的可隐写位. 所以我们得弄很多行, 才能隐藏一个字符串, 这也是为什么题目给了一大段 base64 的原因.

接下来, 把要隐藏的 flag 转为 8 位二进制, 塞进去就行了.

加密

# -*- coding: cp936 -*-
import base64
flag = 'Tr0y{Base64isF4n}' #flag
bin_str = ''.join([bin(ord(c)).replace('0b', '').zfill(8) for c in flag])
base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('0.txt', 'rb') as f0, open('1.txt', 'wb') as f1: #'0.txt'是明文, '1.txt'用于存放隐写后的 base64for line in f0.readlines():rowstr = base64.b64encode(line.replace('\n', ''))equalnum = rowstr.count('=')if equalnum and len(bin_str):offset = int('0b'+bin_str[:equalnum * 2], 2)char = rowstr[len(rowstr) - equalnum - 1]rowstr = rowstr.replace(char, base64chars[base64chars.index(char) + offset])bin_str = bin_str[equalnum*2:]f1.write(rowstr + '\n')

解密

# -*- coding: cp936 -*-
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('1.txt', 'rb') as f:bin_str = ''for line in f.readlines():stegb64 = ''.join(line.split())rowb64 =  ''.join(stegb64.decode('base64').encode('base64').split())offset = abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=','')[-1]))equalnum = stegb64.count('=') #no equalnum no offsetif equalnum:bin_str += bin(offset)[2:].zfill(equalnum * 2)print ''.join([chr(int(bin_str[i:i + 8], 2)) for i in xrange(0, len(bin_str), 8)]) #8 位一组

很多国外的 CTF 出题思路异常开阔, 值得好好学学.

base64stego--即base64隐写相关推荐

  1. base64隐写(攻防世界杂项base64stego)

    base64原理 先简单介绍一下base64解密: (图片来源见水印,侵删) base64使用 a-zA-Z0-9+/ 等64个字符来替换掉所有字符,同时使用 = 来替换掉空格,既然一共有64个字符, ...

  2. Misc 第七篇——base64stego(伪加密,base64隐写)

    题目描述:菜狗经过几天的学习,终于发现了如来十三掌最后一步的精髓 附件给了一个压缩包,伪加密,使用360解压缩成功解压. 解压后是一个文本文件,如下图,使用base64加密的一堆字符串, 单纯使用ba ...

  3. MISC | base64隐写

    前言 懒狗一个,最近打比赛才知道还有base64隐写,有很多大师傅已经记录了原理,这里简单写一下. base64 base64编码就是用64个ascii字符作为基础来编码二进制内容的一种编码方式.编码 ...

  4. 20220207-CTF-MISC-第11题--- base64隐写--附带脚本

    攻防世界- MISC新手区–第11题–base64隐写 下载之后解压,是stego.txt 打开stego.txt 显然是base64编码之后的结果,base64解码,我还百度翻译了一下,也没什么发现 ...

  5. 密码学-->base64隐写

    base64隐写 先复习一下base64 加密解密的方式: 这里是引用 Base64是一种基于64个可打印字符表示二进制数据的表示方法,其一大特点是能够将不可打印字符编码为可打印字符. 这里是引用 B ...

  6. BUUCTF-MISC-[ACTF新生赛2020]base64隐写

    1.题目描述: 2.下载文件 打开之后发现一个文件夹,两个压缩包,文件夹里的压缩包打不开,而._近在眼前.zip也打不开,只有近在眼前.zip可以打开 近在眼前文件夹 二维码没什么东西,ComeOn! ...

  7. [NPUCTF2020]芜湖(Base64隐写)

    查壳: 拖进ida 异或 v2 = Oo0O((v3 >> (7 - k)) & 1, (97 >> (7 - k)) & 1) & 1 ^ 2 * v ...

  8. 彻底搞懂base64加解密原理和隐写技术

    base64编码和解码是一个常用的方式,可以避免明文传输或者存储,也可以结合加解密技术进行使用. base64 编码的定义:base64编码表: base64 采用6位二进制进行编码,不足部分补足0, ...

  9. CTF-MISC隐写总结

    文章首发于freebuf 地址:https://www.freebuf.com/articles/others-articles/266884.html 本文仅就个人练习过的misc题目所涉及的知识点 ...

最新文章

  1. 神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火
  2. xss原理、攻击方式与防御
  3. 专题导读:高性能计算虚拟数据空间
  4. mysql配置文件改密码_mysql8.0 安装教程(自定义配置文件,密码方式已修改)
  5. iOS开发特效源码:swift轮播图导航渐变跑马灯分段选择下拉菜单物流时间轴
  6. HDU1427 速算24点
  7. 20191102每日一句
  8. Springboot后台管理系统
  9. python菜鸟驿站-NumPy 教程
  10. Python字符串逆序输出(六种方法)
  11. java date()使用_Java Date from()用法及代码示例
  12. 服装行业个性化服务:订阅电商鼻祖Stitch Fix商业模式中的个性化推荐分析
  13. 还在为不知道怎么学习网络安全而烦恼吗?这篇文带你从入门级开始学习网络安全—认识网络安全
  14. Dcloud学习资料汇总+视频教程
  15. matlab corner 舍弃,CornerNet为什么有别于其他目标检测领域的主流算法?
  16. 用HTML+CSS编写课程表及个人简历表
  17. 临时尖底锥型过滤器 锥型过滤器
  18. Linux:GNU/Linux、BSD、自由软件、GPL、glibc词义说明
  19. 进程优化工具Process Lasso Pro 8.4官方版+激活破解方法
  20. 雄迈信息联合华为海思发布H.265AI技术,让安防视频更智能

热门文章

  1. TWaver在FTTX设备网管系统中的应用
  2. python爬取南京市房价_python 爬取链家南京的数据
  3. js 二维码扫描盒/枪对接
  4. Scala Api 操作 Elasticsearch数据库
  5. L3-1 那就别担心了 (30分) 2020 天梯赛
  6. SMB 获取系统信息与SSH与FTP服务识别
  7. Spring Boot + vue-element 开发个人博客项目实战教程(二十五、项目完善及扩展(前端部分))
  8. android 重启应用(cocos2d-x重启游戏)
  9. DASCTF 7月赋能赛pwn wp
  10. 支气管肺炎小叶肺炎(转)