misc-压缩包

文章目录

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

文件头

格式 文件头(16进制) 文件头(ascii)
zip 504B0304 PK
rar 52617221 Rar!
7z 377ABCAF271C 7z¼¯’

注意: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 <cstdio>
#include <vector>
#include <array>
#include <string>
#include <set>
#include <cstdint>
#include <cctype>
#define repeat(i,n) for (int i = 0; (i) < (n); ++(i))
using namespace std;uint32_t crc_table[256];
void make_crc_table() {repeat (i, 256) {uint32_t c = i;repeat (j, 8) {c = (c & 1) ? (0xedb88320 ^ (c >> 1)) : (c >> 1);}crc_table[i] = c;}
}
const uint32_t initial_crc32 = 0xffffffff;
uint32_t next_crc32(uint32_t c, char b) {return crc_table[(c ^ b) & 0xff] ^ (c >> 8);
}
const uint32_t mask_crc32 = 0xffffffff;const char alphabet[] = { ''' + ', '.join(map(str, args.alphabet)) + r''' };
const int limit = ''' + str(limit) + r''';array<set<uint32_t>, limit+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 != '\\') ? "%c" : "\\x%02x", c);fprintf(stderr, "\"\n");printf("%08x ", crc ^ mask_crc32);for (char c : stk) printf(" %02x", c);printf("\n");}if (stk.length() < limit) {for (char c : alphabet) {stk.push_back(c);dfs(next_crc32(crc, c));stk.pop_back();}}
}int main() {
'''
for crc, size in crcs:code += '    crcs[' + str(size) + '].insert(' + hex(crc) + ');\n'
code += r'''make_crc_table();dfs(initial_crc32);return 0;
}
'''import tempfile
import subprocess
with tempfile.TemporaryDirectory() as tmpdir:cppname = os.path.join(tmpdir, 'a.cpp')with open(cppname, 'w') as fh:fh.write(code)binname = os.path.join(tmpdir, 'a.out')print('compiling...', file=sys.stderr)p = subprocess.check_call([args.compiler, '-std=c++11', '-O3', '-o', binname, cppname])print('searching...', file=sys.stderr)p = subprocess.Popen([binname], stdout=subprocess.PIPE)output, _ = p.communicate()print('done', file=sys.stderr)
print(file=sys.stderr)
result = collections.defaultdict(list)
for line in output.decode().strip().split('\n'):crc, *val = map(lambda x: int(x, 16), line.split())result[( crc, len(val) )] += [ bytes(val) ]
for key, crc in targets.items():for s in result[crc]:print('%s : %s' % (key, repr(s)[1:]))

多个压缩文件合并

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

docx文件

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

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

CTF-misc-压缩包解题思路相关推荐

  1. CTF学习-密码学解题思路

    CTF学习-密码学解题思路 密码学持续更新 密码学概述 密码学的发展 第一个阶段是从古代到19世纪末-古典密码 (classical cryptography) 第二个阶段从20世纪初到1949年-近 ...

  2. CTF学习-逆向解题思路

    CTF学习-逆向解题思路 持续更新 一.通用过程 通过file命令查看文件类型,判断是ELF还是PE,32位还是64位. 通过strings并重定向标准输出,然后搜索大括号 { ,看看是否能直接得到f ...

  3. CTF学习-web解题思路

    CTF学习-web题思路 持续更新 基础篇 1.直接查看源代码 2.修改或添加HTTP请求头 常见的有: Referer来源伪造 X-Forwarded-For:ip伪造 User-Agent:用户代 ...

  4. CTF MISC压缩包简单题学习思路总结(持续更新)

    系列文章目录 太复杂了,已经懒得写目录了,怎么我自己分了这么多篇CTF简单题思路总结啊,我真是太菜了,各位大佬有兴趣可以去分类专栏看一看 文章目录 系列文章目录 前言 一.压缩包识别/修复 二.压缩包 ...

  5. i春秋CTF训练营Rotated!解题思路及其过程。

    遥想当年参加CTF大赛从一个是用别人脚本到自己写脚本的脚本小子,转眼间过去这么多年,现在重拾参加一下CTF结果最简单的题目都不会了,我不配 目录 1.拿题目 2.凯撒解密 4.开始解密 5.解密成功 ...

  6. 网络安全ctf比赛/学习资源整理,解题工具、比赛时间、解题思路、实战靶场、学习路线,推荐收藏!...

    对于想学习或者参加CTF比赛的朋友来说,CTF工具.练习靶场必不可少,今天给大家分享自己收藏的CTF资源,希望能对各位有所帮助. CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站,内容 ...

  7. CTF|pwn栈溢出入门题level3解题思路及个人总结

    CTF|pwn栈溢出入门题level3解题思路及个人总结 解题思路 拿到题目将文件下载下来拖入ubuntu 发现这一次的文件比较特殊:是一个linux环境下的压缩包,自然而然想到的是解压它 通过命令行 ...

  8. BUUCTF misc 二维码1解题思路

    BUUCTF misc 二维码1解题思路 1题目 2打开后发现是一个二维码,首先我们将它放到010中分析发现藏有pk开头的压缩包,然后我们使用kali把压缩包分离出来 dd if=QR_code.pn ...

  9. 2020年11月份某kh比赛部分CTF赛题求大佬解题思路

    2020年11月份某kh比赛部分CTF赛题求大佬解题思路 只down下来misc和密码两类题 麻烦大佬们搞一搞这四道题 只down下来misc和密码两类题 百度网盘赛题分享 链接: https://p ...

  10. CTF MISC图片隐写简单题学习思路总结(持续更新)

    系列文章目录 第一篇文章: CTF Crypto简单题学习思路总结(持续更新) 文章目录 系列文章目录 前言 一.JPG类隐写 1.1 JPG文件末尾添加字符串 1.2 JPG文件中添加字符串 1.3 ...

最新文章

  1. 开发人员如何解决Linux性能优化之痛?
  2. 亿级别记录的mongodb批量导入Es的java代码完整实现
  3. 攻防世界(pwn) level3
  4. python 将YOLO(txt)格式的标注数据批量转换为PascalVOC(XML)格式的标注数据
  5. 详解JRE和JDK的区别
  6. 如何理解python_如何理解 Python
  7. 如何通过Rultor将Maven工件部署到CloudRepo
  8. (转) Spring读书笔记-----Spring的Bean之配置依赖
  9. html标签名都是小写,到底啥是w3c标准(示例代码)
  10. tuning-primer.sh 性能调试工具的使用
  11. 添加Expires头
  12. [句子成分] 四、状语 定语 同位语
  13. 在数组中 找左边都比其小右边都比其大的元素
  14. C#如何获取本机IP地址,两种方法
  15. 7-1 sdut-求一个3*3矩阵对角线元素之和7-2 求矩阵各行元素之和7-3 sdut- 对称矩阵的判定7-4 sdut- 杨辉三角7-5 sdut- 鞍点计算7-6 矩阵转置
  16. 计算机多媒体处理的是什么意思,多媒体系统是什么意思有什么组成
  17. cpa会计税法用计算机,cpa考试可以带计算器吗?有什么要求?
  18. 十三个强大的Linux性能监测工具
  19. Java国际化ResourceBundle详解
  20. Office 文件解析入门

热门文章

  1. 微信如何群发消息?如何群发突破200上限?
  2. android 开源项目
  3. ibus替代scim
  4. Java This和Super用法
  5. [渝粤教育] 西南科技大学 公共经济学 在线考试复习资料
  6. 如何快速来一套苹果全家桶
  7. 电脑录屏怎么操作,操作步骤详解,2023新版
  8. python柱状图加百分比_关于Python数据分析进行整理柱状图加百分比
  9. 第三方支付基本断掉了直连 网联目前“尚未参与手续费分配”
  10. 2、CSS动画——拳皇动画实现