MISC入门(信息附加三+文件结构一)

一.知识点

1.时间戳

1.)时间戳定义

    一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。

通俗理解:表示某一刻的时间;


2)时间戳作用;

  客户端在向服务端接口进行请求,如果请求信息进行了加密处理,被第三方截取到请求包,可以使用该请求包进行重复请求操作。如果服务端不进行防重放攻击,就会服务器压力增大,而使用时间戳的方式可以解决这一问题。

  一般,在互联网公司都会在项目中使用时间戳,时间戳主要用于清理缓存,大多数用于版本更新。

防篡改功能:

一般使用的方式就是把参数拼接,比如当前项目AppKey,双方约定的“密钥”,加入到Dictionary字典集中,按ABCD顺序进行排序,最后在MD5+加密.客户端将加密字符串和请求参数一起发送给服务器。服务器按照上述规则拼接加密后,与传入过来的加密字符串比较是否相等。

在当今社会,不论是计算机或是手机,或者其他任何电子设备,都可以通过修改它显示的时间,“穿越”到过去,或者“穿梭”到未来

,我们也可以通过各种软件来修改图片或者视频等等。因此,在网络上,关于时间的信息似乎失去意义,因为几乎任何人都可以修改它。
不过,在区块链中,时间戳永远不会撒谎,因为区块链过去的部分是不能以任何方式进行修改的。而且时间戳是区块链区块包含特定信息的一个过程,它永远存在。

防复用功能:

上面的方式进行加密,就无法解决防复用的问题,这时需要在客户端和服务端分别生成UTC的时间戳,这个UTC是防止你的客户端与服务端不在同一个时区,呵呵,然后把时间戳timestamp拼在密文里就可以了,至于防复用的有效性。

跨平台性:

为了实现跨平台在应用系统中记录时间的时候我们也可以使用记录时间戳的方法做到跨平台性。
好多Linux + Apache的服务器都会对CSS、JS和图片这些静态的内容设置缓存,到了IE这里又会在本地做一个缓存。所以当我们更新了CSS文件之后,常常会出现客户端没有更新,导致显示出现问题,所以使用了时间戳。总之一句话概括使用时间戳的目的就是:禁止缓存css、js,使浏览器同步更新到服务器端最新的静态内容。

3.)工作原理

时间戳服务工作流程:
1,用户对文件数据进行Hash摘要处理;
2,用户提出时间戳的请求,Hash值被传递给时间戳服务器;
3,时间戳服务器对哈希值和一个日期/时间记录进行签名,生成时间戳;
4,时间戳数据和文件信息绑定后返还,用户进行下一步电子交易操作

2.kali中exiftool命令

1.)作用:

查看图片exif信息

还可以用来生成图片一只密码病毒

2.)使用

exiftool 图片名

3.png文件

#png文件一些具体内容含义(在010中)

#数据块

①:IHDR
IHDR(文件头数据块)
包含存储图片数据的基本信息,一个png文件只能有一个IHDR
②:IDAT
IDAT(图像数据块)
存放图片真正的数据信息
③:IEND
IEND(图像结束数据)
标记png文件或者数据流的结束,且放到文件的尾部
(根据这个可以判断一个图片里面是否会含有第二个隐藏图片,到时候就需要用到分离图片工具进行下一步操作)
在winhex中

(固定)八个字节89 50 4E 47 0D 0A 1A 0A为png的文件头
(固定)四个字节00 00 00 0D(即为十进制的13)代表数据块的长度为13
(固定)四个字节49 48 44 52(即为ASCII码的IHDR)是文件头数据块的标示(IDCH)
(可变)13位数据块(IHDR)
前四个字节代表该图片的宽
后四个字节代表该图片的高
后五个字节依次为:
Bit depth、ColorType、Compression method、Filter method、Interlace method
(可变)剩余四字节为该png的CRC检验码,由从IDCH到IHDR的十七位字节进行crc计算得到。
文件尾:AE 42 60 82

图片尺寸为787x500(高x宽)
00 00 00 0D 说明IHDR头块长为13
49 48 44 52 IHDR标识
00 00 03 13 图像的宽,787像素
00 00 01 F4 图像的高,500像素
发现高宽错误
这里需要注意的是,文件宽度不能任意修改,需要根据 IHDR 块的 CRC 值爆破得到宽度,否则图片显示错误

二.实例

misc23

首先这题查了wp是用到kali里面的exiftool 首先进行下载 使用‘exiftool  图片’命令查看图片信息

在里面找到一串提示:

ctfshow{}, UnixTimestamp, DECtoHEX, getflag

意思就是flag以ctfshow{}结构 先用时间戳 再转16进制 即可得到本题flag

我们在History When里面找到时间分别进行转化 然后得到的数据转为16进制 发现不对 再次分别转成16进制即可得到本题flag

misc41

查看wp得到提示 搜索F001即得出flag (看右边的更容易看出来)

misc24

题目提示:flag在上面 修改高度 即得出flag

misc25

题目提示:flag在下面 修改高度 即得出flag

 

misc26

题目提示:flag在下面 修改高度 得到提示 需要知道原来图片的高度 根据 IHDR 块的 CRC 值爆破得到,显示出了原高度 即得出了flag

脚本文件如下

import os
import binascii
import struct
crcbp = open("misc26.png", "rb").read()    #打开图片
for i in range(1024):
    for j in range(1024):
        data = crcbp[12:16] + struct.pack('>i', i)+struct.pack('>i', j)+crcbp[24:29]#从IHDR开始17个字节,其中宽和高用i和j代替,并以4个字节存放i和j。
        crc32 = binascii.crc32(data) & 0xffffffff
        if(crc32 == 0xec9ccbc6):   #010Editor第二行倒数3字节,加第三行第一字节。按顺序写就行,不用改。
            print(i, j)
            print('hex:', hex(i), hex(j))
#900 606
#hex: 0x384 0x25e

misc27

同样方法 修改高度 得出flag

参考资料:

https://blog.youkuaiyun.com/qq_41566219/article/details/104019967

https://blog.youkuaiyun.com/BL_zshaom/article/details/124707095

CTF misc图片类总结(入门级) - Hardworking666 - 博客园 (cnblogs.com)

http://t.csdnimg.cn/zttwL

Build started: Project: deepone *** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Program Files\MDK\Core\ARM\ARMCC\Bin' Build target 'Target 1' compiling main.c... D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\Include\stm32f10x.h(8302): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory #include "stm32f10x_conf.h" main.c: 0 warnings, 1 error compiling misc.c... D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\Include\stm32f10x.h(8302): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory #include "stm32f10x_conf.h" D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\StdPeriph_Driver\src\misc.c: 0 warnings, 1 error compiling stm32f10x_gpio.c... D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\Include\stm32f10x.h(8302): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory #include "stm32f10x_conf.h" D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\StdPeriph_Driver\src\stm32f10x_gpio.c: 0 warnings, 1 error compiling GPIO_STM32F10x.c... D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\Include\stm32f10x.h(8302): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory #include "stm32f10x_conf.h" D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\RTE_Driver\GPIO_STM32F10x.c: 0 warnings, 1 error compiling stm32f10x_rcc.c... D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\Include\stm32f10x.h(8302): error: #5: cannot open source input file "stm32f10x_conf.h": No such file or directory #include "stm32f10x_conf.h" D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\StdPeriph_Driver\src\stm32f10x_rcc.c: 0 warnings, 1 error ".\Objects\deepone.axf" - 5 Error(s), 0 Warning(s). Target not created. Build Time Elapsed: 00:00:01
最新发布
03-21
<think>好的,用户遇到了编译错误,需要解决。首先,我要仔细看看错误信息。错误提示是找不到"stm32f10x_conf.h"文件,这个问题在多个文件中出现,导致编译失败。用户使用的是Keil MDK环境,项目名为deepone,目标芯片是STM32F103系列。 首先,我需要回忆下STM32的标准外设库结构。通常,stm32f10x_conf.h是配置文件,用来启用或禁用特定的外设驱动。这个文件应该位于项目的Include目录里,或者是在工程设置中指定的头文件路径中。用户出现的错误可能是因为这个文件缺失或者路径没有正确配置。 接下来,我应该考虑可能的原因。最常见的情况是用户没有将stm32f10x_conf.h文件添加到项目中,或者Keil的工程配置中没有正确包含该文件的路径。另外,有时候用户可能复制了项目模板,但忘记复制这个配置文件,或者文件被误删。 我需要分步骤给出解决方法。第步,确认文件是否存在。用户需要检查工程目录下的Include文件夹,或者标准外设库的位置,看看是否有这个文件。如果没有,需要从库中复制过来。第二步,检查Keil中的包含路径设置,确保路径正确。第步,如果文件存在但路径正确,可能需要重新添加文件到工程中。第四步,确认是否在工程中启用了USE_STDPERIPH_DRIVER宏,这个宏通常在编译器选项里设置,用于告诉编译器使用标准外设库,此时需要包含conf文件。 另外,用户可能在创建项目时没有正确配置,或者使用了不完整的库文件。比如,使用CubeMX生成代码时可能会自动处理这些配置,但如果用户手动配置,可能会遗漏。需要指导用户如何添加这个文件,并设置正确的路径和宏定义。 还要考虑用户是否在项目设置中遗漏了必要的头文件路径,或者路径设置错误。比如,标准外设库的路径可能没有被正确添加到项目的Include Paths中,导致编译器找不到该文件。 最后,可能需要提醒用户关于库版本的问题,不同版本的库可能有不同的配置方式,需要确保使用的库与工程配置兼容。例如,用户安装的STM32F1xx_DFP版本是否与代码兼容,或者是否需要更新库文件。 总结下来,解决步骤应该是:检查文件是否存在,添加路径,设置宏定义,确保工程配置正确。同时,给出具体的操作步骤,比如在Keil中如何添加包含路径,如何复制文件到项目目录,以及如何设置预处理器宏。此外,提醒用户关于项目模板的使用,或者建议重新生成项目结构,确保所有必要文件都被正确包含。</think>针对Keil编译时出现的`stm32f10x_conf.h`文件缺失问题,以下是详细解决方案: --- ### 、问题分析 **错误本质**: 编译器无法找到`stm32f10x_conf.h`头文件,该文件是STM32标准外设库(Standard Peripheral Library)的核心配置文件,负责启用或禁用外设模块的编译支持。 **根本原因**: 1. **文件缺失**:项目目录中缺少`stm32f10x_conf.h`文件。 2. **路径未包含**:Keil工程未正确配置头文件搜索路径。 3. **宏定义缺失**:未定义`USE_STDPERIPH_DRIVER`宏,导致编译器忽略标准库配置。 --- ### 二、解决方案 #### 步骤1:手动添加`stm32f10x_conf.h`文件 1. **从标准库复制**: - 定位STM32标准外设库的安装路径(通常在`STM32F10x_StdPeriph_Lib\Libraries\STM32F10x_StdPeriph_Driver\inc`)。 - 将`stm32f10x_conf.h`复制到项目目录的`Include`文件夹(若没有则新建)。 - *注意*:若使用Keil Pack Installer安装的DFP包,文件路径可能在: `MDK\Pack\Keil\STM32F1xx_DFP\<版本号>\Device\Include`。 2. **通过Keil添加**: - 右击Keil工程中的`Include`文件夹 → `Add Existing Files...` → 选择`stm32f10x_conf.h`。 #### 步骤2:配置头文件搜索路径 1. 点击Keil工具栏的 ![Options](https://i.imgur.com/z5mzV0L.png) 按钮(或`Project → Options for Target`)。 2. 选择`C/C++`选项卡 → 在`Include Paths`中添加以下路径(根据实际路径调整): ``` .\Include D:\Program Files\MDK\Pack\Keil\STM32F1xx_DFP\2.3.0\Device\Include ``` ![Include Paths配置示例](https://i.imgur.com/5C3mQ9d.png) #### 步骤3:定义预处理器宏 在`C/C++`选项卡的`Preprocessor Symbols`输入框中添加: ``` USE_STDPERIPH_DRIVER ``` 此宏定义会强制编译器使用标准外设库的配置文件。 --- ### 、验证修复效果 1. **重新编译**:点击`Build`按钮(或按`F7`),观察错误是否消失。 2. **检查输出**:若仍有路径错误,请确认: - `stm32f10x_conf.h`文件实际存在于配置的路径中。 - 路径中无中文或特殊字符。 --- ### 四、附加建议 1. **项目模板修复**: - 若频繁遇到此类问题,建议通过STM32CubeMX生成完整工程框架,避免手动配置遗漏。 2. **库版本管理**: - 检查DFP包版本是否兼容(当前使用2.3.0版本),必要时通过`Pack Installer`更新。 3. **代码规范**: - 在`stm32f10x_conf.h`中按需启用外设(如取消注释`#include "stm32f10x_gpio.h"`)。 --- ### 五、示例目录结构 ``` deepone/ ├── Inc/ │ ├── stm32f10x_conf.h ← 核心配置文件 │ └── main.h ├── Src/ │ └── main.c └── MDK-ARM/ ← Keil工程文件 ``` 通过上述步骤,可彻底解决`stm32f10x_conf.h`缺失导致的编译中断问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值