高级运维学习(十)系统安全

news2024/11/25 6:40:25

kali

  • 实际上它就是一个预安装了很多安全工具的Debian Linux
[root@myhost ~]# kali reset
kali reset OK.
该虚拟机系统用户名为:kali,密码为:kali
  • 基础配置
$ ip a s    # 查看网络IP地址,本例中查看到的是192.168.88.40
$ sudo systemctl start ssh      # 启ssh服务,弹出的窗口输入密码kali
$ sudo systemctl enable ssh     # 设置ssh服务开机自启
[root@myhost ~]# ssh kali@192.168.88.40
kali@192.168.88.40's password: kali
┌──(kali㉿kali)-[~]
└─$ 

nmap扫描

  • 一般来说扫描是攻击的前奏。
  • 扫描可以识别目标对象是什么系统,开放了哪些服务。
  • 获知具体的服务软件及其版本号,可以使得攻击的成功率大大提升。
  • 扫描可以检测潜在的风险,也可以寻找攻击目标、收集信息、找到漏洞
  • windows下,扫描可以使用xscan / superscan
  • Linux,扫描可以采用nmap
  • 吾爱破解:吾爱破解 - LCG - LSG|安卓破解|病毒分析|www.52pojie.cn
  • 中国黑客团队论坛:黑客攻防业务合作 | 7年经验专业团队
  • 俄罗斯论坛:https://rutracker.org/
┌──(kali㉿kali)-[~]
└─$ nmap
# -sT: TCP扫描。
# -U: 扫描目标的UDP端口。
# -sP:ping扫描
# -A:对目标系统全面分析

# 扫描整个网段,哪机器可以ping通
┌──(kali㉿kali)-[~]
└─$ nmap -sP 192.168.88.0/24

# 扫描192.168.88.100开放了哪些TCP端口
┌──(kali㉿kali)-[~]
└─$ sudo nmap -sT 192.168.88.100

# 扫描192.168.88.100开放了哪些UDP端口。非常耗时!
┌──(kali㉿kali)-[~]
└─$ sudo nmap -sU 192.168.88.100

# 全面扫描192.168.88.100系统信息
┌──(kali㉿kali)-[~]
└─$ sudo nmap -A 192.168.88.100
  • 使用脚本扫描
# 通过脚本扫描目标主机的ftp服务
# 在目标主机上安装vsftpd服务
[root@web1 ~]# yum install -y vsftpd
[root@web1 ~]# vim /etc/vsftpd/vsftpd.conf 
 12 anonymous_enable=YES
[root@web1 ~]# systemctl enable vsftpd --now

# 在kali主机上查看有哪些脚本
┌──(kali㉿kali)-[~]
└─$ ls /usr/share/nmap/scripts/

# 扫描ftp服务是否支持匿名访问。ftp控制连接端口号是21
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-anon.nse 192.168.88.100 -p 21
21/tcp open  ftp
| ftp-anon: Anonymous FTP login allowed   # 允许匿名访问

# 扫描ftp相关信息,如版本号、带宽限制等
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-syst.nse 192.168.88.100 -p 21

# 扫描ftp后门漏洞
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ftp-vsftpd-backdoor 192.168.88.100 -p 21
  • 扫描口令
# 通过ssh协议,使用nmap自带的密码本扫描远程主机的用户名和密码
# 在目标主机上创建名为admin的用户,密码为123456
[root@web1 ~]# useradd admin
[root@web1 ~]# echo 123456 | passwd --stdin admin

# 在kali上扫描弱密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse 192.168.88.100 -p 22

# 通过ssh协议,使用nmap以及自己的密码本扫描远程主机的密码
# 1. 创建用户名文件
┌──(kali㉿kali)-[~]
└─$ sudo echo root > /tmp/users.txt
                                                        
┌──(kali㉿kali)-[~]
└─$ cat /tmp/users.txt 
root

# 2. 生成1990-01-01到2020-12-31之间的所月日期
┌──(kali㉿kali)-[~]
└─$ vim mydate.py
from datetime import datetime, timedelta

d1 = datetime(1989, 12, 31)
d2 = datetime(2021, 1, 1)
dt = timedelta(days=1)

with open('/tmp/mima.txt', 'w') as f:
    while d1 < d2:
        d1 += dt
        f.write("%s\n" % d1.strftime('%Y%m%d'))

┌──(kali㉿kali)-[~]
└─$ python3 mydate.py

# 3. 修改web1的密码
[root@web1 ~]# echo 19910101 | passwd --stdin root

# 4. 使用自己的密码本破解密码
┌──(kali㉿kali)-[~]
└─$ sudo nmap --script=ssh-brute.nse --script-args userdb=/tmp/users.txt,passdb=/tmp/mima.txt 192.168.88.100 -p 22

# 5. 目标主机将会记录所有的登陆事件
[root@web1 ~]# vim /var/log/secure
# 查看最近的登陆失败事件
[root@web1 ~]# lastb
# 查看最近的登陆成功事件
[root@web1 ~]# last
  • 扫描windows口令
[root@myhost ~]# cat /tmp/winuser.txt    # windows用户名
administrator
admin
# 通过samba服务扫描密码
[root@myhost ~]# nmap --script=smb-brute.nse --script-args userdb=/tmp/winuser.txt,passdb=/tmp/mima 172.40.0.151

使用john破解密码

  • 在线破解哈希值的网站:md5在线解密破解,md5解密加密

  • 哈希是算法,英文hash的音译,包括md5、sha等

    • 哈希算法是一种单向加密的算法,也就是将原始数据生成一串“乱码”
    • 只能通过原始数据,生成这串“乱码”,但是不能通过“乱码”回推出原始数据
    • 相同的原始数据,生成的乱码是相同的。
  • kali系统提供了一个名为john的工具,可用于密码破解

[root@web1 ~]# echo 123456 | passwd --stdin root
[root@web1 ~]# useradd tom
[root@web1 ~]# echo abc123 | passwd --stdin tom
[root@web1 ~]# useradd jerry
[root@web1 ~]# echo 123123 | passwd --stdin jerry
[root@web1 ~]# scp /etc/shadow kali@192.168.88.40:/home/kali/

# 字典暴力破解,密码本是/usr/share/john/password.lst
┌──(kali㉿kali)-[~]
└─$ sudo john shadow  

# 直接显示破解的密码,不显示其他额外信息
┌──(kali㉿kali)-[~]
└─$ sudo john --show shadow                
root:123456:18912:0:99999:7:::
tom:abc123:18912:0:99999:7:::
jerry:123123:18912:0:99999:7:::


# 字典暴力破解,指定密码本文件
┌──(kali㉿kali)-[~]
└─$ sudo john --wordlist=/tmp/mima.txt shadow

抓包

封装与解封装

以太网数据帧结构

 

  • MAC地址:分为目标和源MAC地址,6字节
  • Type:类型,说明数据帧中包含的数据类型
  • Data:高层数据
  • FCS:帧校验序列

网络层数据包结构

 

  • 版本:协议版本,如IPv4
  • 生存时间:8位,初始一个值n,每经过一个路由器减1,直到为0丢弃,目的为防止分组在网络上无限传播下去
  • 协议号:数据部分应交付的协议号,如TCP是6,UDP是17

TCP头部结构

  • 源端口:数据段的源端口,一般为大于1024的随机值
  • 目标端口:数据段的目标端口
  • 序号:在一个TCP连接中传输的数据段都按顺序编号

UDP头部结构

 

  • 源端口:数据段的源端口,一般为大于1024的随机值
  • 目标端口:数据段的目标端口

实施抓包

  • 传输的各种数据,在网络中都是一个个的数据包
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump
# -i:指定抓取哪块网卡进入的数据包
# -A:转换为ASCII码,使得可读
# -w:抓包写入文件
# -r:从文件中读取抓包信息
# 抓包时可以过滤要抓哪些包
# 使用host过滤主机,使用net过滤网段,使用port过滤端口... ...

# 1. 抓包:抓取eth0上进出的、与192.168.88.100有关的、涉及TCP21端口的数据包。以下命令执行后,打开新终端。
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -A host 192.168.88.100 and tcp port 21

# 2. 在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.88.100
Connected to 192.168.88.100.
220 (vsFTPd 3.0.2)
Name (192.168.88.11:kali): tom   # 用户名
331 Please specify the password.
Password:abc123   # 此处是tom的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit    # 退出
221 Goodbye.

# 3.在tcpdump终端可以看到明文的用户名和密码


# 保存抓包文件
# 1. 将抓到的包存入文件ftp.cap
┌──(kali㉿kali)-[~]
└─$ sudo tcpdump -i eth0 -A -w ftp.cap host 192.168.88.100 and tcp port 21
# 2. 在另一个终端访问ftp
# 在新终端登陆ftp
┌──(kali㉿kali)-[~]
└─$ ftp 192.168.88.100
Connected to 192.168.88.100.
220 (vsFTPd 3.0.2)
Name (192.168.88.11:kali): tom   # 用户名
331 Please specify the password.
Password:abc123   # 此处是tom的密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> exit    # 退出
221 Goodbye.

# 3. 在抓包终端ctrl+c停止
# 4. 读取抓到的包,并过滤
┌──(kali㉿kali)-[~]
└─$ tcpdump -A -r ftp.cap | egrep 'USER|PASS'
  • 图形工具:wireshark
[root@myhost ~]# yum install wireshark ftp

选择抓哪块网卡进出的数据,然后点左上角的开始

抓到包后,点击左上角同样位置停止,查看数据 

 

安全加固

nginx安全

  • 安装启服务
[root@web1 ~]# yum install -y nginx
[root@web1 ~]# systemctl enable nginx --now
  • 命令行访问不存在的路径:
[root@web1 ~]# curl -I http://192.168.88.100/
HTTP/1.1 200 OK
Server: nginx/1.14.1       # 版本号
Date: Mon, 02 Jan 2023 02:54:45 GMT
Content-Type: text/html
Content-Length: 3429
Last-Modified: Thu, 10 Jun 2021 09:09:03 GMT
Connection: keep-alive
ETag: "60c1d6af-d65"
Accept-Ranges: bytes
  • 隐藏版本信息
[root@web1 ~]# vim /etc/nginx/nginx.conf
... ...
 17 http {
 18     server_tokens off;
... ...
[root@web1 ~]# systemctl restart nginx.service 
  • 再次访问不存在的路径,版本号消失
[root@web1 ~]# curl -I http://192.168.88.100/
HTTP/1.1 200 OK
Server: nginx     # 没有版本号了
Date: Mon, 02 Jan 2023 02:56:26 GMT
Content-Type: text/html
Content-Length: 3429
Last-Modified: Thu, 10 Jun 2021 09:09:03 GMT
Connection: keep-alive
ETag: "60c1d6af-d65"
Accept-Ranges: bytes
  • 防止DOS、DDOS攻击
  • DDOS:分布式拒绝服务
# 压力测试,每批次发送100个请求给web服务器,一共发200个
[root@myhost ~]# yum install -y httpd-tools
[root@myhost ~]# ab -c 100 -n 200 http://192.168.88.100/ 
... ...
Benchmarking 192.168.88.100 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests    # 发送200个请求完成
... ... 
Complete requests:      200   # 完成了200个请求
Failed requests:        0     # 0个失败
... ...
  • 配置nginx连接共享内存为10M,每秒钟只接收一个请求,最多有5个请求排队,多余的拒绝
[root@web1 ~]# vim /etc/nginx/nginx.conf
 17 http {
 18     limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;   # 添加
... ...
 40     server {
 41         listen       80 default_server;
 42         listen       [::]:80 default_server;
 43         server_name  _;
 44         root         /usr/share/nginx/html;
 45         limit_req zone=one burst=5;  # 添加
[root@web1 ~]# systemctl restart nginx.service 

# 再次测试
[root@myhost ~]# ab -c 100 -n 200 http://192.168.88.100/ 
... ...
Benchmarking 192.168.88.100 (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests
... ...
Complete requests:      200
Failed requests:        194   # 失败了194个
... ...

防止缓冲区溢出

  • 缓冲区溢出定义:程序企图在预分配的缓冲区之外写数据。
  • 漏洞危害:用于更改程序执行流,控制函数返回值,执行任意代码。
# 配置nginx缓冲区大小,防止缓冲区溢出
[root@web1 ~]# vim /etc/nginx/nginx.conf
... ...
 17 http {
 18     client_body_buffer_size     1k;
 19     client_header_buffer_size   1k;
 20     client_max_body_size        1k;
 21     large_client_header_buffers 2 1k;
... ...
[root@web1 ~]# systemctl restart nginx.service 

Linux加固

  • 设置tom账号,有效期为2022-1-1
# 查看tom的账号信息
[root@web1 ~]# chage -l tom
最近一次密码修改时间                  :10月 12, 2021
密码过期时间                  :从不
密码失效时间                  :从不
帐户过期时间                      :从不
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :99999
在密码过期之前警告的天数    :7

[root@web1 ~]# chage -E 2022-1-1 tom
[root@web1 ~]# chage -l tom
最近一次密码修改时间                  :10月 12, 2021
密码过期时间                  :从不
密码失效时间                  :从不
帐户过期时间                      :1月 01, 2022
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :99999
在密码过期之前警告的天数    :7

# 设置账号永不过期,注意-E后面是数字-1,不是字母l
[root@web1 ~]# chage -E -1 tom
[root@web1 ~]# chage -l tom
最近一次密码修改时间                  :10月 12, 2021
密码过期时间                  :从不
密码失效时间                  :从不
帐户过期时间                      :从不
两次改变密码之间相距的最小天数     :0
两次改变密码之间相距的最大天数     :99999
在密码过期之前警告的天数    :7

# 设置新建用户的密码策略
[root@web1 ~]# vim /etc/login.defs 
 39 PASS_MAX_DAYS   99999    # 密码永不过期,设置最长有效期
 40 PASS_MIN_DAYS   0        # 密码最短使用时间,0表示随时可改密码
 41 PASS_MIN_LEN    5        # 密码最短长度
 42 PASS_WARN_AGE   7        # 密码过期前7天发警告
 47 UID_MIN                  1000   # 新建用户最小的UID
 48 UID_MAX                 60000   # 新建用户最大的UID
  • 用户安全设置
# 锁定tom账号
[root@web1 ~]# passwd -l tom
锁定用户 tom 的密码 。
passwd: 操作成功

[root@web1 ~]# passwd -S tom   # 查看状态
tom LK 2021-10-12 0 99999 7 -1 (密码已被锁定。)

# 解锁tom账号
[root@web1 ~]# passwd -u tom
解锁用户 tom 的密码。
passwd: 操作成功
[root@web1 ~]# passwd -S tom
tom PS 2021-10-12 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
  • 保护文件
# 查看文件的特殊属性
[root@web1 ~]# lsattr /etc/passwd
---------------- /etc/passwd    # 没有特殊属性

# 修改属性
chattr +i 文件    # 不允许对文件做任何操作,只能看
chattr -i 文件    # 去除i属性
chattr +a 文件    # 文件只允许追加
chattr -a 文件    # 去除a属性

[root@web1 ~]# chattr +i /etc/passwd
[root@web1 ~]# lsattr /etc/passwd
----i----------- /etc/passwd
[root@web1 ~]# useradd zhangsan
useradd:无法打开 /etc/passwd
[root@web1 ~]# rm -f /etc/passwd
rm: 无法删除"/etc/passwd": 不允许的操作
[root@web1 ~]# chattr -i /etc/passwd
[root@web1 ~]# rm -f /etc/passwd   # 可以删除
[root@web1 ~]# ls /etc/passwd
ls: 无法访问/etc/passwd: 没有那个文件或目录

# 恢复passwd文件
[root@web1 ~]# cp /etc/passwd- /etc/passwd

# 追加
[root@web1 ~]# chattr +a /etc/hosts
[root@web1 ~]# echo 'hello world' >> /etc/hosts
[root@web1 ~]# rm -f /etc/hosts
rm: 无法删除"/etc/hosts": 不允许的操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1036733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java面试题-并发编程基础

1.线程的基础知识 1.1 线程和进程的区别&#xff1f; 难易程度&#xff1a;☆☆ 出现频率&#xff1a;☆☆☆ 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在指令运行过程中还需要…

驱动开发,基于gpio子系统编写LED灯的驱动,亮灭控制

1.gpio子系统介绍 一个芯片厂商生产出芯片后会给linux提供一个当前芯片中gpio外设的驱动&#xff0c;我们当前只需要调用对应的厂商驱动即可完成硬件的控制。而linux内核源码中的gpio厂商驱动有很多&#xff0c;这里linux内核对厂商驱动做了一些封装&#xff0c;提供了一系列的…

中秋国庆内卷之我爱学习C++

文章目录 前言Ⅰ. 内联函数0x00 内联函数和宏的比较0x01 内联函数的概念0x02 内联函数的特性 Ⅱ. auto&#xff08;C 11)0x00 auto的概念0x01 auto的用途 Ⅲ. 范围for循环(C11)0x00 基本用法0x01 范围for循环(C11)的使用条件 Ⅳ. 指针空值nullptr(C11)0x00 概念 前言 亲爱的夏…

leetcode Top100(17)矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

C++ -- 类型转换

目录 C语言中的类型转换 为什么C需要四种类型转换 C 类型转换 static_cast reinterpret_cast const_cast 添加关键字 volatile dynamic_cast 补充 RTTI 总结 C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型…

如何搜索浏览器添加印象笔记中搜藏的结果

在印象笔记记录的东西多了&#xff0c;就放在哪里不动&#xff0c;失去记录的意义了 1、如何将浏览器中添加印象笔记一块的搜索结果 2、需要两个步骤 第一&#xff1a;将浏览器中添加印象笔记的插件 第二&#xff1a;将印象笔记中的搜索方法勾上&#xff0c;如下 结果如下&…

【从0学习Solidity】41. WETH

【从0学习Solidity】41. WETH 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开发…

反射详细说明

反射概述 反射是指对于任何一个Class类&#xff0c;在"运行的时候"都可以直接得到这个类全部成分。 在运行时,可以直接得到这个类的构造器对象&#xff1a;Constructor。 在运行时,可以直接得到这个类的成员变量对象&#xff1a;Field。 在运行时,可以直接得到这…

【从0学习Solidity】 40. ERC1155

【从0学习Solidity】40. ERC1155 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开…

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)

7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素&#xff1a; 缺少的成分&#xff1a;数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中&#xff0c;ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…

Spring后处理器-BeanPostProcessor

Spring后处理器-BeanPostProcessor Bean被实例化后&#xff0c;到最终缓存到名为singletonObjects单例池之前&#xff0c;中间会经过bean的初始化过程&#xff08;&#xff08;该后处理器的执行时机&#xff09;&#xff09;&#xff0c;例如&#xff1a;属性的填充、初始化方…

第 364 场 LeetCode 周赛题解

A 最大二进制奇数 降序排序字符串&#xff0c;然后将最后一个 1 与最后一位交换 class Solution { public:string maximumOddBinaryNumber(string s) {sort(s.begin(), s.end(), greater<>());for (int i s.size() - 1;; i--)if (s[i] 1) {swap(s[i], s.back());break;…

【Oracle】Oracle系列之八--SQL查询

文章目录 往期回顾前言1. 基本查询&#xff08;1&#xff09;All&#xff08;2&#xff09;in/exists 子查询&#xff08;3&#xff09;union/except/intersect&#xff08;4&#xff09;group by&#xff08;5&#xff09;having&#xff08;6&#xff09;聚集函数&#xff1a…

SLAM从入门到精通(用c++实现机器人运动控制)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前的一篇文章&#xff0c;我们知道了可以通过wpr_simulation包仿真出机器人和现场环境。如果需要控制机器人&#xff0c;这个时候就需要rqt_robo…

AcWing 5153. 删除(AcWing杯 - 周赛)(结论+枚举)

思路&#xff1a; ACcode: #include<bits/stdc.h> using namespace std; #define int long long string s; void solve() {cin>>s;s"00"s;int lens.size();for(int i0; i<len; i) {for(int ji1; j<len; j) {for(int kj1; k<len; k) {int xs[i]*…

leetcode:2446. 判断两个事件是否存在冲突(python3解法)

难度&#xff1a;简单 给你两个字符串数组 event1 和 event2 &#xff0c;表示发生在同一天的两个闭区间时间段事件&#xff0c;其中&#xff1a; event1 [startTime1, endTime1] 且event2 [startTime2, endTime2] 事件的时间为有效的 24 小时制且按 HH:MM 格式给出。 当两个…

Windows 基于Visual Studio 开发Qt 6 连接MySQL 8

前提条件&#xff1a; 1、Visual Studio 2022 社区版(免费版) 2、Qt-6.5.1版本 3、MySQL 8 Qt 6 配置MySQL 8 动态/静态连接库和MySQL 8 驱动。 libmysql.dll 和libmysql.lib是QT所需的动态和静态链接库&#xff1b;qsqlmysql.dll 和qsqlmysql.dll.debug是Qt所需的mysql驱…

机器人过程自动化(RPA)入门 1. 什么是机器人过程自动化?

如今&#xff0c;我们生活中几乎没有任何方面不受自动化的影响。一些例子包括洗衣机、微波炉、汽车和飞机的自动驾驶模式&#xff0c;雀巢在日本的商店里使用机器人销售咖啡豆&#xff0c;沃尔玛在美国测试无人机送货&#xff0c;我们的银行支票使用光学字符识别&#xff08;OC…

【Linux】调试代码的工具 - gdb

1、安装gdb sudo yum -y install gdb【安装gdb】 2、gdb的使用 在 Linux 下&#xff0c;我们编写代码默认以 release 方式发布如果想让代码以 debug 方式发布&#xff0c;必须给 gcc 添加 -g 选项 (gdb) q / quit【退出gdb】(gdb) l / list&#xff08;list可缩写为 l&#xf…

C++的文件操作

文件操作 程序运行时产生的数据都属于临时数据&#xff0c;通过文件可将数据持久化 C中对文件操作需要包含头文件<fstream> 文件类型分为两种&#xff1a; 文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的二进制形式存储在计算机中&…