第九题SimpleRAR:

下载附件后得到一个压缩包打开后得到如下提示

文件头损坏,让我们打开winhex看一下

7a为子块而文件头为74,这里将7a改为74(这里我也不是很清楚,详细大家可以自行去查一下rar文件格式分析,等我搞明白会再给补上的)

改完后我们就能打开了

观察一下我们刚得到的图片,并没有发现什么奇怪的地方,也扔进winhex里看一下

看到此图片应为gif,改完后缀,后看题目有写着双图层,打开ps一看确实是有两个图层,这里用ps将两个图层分离(这里遇到很多问题,这道题有很多方法,可以用ps以及Stegsolve里的frame browser分离图层,但我前面两种方法都失败了,最后我用gif分离软件分离了图层,以后搞明白以后会进行补充)

分离出来两张空白图片

我们用Stegsolve将两个图片降低色域(软件下面的小箭头),得到以下来两张图片

再继续用Stegsolve将两张图片拼接(image combiner)

最后再用ps给二维码p上定位点扫描得到flag

第十题base64stego:

下载附件 得到一个压缩包,打开

得到一个stego.txt文件,打开得到如下界面

得到这么长一段base64的字符串,明显并不可能是直接的base64解码,那么应该就是base64隐写了

关于base64隐写:

先复习一下base64加密

众所周知一段字符串进行base64加密时,我们需要将每个字符串化为八位二进制数,并将所得的二进制字符串六位六位地分解,组合成新的字符串。

而六位六位分解后,不太可能每次都可以被正好分解,这时候就需要我们来加0来补位(这也就是我们base64加密后看到的=),补成既能被8整除(计算机中最小单位为字节,也就是8位二进制数,不能出现不为8位的情况)也能被6整除的个数(也就是加上8*n个0,结果是n为1,2)。

而(i为字节数)i*8%6有三种情况。余0的时候就是不用补位的情况,余2的时候我们需要补上16位0,前4位的0和刚刚剩下的两位正好组成一个六位,剩下两个六位正好组成两个等号,而余4的时候,只需加上8位0就可以了。只是说可能并不理解,这里举几个例子。

好说完base64加密的原理,我们来说一下

base64隐写的原理

我们来看看上面的第二个例子

第二个例子

没有标注的部分我们在解码(解码相当于加密的逆过程)的时候会将其丢掉,这样的话我们将0000,改成其他的数并不影响原先的密文,影响的只是加密后这个相应的字母会变化,但不会影响原先的密文。而如果改掉黄色标记部分的数字,如果改掉前面的数字就会改变密文,改掉后面的我们就会改变=的数量,从而影响解码,因此这里我们就可以改变未标注部分来隐藏一些信息,这样的话像第一个例子那种类型便不能隐写了。由于能隐藏的二进制数位最多为4位,所以我们需要许多句base64加密的密文来隐藏真正的信息,正如我们开始的时候看到的stego.txt一样,明白了这样的原理,我们可以用python写一个脚本来进行解密

# -*- coding: cp936 -*-
import base64
b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
with open('stego.txt', 'rb') as f:
bin_str = ''
for line in f.readlines():
stegb64 = str(line, "utf-8").strip("\n")
rowb64 = str(base64.b64encode(base64.b64decode(stegb64)), "utf-8").strip("\n")
offset = abs(b64chars.index(stegb64.replace('=','')[-1])-b64chars.index(rowb64.replace('=','')[-1]))
equalnum = stegb64.count('=')
if equalnum:
bin_str += bin(offset)[2:].zfill(equalnum * 2)
print (''.join([chr(int(bin_str[i:i + 8], 2)) for i in range(0, len(bin_str), 8)]))

解密得到flag

未完待续……

ps:本人新手一枚,写的题解呢也是以新人的口吻写的所以有许多地方不够专业,也可能还有许多错误,也请各位大佬多多包容,也欢迎各位大佬的指导。

攻防世界——Misc新手练习区解题总结<3>(9-10题)的更多相关文章

  1. 攻防世界——Misc新手练习区解题总结<2>(5-8题)

    第五题gif: 下载附件后,解压得到这样一个文件 几经寻找无果后,发现是不是可以将gif中的黑白图片看做二进制的数字,进而进行解密 最后用二进制转文本得到flag 第六题掀桌子: 看起来是16进制的密 ...

  2. 攻防世界——Misc新手练习区解题总结<1>(1-4题)

    第一题this_if_flag: 第一题就不多说了,题目上就给出了flag复制粘贴就可以了 第二题pdf: 下载附件后,得到如下界面 Ctrl+a全选文字,复制出来看看是什么,粘贴后恰好得到flag ...

  3. 攻防世界——web新手练习区解题记录<1>(1-4题)

    web新手练习区一至四题 第一题view_source: 题目说右键不管用了,我们先获取在线场景来看一看,我们看到这样一个网页,并且右键确实点了没什么反应,而用到右键一般就是查看网页源码 用快捷键(F ...

  4. 攻防世界——web新手练习区解题总结<3>(9-12题)

    第九题simple_php: 看题目说是php代码,那必定要用到php的知识,让我们先获取在线场景,得到如下网页 仔细看这个代码,意思大概是: 1.当a==0且a为真时输出flag1 2.当b为数字退 ...

  5. 攻防世界——web新手练习区解题总结<2>(5-8题)

    第五题cookie: 所需工具:burpsuite(需自行下载) 老规矩看完题,先获取在线场景,得到如下网页 那么什么是cookie呢?大体上就是网站为了识别用户身份而储存在用户本地终端上的数据,类型 ...

  6. 攻防世界 Misc 新手练习区 stegano CONFidence-DS-CTF-Teaser Writeup

    攻防世界 Misc 新手练习区 stegano CONFidence-DS-CTF-Teaser Writeup 题目介绍 题目考点 隐写术 摩斯密码 Writeup 下载附件是PDF文件打开,研究一 ...

  7. 攻防世界 Misc 新手练习区 ext3 bugku Writeup

    攻防世界 Misc 新手练习区 ext3 bugku Writeup 题目介绍 题目考点 WinHex工具的使用 linux磁盘挂载mount命令 Writeup 下载附件拖进winhex分析一下,查 ...

  8. 攻防世界 Misc 新手练习区 gif Writeup

    攻防世界 Misc 新手练习区 gif Writeup 题目介绍 题目考点 仔细联想 字符转换 Writeup 下载附件并打开 104张黑白图 发现是一堆黑色和白色的图片,按某种规律排列,猜想flag ...

  9. 攻防世界 Misc 新手练习区 坚持60s Writeup

    攻防世界 Misc 新手练习区 坚持60s Writeup 题目介绍 题目考点 java反编译 jd-gui 的使用 Writeup 下载附件并打开 kali执行命令 java -jar 9dc125 ...

随机推荐

  1. 使用ProxySQL实现MySQL Group Replication的故障转移、读写分离(一)

    导读: 在之前,我们搭建了MySQL组复制集群环境,MySQL组复制集群环境解决了MySQL集群内部的自动故障转移,但是,组复制并没有解决外部业务的故障转移.举个例子,在A.B.C 3台机器上搭建了组 ...

  2. 简单的vector--- 2

    如何重载operator[]   及其相关细节 如何使用 const_cast<>(  )  和 static_cast<>( ) 模板类 如何内部声明,外部定义友元函数 使用 ...

  3. SeaweedFS在.net core下的实践方案

    一直对分布式的文件储存系统很感兴趣,最开始关注淘宝的TFS(Taobao File System),好像搁浅了,官方地址无法访问,github上面,各种编译问题,无意间发现了SeaweedFS 链接s ...

  4. TF签名 外部测试 内部测试 TestFlight

    1.将release包传到iTunes connect 2. 绿线是内部测试 A.需要添加测试员 B.最多25个测试员 C.提交到iTunes connect不需要等待审核,即可测试 红线是外部测试( ...

  5. Java 多态 接口继承等学习笔记

    Super关键字 1.子类可以调用父类声明的构造方法 : 语法:在子类的构造方法中使用super关键字  super(参数列表) 2.操作被隐藏的成员变量(子类的成员变量和父类的成员变量重名的说法)和 ...

  6. C#LeetCode刷题之#500-键盘行(Keyboard Row)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3796 访问. 给定一个单词列表,只返回可以使用在键盘同一行的字母 ...

  7. Android 开发学习进程0.15 adb cardview framelayout 控件设置状态获取焦点

    Android设备调试桥 即adb 使用adb进行无线调试的一些常用命令 adb tcpip 5555 设置调试端口为5555 防止冲突 adb shell ifconfig wlan0 查询局域网中 ...

  8. 【高阶版】Python词典

    使用dict.fromkeys()创建词典的一个坑 创建词典有三种方法,第一是直接赋值,d = {1:2, 2:3}:第二个是,通过构造方法,d = dict([(1, 2), (2, 3)]),第三 ...

  9. JavaScript基础-01

    1. Javascript是一门动态的.弱类型的.解释型的脚本语言 动态:数据类型在运行时决定 弱类型:变量数据的类型不是确定的,可以随意的进行改变: 解释型:相对编译型来说,编译型计算机在执行之前需 ...

  10. 「MoreThanJava」Day 7:接口详解

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...