热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CTFmisc压缩包解题思路

misc-压缩包文章目录misc-压缩包文件头看属性命令分离文件暴力破解zip伪加密已知明文攻击crc32碰撞多个压缩文件合并docx文件文件头格式文件头(16进制


misc-压缩包


文章目录

  • misc-压缩包
    • 文件头
      • 看属性
      • 命令分离文件
      • 暴力破解
      • zip伪加密
      • 已知明文攻击
      • crc32碰撞
      • 多个压缩文件合并
      • docx文件


文件头


格式文件头(16进制)文件头(ascii)
zip504B0304PK
rar52617221Rar!
7z377ABCAF271C7z¼¯’

注意:wordx文件其实是一种zip

关于文件两个简单命令


  • file命令,根据文件头来识别文件类型
  • strings,输出文件中的可打印字符串

可以发现一些提示信息或特殊编码信息

strings filename

配合-o 参数获取所有ascii 字符偏移,即字符串在文件中的位置

root@kali:~/桌面/crc# strings 1.txt |grep "flag"

看属性


命令分离文件

binwalk、foremost


暴力破解

最简单、最直接的攻击方式,适合密码较为简单或是已知密码的格式或者范围时使用

工具:apchpr(windows)、fcrackzip(linux)


zip伪加密

原理:一个zip文件由三部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。

图片

全局方式位标记的四个数字中只有第二个数字对其有影响,其它的不管为何值,都不影响它的加密属性!

第二个数字为奇数时 –>加密

第二个数字为偶数时 –>未加密

无加密

压缩源文件数据区的全局加密应当为00 00(504B0304两个bytes之后)

且压缩源文件目录区的全局方式位标记应当为00 00(504B0304四个bytes之后)

假加密

压缩源文件数据区的全局加密应当为00 00

且压缩源文件目录区的全局方式位标记应当为09 00

真加密

压缩源文件数据区的全局加密应当为09 00

且压缩源文件目录区的全局方式位标记应当为09 00

修复方法:


  1. 修改通用标志位
  2. winrar修复
  3. binwalk -e 命令可以无视伪加密,从压缩包中提取文件,macos可以直接打开伪加密zip压缩包
  4. ZipCenOp.jar(win)

找到所在文件夹,在地址栏输入cmd

java -jar ZipCenOp.jar r 文件名


已知明文攻击

我们为ZIP压缩文件所设定的密码,先被转换成了3个4字节的key,再用这3个key加密所有文件。如果我们能通过某种方式拿到压缩包中的一个文件,然后以同样的方式压缩,选择不去爆破密码。这种攻击方式便是已知明文攻击。

题目特征:有一个加密压缩包一个未加密压缩包(或者是一个文件)这个文件是加密压缩包的一部分图片

注意使用的压缩软件和压缩格式,压缩完对比crc32校验码

图片


crc32碰撞

CRC校验是在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。

总之每个文件都有唯一的CRC32值,即便数据中一个bit发生变化,也会导致CRC32值不同。若是知道一段数据的长度和CRC32值,便可穷举数据,与其CRC32对照,以此达到暴力猜解的目的。但通常只适用于较小文本文件。

zip文件中crc32为未加密文件的校验码

比如这里有一个加密的压缩包,直接双击就可以看见其中信息,而且我知道其中全是数字,便可使用脚本爆破。

题目特征:文件本身内容很小,密码很复杂图片

crc.py(需要linux环境)

python2 crc.py 2.zip

crc.py

#!/usr/bin/env python3
import sys
import os
import string
import collectionsimport argparse
parser = argparse.ArgumentParser()
parser.add_argument('file', nargs='*')
parser.add_argument('--hex', action='append')
parser.add_argument('--dec', action='append')
parser.add_argument('--limit', type=int)
parser.add_argument('--compiler', default='g++')
parser.add_argument('--alphabet', type=os.fsencode, default=string.printable.encode())
args = parser.parse_args()targets = collections.OrderedDict()
limit = 0
crcs = []if args.limit:limit = max(limit, args.limit)
if args.hex or args.dec:if not args.limit:parser.error('Limit of length not specified')if args.hex:for s in args.hex:crc = int(s, 16)targets[s] = crcfor l in range(args.limit + 1):crcs += [( crc, l )]
if args.dec:for s in args.dec:crc = int(s)targets[s] = crcfor l in range(args.limit + 1):crcs += [( crc, l )]if args.file:print('reading zip files...', file=sys.stderr)import zipfilefor zipname in args.file:fh = zipfile.ZipFile(zipname)for info in fh.infolist():targets['%s / %s' % ( zipname, info.filename )] = ( info.CRC, info.file_size )crcs += [( info.CRC, info.file_size )]limit = max(limit, info.file_size)print('file found: %s / %s: crc = 0x%08x, size = %d' % (zipname, info.filename, info.CRC, info.file_size), file=sys.stderr)if not crcs:parser.error('No CRCs given')# compiling c++ in python script is the easy way to have the both a good interface and better speed
code = ''
code += r'''
#include
#include
#include
#include
#include
#include
#include
#define repeat(i,n) for (int i &#61; 0; (i) <(n); &#43;&#43;(i))
using namespace std;uint32_t crc_table[256];
void make_crc_table() {repeat (i, 256) {uint32_t c &#61; i;repeat (j, 8) {c &#61; (c & 1) ? (0xedb88320 ^ (c >> 1)) : (c >> 1);}crc_table[i] &#61; c;}
}
const uint32_t initial_crc32 &#61; 0xffffffff;
uint32_t next_crc32(uint32_t c, char b) {return crc_table[(c ^ b) & 0xff] ^ (c >> 8);
}
const uint32_t mask_crc32 &#61; 0xffffffff;const char alphabet[] &#61; { &#39;&#39;&#39;
&#43; &#39;, &#39;.join(map(str, args.alphabet)) &#43; r&#39;&#39;&#39; };
const int limit &#61; &#39;&#39;&#39;
&#43; str(limit) &#43; r&#39;&#39;&#39;;array, limit&#43;1> crcs;
string stk;
void dfs(uint32_t crc) {if (crcs[stk.length()].count(crc ^ mask_crc32)) {fprintf(stderr, "crc found: 0x%08x: \"", crc ^ mask_crc32);for (char c : stk) fprintf(stderr, isprint(c) && (c !&#61; &#39;\\&#39;) ? "%c" : "\\x%02x", c);fprintf(stderr, "\"\n");printf("%08x ", crc ^ mask_crc32);for (char c : stk) printf(" %02x", c);printf("\n");}if (stk.length() }int main() {
&#39;&#39;&#39;

for crc, size in crcs:code &#43;&#61; &#39; crcs[&#39; &#43; str(size) &#43; &#39;].insert(&#39; &#43; hex(crc) &#43; &#39;);\n&#39;
code &#43;&#61; r&#39;&#39;&#39;make_crc_table();dfs(initial_crc32);return 0;
}
&#39;&#39;&#39;
import tempfile
import subprocess
with tempfile.TemporaryDirectory() as tmpdir:cppname &#61; os.path.join(tmpdir, &#39;a.cpp&#39;)with open(cppname, &#39;w&#39;) as fh:fh.write(code)binname &#61; os.path.join(tmpdir, &#39;a.out&#39;)print(&#39;compiling...&#39;, file&#61;sys.stderr)p &#61; subprocess.check_call([args.compiler, &#39;-std&#61;c&#43;&#43;11&#39;, &#39;-O3&#39;, &#39;-o&#39;, binname, cppname])print(&#39;searching...&#39;, file&#61;sys.stderr)p &#61; subprocess.Popen([binname], stdout&#61;subprocess.PIPE)output, _ &#61; p.communicate()print(&#39;done&#39;, file&#61;sys.stderr)
print(file&#61;sys.stderr)
result &#61; collections.defaultdict(list)
for line in output.decode().strip().split(&#39;\n&#39;):crc, *val &#61; map(lambda x: int(x, 16), line.split())result[( crc, len(val) )] &#43;&#61; [ bytes(val) ]
for key, crc in targets.items():for s in result[crc]:print(&#39;%s : %s&#39; % (key, repr(s)[1:]))

多个压缩文件合并

cat 文件名(按需) > 保存文件名


docx文件

docx文件就是包含xml文件的zip压缩包

可能隐藏文件、信息在压缩包里面&#xff0c;word直接打开是看不见的




推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
author-avatar
dfdzgf_542
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有