VMware虚拟机ssh无法连接的问题

1.SSH连接时出现Connection refused,如下:

报错如下:

1
ssh: connect to host 123.123.123.111 port 22: Connection refused

通常是由于22端口未打开、ssh服务未启动或防火墙禁止22端口等原因引起的

解决方法:

<1>查看SSH服务是否打开

1
systemctl status sshd

如果未启动

1
systemctl start sshd

<2>查看端口是否打开

1
netstat -lnput | grep :22

<3>测试网络的联通性

1
ping www.baidu.com 

如果ping不通,就检查dns

如果dns无问题,就说明是网络原因,看服务器的网线是否连接或是否有问题

<4>如果能连接外网,就查看服务器的防火墙规则,并开放ssh服务的22号端口(如防火墙未放行ssh的端口)

1
iptables -L

[1]直接打开端口:

1
iptables -I INPUT -p tcp  --dport 22 -j ACCEPT

[2]永久打开端口

打开防火墙配置文件 :

1
vim /etc/sysconfig/iptables

在iptables文件内容中追加

1
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

保存配置文件后,重启防火墙:

1
2
service iptables restart (centos6)
systemctl restart iptables (centos7 )

<5>安装Openssh服务

确保系统中已安装OpenSSH服务器。不同的Linux发行版有不同的安装命令:

Debian/Ubuntu

1
2
sudo apt update
sudo apt install openssh-server

CentOS/RHEL

1
2
3
sudo yum install openssh-server
# 或者
sudo dnf install openssh-server

<6>确认服务名称

某些系统使用ssh而非sshd作为服务名。可以通过以下命令查看服务名称:

1
systemctl list-unit-files | grep -E "ssh|sshd"

然后尝试启动相应的服务:

1
2
sudo systemctl start ssh # 对于使用ssh作为服务名的系统
sudo systemctl start sshd # 对于使用sshd作为服务名的系统

查看ssh/sshd开启状态:

1
systemctl status ssh/sshd

docker容器

docker容器

一、docker容器是什么

软件的打包技术,就是将算乱的多个文件打包为一个整体,打包技术在没有docker容器之前,一直是有这种需求的,比如上节课我把我安 装的虚拟机给你们打包了,前面的这种打包方式是将整个虚拟机打包了,对吧,这样打包出来的体积太大了,而且如果你只是单纯的想要 一个安装好的程序,比如sqlserver数据库,不想自己安装,就想要个安装好的,按照之前的打包方式,太费事费力的,你打包个安装了 sqlserver数据库的虚拟机,光虚拟机本身的操作系统可能就占用了20个G,sqlserver本身可能也就1个G,这是不是就太不合适了,当然 我们自己不会或者不想安装sqlserver的时候,可以选择找个哥们帮你安装一下,但是如果100个人都找你安装,你是不是累死了,所以在 这种情况,容器技术就诞生了,容器技术中的依依者,就是docker,它的底层实现原理我们现在不用纠结。用它来打包出来的软件,体积 会非常小。比如如果在一个虚拟机上安装了nginx,那么这个虚拟机怎么也要1G以上,但是用docker打包的已经安装好的nginx,可能也 就100M左右,体积小很多。接下来我们感受一下docker的使用。后面我们可以将很多部署起来很繁琐的靶场环境都通过docker来打包。 所以现在网上也有很多使用docker跑起来的靶场,复用性非常好,别人打包好的,你直接拿来就用。而且docker有个东西叫做仓库,打 包的东西直接放在仓库里面,全世界都可以共享。docker是2013年诞生的。

docker打包出来的每个软件,称之为docker镜像。可以说整个IT领域,不管是哪个工种,都需要好好学习docker。

docker是CS架构的程序,客户端控制服务端来做各种事情。

image-20260319145717347

二、docker的安装

centos用yum安装,kali用apt安装,kali属于debian系列的操作系统

CentOS7安装docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# centos7上面用yum安装
yum install docker -y
#启动docker
systemctl start docker
#设置开机自启
systemctl enable docker

#体验docker版nginx最新版
docker run -d -p 80:80 nginx
#体验docker版nginx 1.16
docker run -d -p 81:80 nginx:1.16

#体验wordpress
docker run --name mysql -e MYSQL_ROOT_PASSWORD=1234565 -d mysql:5.7
docker run -d --link mysql:mysql -p 86:80 wordpress:5.6

Kali安装docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#添加docker的gpg密钥,签名用的(连接docker仓库所需要的密钥)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
wget https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg
apt-key add gpg

#添加docker的apt源
vi /etc/apt/sources.list
以下内容替换文件里的所有内容
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb [trusted=yes] http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

#更新apt缓存
apt update

#安装docker
sudo apt-get instal1 docker docker-compose -y

sudo apt-get install docker.io

#安装完成之后,docker就自动启动了
systemctl status docker

#查看docker版本
docker -v

网络安全有一项工作叫做漏洞复现,有些软件、框架、webserver等等他们某些版本会有各种漏洞,官方看到之后肯定会修复升级,但是
某个使用了这些软件的公司可能并没有升级,那么就需要我们检测一下是否真的存在这个漏洞,不能直接再生产环境上去测试,需要在测
试环境或者开发环境或者自己搭建的环境中进行漏洞测试,这就是漏洞复现的工作。所以我们好多时候都需要自己来搭建相同版本的软件
环境来进行漏洞复现,搭建的环境的时候我们就可以使用docker,很方便。

1
2
3
4
5
6
#用docker下载安装最新版本的nginx
#前面的80端口是主机的80端口,后面的80端口是docker容器的80端口。
docker run -d -p 80:80 nginx

#后面可跟版本号,若不跟则默认是最新版本
docker run -d -p 80:80 nginx:1.16

这里需要使用国内的镜像加速器

1
2
#编辑配置文件
sudo nano /etc/docker/daemon.jason

复制以下内容到文件里

1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.net"
]
}

保存重启docker服务

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

验证是否生效,执行 docker info,在输出中查看 Registry Mirrors 列表是否包含了你刚才配置的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#体验wordpress,需要启动两个docker镜像,一个数据的,一个代码程序,这个比较大,所以速度可能会慢一些
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 # 5.7版本的MySQL,镜像名称是mysql
docker run -d --link mysql:mysql -p 86:80 wordpress:5.6
#5.6版本的wordpress,最新版本应该已经到了6.x了,但是值得说明的一点就是封装wordpress的人为了将镜像做的比较小,没有安装中文包,所以只能是看英文的了,他会自动连接数据库。如果你发现你安装的镜像不是你要的版本,那么可能是版本指定错误了,或者是官方镜像仓库中的wordpress镜像版本有点问题了。

#可以更改docker镜像库的源
cd /etc/docker
vim docker.json
#添加如下内容,并保存退出
{
"registry-mirrors":["https://registry.docker-cn.com"]
}
#可以重启docker服务
systemctl restart docker
systemctl start docker
systemctl enable docker
systemctl stop docker

docker run首先检测本地是否已经有了软件镜像,如果没有,它会自动去下载镜像,然后运行,运行起来的镜像,我们称之为容器,可以理解为每个软件都安装在了一个自己的小空间里面。

docker 镜像 容器

镜像——>安装了某些特定程序的文件——>压缩文件

容器——>镜像运行起来之后,就叫做容器(而不叫进程)

三、镜像常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker search
#搜索镜像(只会搜索官方仓库的,官方仓库地址:hub.docker.com)
# docker search tomcat
# docker search apache
# 拉取的镜像tomcat\apache等名宇很短,这都是官方仓库中的官方镜像,官方仓库中支持用户上传自已封装的镜像,用户镜像和官方镜像的差别在名字上面,比如我们可以去docker官方去注册一个账号,用户白己的镜像前面都会有作者的用户名或者用户所在组织的名字,比如jaden/nginx、jaden/tomcat等。

docker images
#查看本地镜像列表,image就是镜像的意思
#本地有的镜像,就不用再去下载了,而且可以将本地镜像导出来分享给其他人

docker pull
#下载镜像,拉取镜像
# docker pull tomcat:latest
# docker images

docker push
#上床镜像,推送镜像,推到官方仓库(需要本地登录一下官方仓库才能推送)

docker rmi
#删除镜像,rm image的意思,直接rm不加i表示要删除容器,可以通过名称加版本来删除,或者直接通过镜像id值来删除

服务器

1.请分析Exsi虚拟化平台是什么时候安装的?image-20251109090206912

1
20251020-062808

2.请分析Exsi虚拟化平台虚拟机使用的ISO镜像大小是多少?

image-20251109091412496

1
4.38

3.请分析nas服务器samba应用完整版本标识为?

image-20251109101339808

1
4.10.16-25.el7_9

4.分析nas服务器samba应用共享目录允许访问的用户名为?[标准格式:gys666]

image-20251109102338026

1
shadowai

5.嫌疑人在nas服务器中删除了面板日志,请分析其删除日志后第一次访问服务器的目录物理路径是?[标准格

式:/var/soft/wegame]

image-20251109104413066

image-20251109104729969

1
/var/run/pcscd

6.某用户在“2025-10-21 18:40:53(北京时间)”向本地AI模型提问,请问其一共提问了几次

1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  使用方法

1. 直接用浏览器打开 G:\演示网站\index.html 即可访问
2. 点击任意图片下的"下载图片"按钮进行下载
3. 如需添加更多图片,可以将图片放入 images/ 文件夹,并在 index.html 中添加相应的代码

网站已经可以使用了,直接在浏览器中打开 index.html 文件即可!

> 我如果要自行添加图片下载该怎么添加

● 要添加更多图片下载,您有两种方法:

方法1:使用本地图片文件

1. 将图片放入images文件夹
- 把您的图片文件(如 photo1.jpg, photo2.jpg 等)复制到 G:\演示网站\images\ 文件夹中
2. 在 index.html 中添加图片项

2. 打开 G:\演示网站\index.html,在 <div class="gallery-grid"> 中添加新的图片项:

<div class="gallery-item">
<img src="images/photo1.jpg" alt="美女图片" class="gallery-image">
<div class="image-overlay">
<h3>美女图片 9</h3>
<button class="download-btn" data-image="images/photo1.jpg" data-filename="beauty_9.jpg">下载图片</button>
</div>
</div>

方法2:使用绝对路径(其他盘符的图片)

如果图片在其他位置(如 D盘、E盘),使用 file:/// 路径:

<div class="gallery-item">
<img src="file:///D:/我的图片/photo1.jpg" alt="美女图片" class="gallery-image">
<div class="image-overlay">
<h3>美女图片 10</h3>
<button class="download-btn" data-image="file:///D:/我的图片/photo1.jpg"
data-filename="beauty_10.jpg">下载图片</button>
</div>
</div>

关键参数说明

- src="..." - 图片显示路径
- data-image="..." - 下载时的图片路径(必须与src一致)
- data-filename="..." - 下载后保存的文件名
- alt="..." 和 <h3> - 图片的标题/描述

示例:添加3张新图片

在 index.html 的 gallery-grid 区域内添加:

<!-- 新图片1 -->
<div class="gallery-item">
<img src="images/beauty1.jpg" alt="美女图片 9" class="gallery-image">
<div class="image-overlay">
<h3>美女图片 9</h3>
<button class="download-btn" data-image="images/beauty1.jpg"
data-filename="beauty_9.jpg">下载图片</button>
</div>
</div>

<!-- 新图片2 -->
<div class="gallery-item">
<img src="images/beauty2.jpg" alt="美女图片 10" class="gallery-image">
<div class="image-overlay">
<h3>美女图片 10</h3>
<button class="download-btn" data-image="images/beauty2.jpg"
data-filename="beauty_10.jpg">下载图片</button>
</div>
</div>

<!-- 新图片3 -->
<div class="gallery-item">
<img src="images/beauty3.jpg" alt="美女图片 11" class="gallery-image">
<div class="image-overlay">
<h3>美女图片 11</h3>
<button class="download-btn" data-image="images/beauty3.jpg"
data-filename="beauty_11.jpg">下载图片</button>
</div>
</div>

添加完成后,刷新浏览器即可看到新图片!

后端php

后端PHP

基础语法

cheklogin.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<meta charset="uTF-8">
<title>论坛</title>
</head>
<body>
<?php
$uname = $_GET['username'];
$pwd = $_GET['password'];
if$uname =='jaden'){
echo"<h1>欢迎$uname 回来</h1>";
echo"<h2>您的密码为:$pwd</h2>"

}else{
echo"<h1>sorry,用户名或者密码不正确!</h1>"
};
?>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1.基本格式
<?php

?>

2.<br>换行,echo后面可用单引号(' ')也可用双引号(" ")
<?php
echo'你好<br>';
echo"hello";
?>

3,常量与变量的换行
<?php
$a = 100;
echo $a;
echo $a.<br>; #若要在变量或者常量后面换行,需要在变量名或常量名后加上" . "

const A = '123';
echo A;
echo A.'<br>';
?>

php的变量

变量:可变的量

常量:不变的值

1
2
3
4
5
6
7
8
9
10
11
12
13
#PHP中的变量用一个美元符号($)后面跟变量名来表示。变量名是区分大小写的。
#定义一个变量,前面不加$符号,那么就是普通字符
$num = 88888888
$a = 5;
$b = 6;
echo $a + $b;
$hello world

#定义常量:
#常量的名一般都是大写字母
方式1:define('常量名''常量值');例如:define('website''php中文网');
方式2const 常量名 = 常量值;例如:const FOO='BAR'
方式2 const不能用在if判断中。

变量的命名规则

1.一个有效的变量名由字母或者下划线_开头,后面跟上任意数量的字母,数字,或者下划线。

2.变量名不能以数字开头

3.变量名不要出现中文

4.变量名不要出现的非下划线的其他特殊符号

5.变量名称最好用小写字母

单引号与双引号的区别

1
2
3
4
5
6
7
8
9
10
<?php
header("Content_Type: text/html; charset=utf-8"); //在响应头中添加了content-type:utf-8,header()是php提供的加工头相应键值对的
header("nikta");

$name = 'kobe';
echo $name.'<br>';
echo '最喜欢的NBA球星是'.$name.'<br>'; //变量不加符号,遇到字符串拼接,需要加.链接
echo '最喜欢的NBA球星是 $name <br>'; //单引号,不解析变量,原样输出
echo "最喜欢的NBA球星是 $name <br>"; //双引号,解析变量
?>

image-20251018150107875

image-20251018150122909

php的数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
■布尔类型 0 1 | false true # 判断条件的结果都是布尔值 if
■整型 整数 -99999 +99999
■浮点型 小数-1.9 3.25 3.00005
■字符串 'hello' "hello"
■数组 array,例如:$d = array('a'1'c'array123));#数组是容器类型的数据,可以存放各种类型的基础数据
$d=array'a'1,'c'array(1,2,3));
echo $d//会报错,因为echo是用来输出字符串类型数据的。
echo $d[0]; # 数组类型是可以通过索引取值的,索引是从0开始的。
■对象 object # 这个需要学到类之后才能看到
■资源类型 Resource # 文件等资源数据
NULL# $a = null;提前定义,但是不想赋值的时候就可以这样用

查看变量对应值的类型:
1.使用"gettype(传入一个变量var)"来显示变量var的类型;只显示数据的类型,不会显示原数据
2.使用"var_dump(传入一个变量var)"来显示变量var的类型;int(10);会显示原数据

php的运算符

算数运算符,存在优先级 (乘除>.点>加减)

运算符 名称 描述 实例 结果
x + y x 和 y 的和 2 + 2 4
x - y x 和 y 的差 5 - 2 3
x * y x 和 y 的积 5 * 2 10
x / y x 和 y 的商 15 / 5 3
x % y 模(除法的余数) x 除以 y 的余数 5 % 2 1
- x 取负数 x 取负数 -2
a . b 并置 连接两个字符串 “Hi” . “Ha” HiHa

自增自减

运算符 名称 描述
++ X 预递增 X 加 1,然后返回 X
X ++ 后递增 返回 X,然后 X 加1
– X 预递减 X 减一然后返回 X
X – 后递减 返回 X,然后 X 减一

比较运算符

运算符 名称 描述 实例
x == y 等于 如果 x 等于 y,则返回 true,不比较数据类型 5==8返回false
x === y 绝对等于 如果 x 等于 y,且他们的类型相同,则返回 true,比较数据类型 5===”5”返回false
x != y 不等于 如果 x 不等于 y,则返回 true 5!=8返回true
x <> y 不等于 如果 x 不等于 y,则返回 true 5<>8返回true
x !== y 绝对不等于 如果 x 不等于 y,或它们类型不相同,则返回 true 5!==”5”返回true
x > y 大于 如果 x 大于 y,则返回 true 5>8返回false
x < y 小于 如果 x 小于 y,则返回 true 5<8返回true
x >= y 大于等于 如果 x 大于或者等于 y,则返回 true 5>=8返回false
x <= y 小于等于 如果 x 小于或者等于 y,则返回 true 5<=8返回true

赋值运算符

运算符 等同于 描述
x = y x = y 左操作数被设置为右侧表达式的值
x += y x = x + y 加等于
x -= y x = x - y 减等于
x *= y x = x * y 乘等于
x /= y x = x / y 除等于
x %= y x = x % y 模(除法的余数)等于
a .= b a = a . b 连接两个字符串

逻辑运算符

运算符 名称 描述 实例
x and y 如果 x 和 y 都为true,则返回true x=6 y=3 (x<10 and y> 1)返回 true
x or y 如果 x 和 y 至少有一个为 true,则返回 true x=6 y=3 (x==6 or y==5) 返回 true
x xor y 异或(pass) 如果 x 和 y 有且仅有一个为 true,则返回 true x=6 y=3 (x==6 xor y==3) 返回 false
x && y 如果×和y都为 true,则返回 true x=6 y=3 (x< 10 && y > 1)返回 true
x || y 如果×和y至少有一个为 true,则返回 true x=6 y=3 (x==5 II y==5) 返回 false
! x 非,取反 如果×不为 true,则返回 true x=6 y=3 !(x==y) 返回 true

三元运算

判断条件?真的处理:假的处理

如果判断为true,那么执行真处理,也就是:冒号前面的代码会执行,否则:冒号后面的执行,和if….else差不多,不过会更加简洁一些

php的控制结构

if_else

1
2
3
4
5
6
7
8
9
10
11
12
<?php
header("content-type:text/html;charset=utf-8");

$a=rand(1,10);
if ($a > 5){
echo "随机点数比较大"
}else{
echo 'haha'.'<br>';
}
echo "<br>";
echo "当前的点数是".$a;
?>

while循环

条件不执行,一次都不执行(无限循环),通过控制条件来结束循环

1
2
3
4
5
6
7
8
9
<?php

$i = 1;
while ($i <= 10){
$i++;
echo '哈哈'.$i.'次'
}

?>

do-while

条件不成立,也会执行一次

1
2
3
4
5
6
7
<?php
$i = 0;
do{
echo $i;

} while ($i > 0);
?>

for循环

有限循环

1
2
3
4
#$i=1初始值,$i<=10 条件,$i++每次加1
for ($i = 1;$i <= 10; $i++){
echo $i;
}

break打断

打断循环;结束循环(跳出整个for循环)

1
2
3
4
5
6
7
8
$cars=arry("特等奖"=>"布加迪""一等奖"=>"捷豹","二等奖"=>"法拉利","三等奖"=>"玛莎拉蒂","四等奖"=>"迈凯伦");
foreach($cars as $ key => $value) {
if ( $key == '三等奖' ){
break;
} else {
echo $key."是".$value."<br>";
}
}

continue继续

跳出本轮,开始下一轮

1
2
3
4
5
6
7
8
$cars=arry("特等奖"=>"布加迪""一等奖"=>"捷豹","二等奖"=>"法拉利","三等奖"=>"玛莎拉蒂","四等奖"=>"迈凯伦");
foreach($cars as $ key => $value) {
if ( $key == '三等奖' ){
continue;
} else {
echo $key."是".$value."<br>";
}
}

continue、break在其他循环中也能使用

exit退出程序

运行到exit时,直接结束整个程序

switch

条件判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$a=5;
$b=10;
$c=4;

switch ($c) {
case 1:
echo"$a + $b = ".($a+$b)."<br>";
break;
case 2:
echo"$a - $b =".($a-$b)."<br>";
break;
case 3:
echo"$a * $b = ".($a*$b)."<br>";
break;
case 4:
echo"$a / $b =".($a/$b)."<br>";
break;
}

php的函数

函数的介绍
函数的英文叫作:function,而function的解释项中有另外一个含义:功能,函数就是功能,比如我们发微信,可能发微信这个后台代码逻辑就是一个函数,将整体的发微信的逻辑代码封装到了函数中,调用并执行这个函数,就能够实现发微信的动作。

基本格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
header("content-type:text/html;charset=utf-8");

echo '做一下加法计算!'.'<br>';
//提前定义参数a,b
function add($a,$b){
//$a = 2;
//$b = 3;
$c = $a + $b;
echo '加法的计算结果'.$c.'<br>';
}
//函数调用
add(3,4);

echo '计算结束'.'<br>';
?>

内置函数

文件包含的函数(引入文件)

函数 包含失败 特点
include 返回一条警告 文件继续向下执行。通常用于动态包含
require 一个致命的错 代码就不会继续向下执行。通常包含极为重要的文件,整个代码无法执行
include_once(pass) 返回一条警告 除了原有include的功能以外,它还会做once检测,如果文件曾经已经被包含过,不再包含
require_once(pass) 一个致命的错 除了原有的功能以外,会做一次once检测,防止文件反复被包含

include和require区别:include如果引入文件出错,会显示报错信息继续执行下去,require则不会继续执行

数学常用函数

函数名 描述 实例 输入 输出
abs() 求绝对值 $abs = abc(-4.2); //4.2 数字 绝对值数字
ceil() 进一法取整 echo ceil(9.001); //10 浮点数 进一取证
floor() 舍去法取整 echo floor(9.999); //9 浮点数 直接舍去小数部分
fmod() 浮点数取余 “$x = 5.7;$y = 1.3;$r = fmod($x,$y); //$r equals 0.5,
because 4 * 1.3 + 0.5 = 5.7”
两个浮点数,x>y 浮点余数
pow() 返回数的n次方 echo pow (-1,20); //1 基础数n次方 乘方值
round() 浮点数四舍五入 echo round(1.95583,2); //1.96 一个数值 保留小数点后多少位,默认为0舍入后的结果
sqrt() 求平方根 echo sqrt(9); //3 被开方的数 平方根
max() 求最大值 “echo max(1, 3, 5, 6, 7); //7 echo max(array(2, 4, 5));
//5”
多个数字或数组 返回其中的最大值
min() 求最小值 min 多个数字或数组 返回其中的最小值

2024美亚杯团体

Alice的手机

在个人赛的最后一部分, 你对 David 的数字设备进行了取证检查, 发现他与一名成员 Alice 有可疑的沟通. 你现在分析 Alice 的手机.

参考Alice Mobile.bin.

1.Alice 所使用的手机网络运营商公司的名称是什么?

image-20251012124025992

2.Alice 所使用的谷歌电子邮件地址是?

image-20251012124426337

3.谁向 Alice 发送了一个含有个人资料的 .xlsx 文件?

APK格式

lib

assets

dex

androidManifest.xml

抓包

HttpCanary

脱壳

frida-dexdump

1
2
3
4
pip install frida-dexdump

frida-dexdump -U -f 包名
frida-dexdump -UF -d -o .

https://blog.csdn.net/weixin_43767456/article/details/134444987

frida

需要python3.6以上的环境,下载几个python库

1
2
3
pip install frida-tools
pip install loguru click
pip install hexdump

配置好本地Frida之后,查看frida版本,查看手机cpu类型

1
2
3
4
frida --version

adb shell
getprop ro.product.cpu.abi
配置frida-server

去下载对应版本的对应类型的frida-server

27042

https://github.com/frida/frida/releases

下载对应版本下载到手机的 /data/local/tmp/ 目录下

1
2
3
4
5
6
7
8
进入手机端命令:adb shell
切换获取手机的root权限:Su
查找文件是否在手机中:cd/data/local/tmp/
查看路径下的文件并看文件的权限:Is-l
拥有root权限更改文件的权限为777: chmod 777 frida-server-16.5.2-android-x86
在手机中启动运行该文件:./frida-server-14.0.5-android-x86 &
电脑运行检查手机端服务是否开启成功:frida-ps -U
windows运行端口转发到PC:adb forward tcp:27043 tcp:27043

fridaAPI:https://frida.re/docs/javascript-api/

1
2
3
4
5
6
-U
-F
-l
-o
-f
-p

frida脚本

objection

1
pip install objection

启动

1
objection -g 包名 explore
1
2
3
4
5
6
7
-N: 表示网络连接,不加表示USB连接
-h: 主机名,默认是 127.0.0.1
-p: 端口,默认是 27042
-g: 指定进程名\包名

explore:启动objection交互界面,explore也有选项,下面再说
patchapk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
列出所有已加载的类(常用)
android hooking list classes

在所有已加载的类中搜索包含特定关键字的类(常用)
android hooking search classes <pattern>

列出类的所有方法(常用)
android hooking list class_methods <路径.类名>

hook类的所有方法(不包括构造方法)
android hooking watch class <路径.类名>

hook类的构造方法
android hooking watch class_method <路径.类名.$init>

默认是hook方法的所有重载(常用)
android hooking watch class_method <路径.类名.方法名>

hook方法的参数、返回值和调用栈(常用)
android hooking watch class_method <路径.类名.方法名> --dump-args --dump-return --dump-backtrace

hook单个重载函数,需要指定参数类型,多个参数需要用逗号分隔
android hooking watch class_method <路径.类名.方法名> "<参数类型>"

jadx

https://github.com/skylot/jadx/releases