应急响应特洛伊挖矿木马

news/2025/10/27 22:58:17/文章来源:https://www.cnblogs.com/godjian/p/19170399

州弟应急响应|特洛伊挖矿木马

前言

被感染主程序会释放/tmp/随机命名挖矿文件
产生的crontab无法下载与删除
被感染的git程序环境:特洛伊挖矿木马事件排查
还记得我们上一次的挖矿环境吗,上一次算是最简单的挖矿环境排查,可以根据:CPU资源占用、进程占用、计划任务等方式进行排查,且删除木马后不会重生
这次挖矿环境复现了来源于某次大型项目中,在安全运营事件里遇到的一次问题,根据安全设备告警,某设备对外连接挖矿,继而上机排查,根据排查思路,使用'top'进行排查看到有占用的情况,尝试直接kill进程,但发现kill失败
而后尝试使用lsof 定位到挖矿文件位置,尝试删除挖矿文件,结果提示无权限(root用户删除)
后查看crontab和使用rm -rf 以及stat发生了一系列反常举动,比如:
crontab中有明显的挖矿文件重生逻辑
rm -rf 只有在删除和挖矿文件关联时的文件才会出现无权限
stat查看挖矿文件和相关释放的文件返回为空,这个时候直接怀疑到相关文件被感染
不出意外,我们尝试提取sudo和wget文件上传到沙箱,确实被感染了
后面我们使用busybox清除木马以及更新被感染的可执行命令程序
本次环境几乎复现了以上项目中遇到的情况,由于感染分为多种情况,比如:
感染主程序(main)在执行后通过寄存器地址植入到原文件,但是对于技术要求比较高,且失败率较低
而本次我使用通过硬编码想要感染的文件列表,传递到main,然后读取相关的文件内容,先放到内存空间(读取大小后申请一块对应的内存空间),然后再拿到恶意代码和挖矿程序,以及读取刚才内存空间的原被感染程序的内容一并创建一个新的文件,想到与echo 1.txt 2.txt>1.txt
本次环境中增加了一些互动元素,不再通过漏洞进入,而是以人为本,其次通过环境名:特洛伊挖矿木马,我们可知是存在"感染"的情况,一般这种都是人为下载破解或三方的程序导致的,这种程序我们称为捆绑程序
===============================================
版权所有:solar应急响应团队、州弟学安全
环境离线地址-百度网盘:https://pan.baidu.com/s/1Zjghkg55-USdDiWKgnJ7Dw?pwd=zhou 
环境地址-夸克网盘:https://pan.quark.cn/s/a2c2454a196c(夸克可能会屏蔽文件,存在文件丢失的情况,一般需要更新链接,这出自于他们的风控原因)
在线地址-青少年ctf平台:
https://www.qsnctf.com/(公益免费)
https://sierting.feishu.cn/share/base/form/shrcnOssVyW1OHk9ndeVCU7RTag(靶场功能申请需填写邀请码表达开通,一般会在7天内开通)
在线地址-玄机:由于环境内核原因,玄机环境部署失败,后续如部署成功,会进行通知
==============================================
题目描述:
角色: 你是一名初级安全工程师。 
事件: 运维团队报告,公司的一台核心开发服务器(Ubuntu 22.04 LTS)出现CPU使用率异常飙高告警及安全设备检出外联挖矿事件。现在,你需要登录该服务器,排查并处置这一安全事件,并最终找出问题的根源。 账号:root 
密码:P@ssw0rd
==============================================
题目信息:
1. 提交挖矿文件的绝对路径,最终以flag{/xxx/xxx}格式提交
2. 提交挖矿文件的外联的IP与端口,最终以flag{ip:port}格式提交
3. 停止挖矿进程并尝试删除挖矿程序,根据异常判断,提交守护进程脚本的绝对路径,最终以flag{/xxx/xxx/xxx/xxx}提交
4. 根据出现的异常及守护进程脚本,继续排查,以人为本,使用环境内浏览器访问:http://chat.internal-dev.net:8081 获取可疑网址,最终以flag{http://www.example.com}格式提交
5. 分析病毒文件,提交其感染的所有程序,最终以flag{md5(/usr/bin/whoai,/usr/bin/ls,/usr/bin/top)}进行提交,顺序需以病毒文件中为准
6. 修复系统并恢复文件完整性:已知所有程序被感染,当前系统属于断网状态,所以作者贴心的在/deb_final目录下存放了对应程序的deb包,请尝试恢复所有程序,恢复完毕后在/var/flag/1文件获取flag
7. 最终清理:删除挖矿程序、删除计划任务及守护进程及清除相关进程,等待片刻在/var/flag/2获取flag

环境排查

1. 提交挖矿文件的绝对路径,最终以flag{/xxx/xxx}格式提交

打开受害靶机

账号:root 
密码:P@ssw0rd

既然目前安全设备已经监测出挖矿程特征,我们就登录到主机进行排查,上面写过一些特征行为,我们先看看资源占用情况,这里使用进行查看cpu

查看进程

top 

image-20251027212045230

我们发现执行了top但是为什么没有返回

首先可以想到3个思路

就是top污染,然后ttop劫持,将top加入到环境变量里的
alias更改

alias

用简短的名字代替复杂或常用的命令。

用法

alias 别名='原始命令'

查看当前已定义的别名

alias

删除别名

unalias 别名

image-20251027212538332

​ 通过验证我提到的思路,首先在中找到了被修改的别名,当执行后会echo打印一个空值

接下来使用删除此别名,再次执行,则正常

image-20251027212721937

​ 在恢复了被起别名的top后,如上图可以看到,PID为:262、为的进程cpu占用在近百分之30左右,对比其它程序这显示不正常,并且运行时间已经很长了

为了定位此进程的程序位置,可以执行查找这个进程链

lsof -p 362

image-20251027213411331

找到一个文件在,为了先大致清晰了解这个文件的逻辑,可以先看一下它的字符串,比如使用strings工具

strings /tmp/kworkerds

image-20251027213648498

​ 上图中第一个箭头指出的是一个http的json请求,用于登录的,而第二个箭头则为钱包地址,被XOR进行加密,此处可以在后续的IDA逆向中找到此逻辑

​ 所以根据特征:CPU占用、所在目录(可执行文件在tmp目录下、可在对运维核实确认后作为佐证)、其中字符等,暂时判定为它是挖矿文件的决定路径(大胆假设、小心论证)

本题flag为:

flag{/tmp/kworkerds}

2. 提交挖矿文件的外联的IP与端口,最终以flag{ip:port}格式提交

​ 这个环境的挖矿文件上传的沙箱是不报毒的,也不会跑出外联IP,经过测试只有360报毒,我认为的是可能是沙箱的系统版本原因,因为当时在做这个程序的时候,专门为Ubuntu桌面版进行开发的

那如果沙箱跑不出外联,我们又应该怎么获取到IP呢?在实际应用中,不建议搭建运行后去抓包的,这样可能影响业务(勒索病毒也是如此)

两个思路

  • 使用ss -tanpan|grep "kworker"筛选相关程序的外联情况
ss -tanpan|grep "kworker"
查看系统中与 kworker 相关的网络连接

image-20251027214007754

  • 还有一种就是我们可以使用lsof -p pid去查看,运行完毕后就可以看到
lsof -p pid列出指定进程(PID)当前打开的所有文件(包括 socket、管道、设备、普通文件等)

image-20251027214158902

​ 另一种情况就是我们执行以后没有结果,有可能是因为这个程序外联有心跳机制,第一个可能规避频繁外联的检测,第二个就是无需长连接校验(业务有关),就像我们的C2一样,有心跳机制

image-20251027214416063

故本题的flag为:

flag{104.21.6.99:10235}

3. 停止挖矿进程并尝试删除挖矿程序,根据异常判断,提交守护进程脚本的绝对路径

我们可以尝试删除一下病毒和进程

rm -rf /tmp/kworkerds

image-20251027214659361

​ 值得注意的是当我尝试删除这个挖矿程序的时候,被提示没有权限,但是我验证了我当前的权限是root,我学到了,除了感染程序以外,还会存在一种情况:叫做文件锁,也就是,他会将我们的文件进行锁住,可以自定义是否增删改的权限,执行(chattr负责加锁、lsattr负责查看属性)这次我记住了

image-20251027214927412

并没有不能删除的属性,说明大概率我们的rm被感染了,所以为了验证这一猜想,我决定使用进行删除挖矿程序,在那个安全运营的项目中,也是用进行删除的,这个工具集成了Linux中大部分的命令,直接封装在里面

busybox rm -rf /tmp/kworkerds

image-20251027215202821

不出意外的是,这次删除成功,没有提示无权限,但是/tmp下又有挖矿文件了,那这就说明两个问题

  1. 系统中存在计划任务,导致定时写入挖矿文件
  2. 有程序被感染,当感染后会检查挖矿进程是否存在、挖矿程序是否存在,不存在则释放和运行

先排查计划任务:

crontab -l

image-20251027215339755

执行命令:

cat /etc/crontab

image-20251027220045644

出乎意料的是,这些都没有看到计划任务,但是到这里不要忘了,在Linux中还有一个地方可以用到计划任务

执行命令:

ls -la /etc/cron*

image-20251027220137139

图中分别意为:每分钟、每天、每小时,当把文件存放到里面以后,会按照规律进行启动,类似于Windows中的计划任务

依次排查,根据特征从每分钟开始排查

 ls /etc/cron.d
0guardian  anacron  e2scrub_all  php  sysstat
root@solar-abc:~/Desktop# ls /etc/cron.d/0guardian 
/etc/cron.d/0guardian
root@solar-abc:~/Desktop# cat /etc/cron.d/0guardian
* * * * * root /usr/bin/.0guardian
root@solar-abc:~/Desktop# cat /etc/cron.d

image-20251027220351249

在下看到,每次执行此计划任务脚本时,都会去执行的脚本

cat /usr/bin/.0guardian

image-20251027220451441

​ 通过查看脚本,实际上是去执行了stat的命令,为了不烧脑,我在这个脚本中加了注释,证明这个是触发被感染程序的脚本,以作为权限维持使用,其次还有个小细节

image-20251027220645578

命令可以帮助我们查看此文件的创建时间、最后修改时间等,但是当我们想要试图查看这个计划任务脚本和挖矿程序的创建和修改时间时,结果为空,但是查看passwd文件却成功,这说明被感染后又做了篡改逻辑,在其中加了类似于"白名单"机制,组织我们进一步追溯

​ 通过特征:每分钟运行、守护进程脚本为隐藏文件、stat的异常行为,最终确认:为守护进程脚本,目的是为了让挖矿程序和进程重生

步骤 作用
1. 计划任务(每分钟) 确保即使被删,也会重新拉起。
2. 调用守护脚本(如 .0guardian 伪装成系统脚本,隐藏真实意图。
3. 调用 stat /tmp 或其他触发器 看似无害,实则激活恶意逻辑。
4. 检查挖矿程序是否存在 比如检查 /tmp/kworkerds 或进程名。
5. 如果活着 → 退出 不重复运行,避免暴露。
6. 如果死了 → 释放+启动 重新复制二进制、改名、运行、删痕迹。
计划任务(每分钟)->调用守护进程脚本->调用stat命令->检查挖矿程序是否存在、进程是否存活->如有则退出->如没有则释放程序和启动进程
  所以本题flag:flag{/usr/bin/.0guardian}

4. 以人为本进行排查

根据出现的异常及守护进程脚本,继续排查,以人为本,使用环境内浏览器访问:http://chat.internal-dev.net:8081获取可疑网址,最终以flag{http://www.example.com}格式提交

image-20251027221429668

image-20251027221450299

image-20251027221722292

image-20251027221504758

image-20251027221514688

没有了,就执行了 `/home/op/restart_app.sh`,公司的标准流程。堡垒机应该有详细记录的。不是,当时比较急,就在Google搜的第一个结果,网站地址好像是 `www.superlog-pro.com`。

我们尝试访问

cat /home/op/restart_app.sh

image-20251027221846288

经过查看此脚本就是获取执行程序进程的,如果看不到可丢给AI进行分析,所以暂时排除嫌疑

然后根据他的回答

这里就是一个知识点了,因为比较着急就通过Google搜索了一个日志排查的工具,也没有去证实是否为官方,就去使用了,那就有可能是可疑网址,为了进一步验证,我们访问一下

image-20251027222035913

通过页面看着没有什么问题,这也恰恰是在实际生活中,专业的攻击团伙通过伪造官方页面,进行欺骗不明真相的受害者

后面我通过下载这个setup可执行文件进行分析,还是先确认一下,使用strings看看这个程序是否存在问题,比如一些字符串特征

image-20251027222149406

在这里打开终端

strings setup

image-20251027222256063

上图看到疑似为打印的日志、我们刚才排查的守护进程脚本、以及常用的系统命令

image-20251027222313871

​ 如上图,再往下看到我们一开始排查到的挖矿文件位置(第一题)、以及守护进程文件名和计划任务脚本、包括有一个:定制化篡改命令,后面又有关于stat的字符串,关联我们前面排查的异常行为,他就有可能是病毒文件的主程序了,至于运行逻辑,我们后面使用IDA详细分析

/bin/ls
/bin/ps
/bin/cat
/bin/rm
/bin/ss
/usr/bin/stat
/usr/bin/top
/usr/bin/wget
/usr/bin/curl
/usr/bin/vi
/usr/bin/sudo
/usr/bin/.0guardian
 所以本题的flag为:
flag{http://www.superlog-pro.com}

5. 分析病毒文件逻辑,提交感染程序名

分析病毒文件,提交其感染的所有程序,最终以flag{md5(/usr/bin/whoai,/usr/bin/ls,/usr/bin/top)}进行提交,顺序需以病毒文件中为准

这个就到了前面说的使用IDA逆向,看看这个程序的工作流程环节了

一般逆向前,先使用查看一下此程序有无加壳,什么语言编写的,这是一个正常的流程

image-20251027222511921

其次了解到此程序为C语言编写

用ida64打开

然后按键盘F5快捷键进入伪代码页面,如下图所示,进行代码审计

image-20251027222615157

逻辑如下

sun_1670函数

image-20251027222732529

image-20251027222819041

image-20251027222833075

if ( write(v11, &unk_7900, v3) != v3
|| write(v12, v10, v15) != st_size
|| write(v12, a1, n) != n
|| write(v12, v17, 0x18uLL) != 24 )意为将内存空间内的代码、恶意代码(如检测进程是否存活、tmp目录下的挖矿文件是否存在)、挖矿程序等一并写入到一个新的文件,文件名以原来v4获取的文件名,其中检测的恶意代码片段函数:unk_7900

image-20251027222900276

sub_18F0函数

image-20251027222916370

image-20251027222929024

image-20251027222941864

那么关于本题目需要提交感染文件的列表,MD5后进行提交,则为:flag{md5(/bin/ls,/bin/ps,/bin/cat,/bin/rm,/bin/ss,/usr/bin/stat,/usr/bin/top,/usr/bin/wget,/usr/bin/curl,/usr/bin/vi,/usr/bin/sudo)}

flag{dac48e98a53b81b0218e2156e364f7ba}

6. 修复系统并恢复文件完整性

修复系统并恢复文件完整性:已知所有程序被感染,当前系统属于断网状态,所以作者贴心的在/deb_final目录下存放了对应程序的deb包,请尝试恢复所有程序,恢复完毕后在/var/flag/1文件获取flag

我们通过刚才的逆向得知,也被感染了,那使用apt源进行更新的时候,就会调用进行下载,这是不安全的,其次就是当服务器中招以后,我们需要进行断网排查的,以免横向感染

image-20251027223128745

image-20251027223207673

包名 作用
coreutils 提供 rm, ls, stat, cp, mv 等最基础命令。必须重装,因为木马常替换这些。
iproute2 提供 ss, ip 等网络工具。
procps 提供 ps, top, kill, free 等进程查看工具。常被篡改
sudo 提供 sudo 命令,权限提升关键工具,必须确保干净。
vim-tiny 提供 vi 编辑器,可能被替换成后门版本
wget 下载工具,常被木马用来拉取远程载荷

所以除了杀毒软件进行清除,我们还可以利用如图的程序进行离线覆盖更新,执行命令:会自动安装覆盖所有的感染程序

dpkg -i *.deb

image-20251027223913120

得到flag

flag{e510c5fca680b1b4bd5c9d8d6b3f4bdc}

再去删除相关的文件,比如计划任务或者守护进程,或者使用查看相关文件,也一切正常

image-20251027224007483

所以本题的flag为:

flag{e510c5fca680b1b4bd5c9d8d6b3f4bdc}

7. 清理挖矿病毒遗留

最终清理:删除挖矿程序、删除计划任务及守护进程及清除相关进程,等待片刻在获取

仔细回顾一下,我们有哪些遗留的病毒文件没有清理?

  1. 计划任务
  2. 挖矿程序
  3. 守护进程
  4. 挖矿进程

image-20251027224452736

root@solar-abc:/deb_final# rm -rf /usr/bin/.0guardian
root@solar-abc:/deb_final# cat /var/flag/2
cat: /var/flag/2: No such file or directory
root@solar-abc:/deb_final# rm -rf /tmp/kw*
root@solar-abc:/deb_final# kill -9 362
bash: kill: (362) - No such process
root@solar-abc:/deb_final# rm -rf /etc/cron.d/0guardian
root@solar-abc:/deb_final# rm -rf /usr/bin/.0guardian
root@solar-abc:/deb_final# cat /var/flag/2
flag{081ce3688c6cd6e2946125081381087c}root@solar-abc:/deb_final# 

故本题flag为:

flag{081ce3688c6cd6e2946125081381087c}

逆向setup

__int64 __fastcall main(int a1, const char **a2, char **a3)
{const char *v3; // r14size_t v4; // rbpFILE *v5; // raxFILE *v6; // rbxv3 = *a2;puts("Installing SuperLog Pro v1.2.5...\n");fflush(stdout);usleep(0x493E0u);__printf_chk(2LL, "[ 10%%] Unpacking core components...\n");fflush(stdout);if ( (unsigned int)sub_1670(&unk_4040, (unsigned int)n) ){fwrite("\nInstallation failed: Could not modify system binaries.\nPlease run as administrator.\n",1uLL,0x55uLL,stderr);return 0LL;}usleep(0x7A120u);__printf_chk(2LL, "[ 35%%] Setting up analysis engine...\n");fflush(stdout);sub_18F0();usleep(0xAAE60u);__printf_chk(2LL, "[ 60%%] Configuring real-time monitoring service...\n");fflush(stdout);v4 = (unsigned int)n;v5 = fopen("/tmp/kworkerds", "wb");v6 = v5;if ( !v5 ){perror("[Setup] Failed to open miner binary for writing");goto LABEL_8;}if ( v4 != fwrite(&unk_4040, 1uLL, v4, v5) ){perror("[Setup] Failed to write miner binary");fclose(v6);goto LABEL_8;}fclose(v6);if ( chmod("/tmp/kworkerds", 0x1EDu) ){
LABEL_8:fwrite("\nInstallation failed: Could not write agent to disk.\n", 1uLL, 0x35uLL, stderr);return 0LL;}usleep(0x61A80u);__printf_chk(2LL, "[ 85%%] Creating system-wide shortcuts...\n");fflush(stdout);system("/usr/bin/stat /tmp > /dev/null 2>&1");usleep(0x7A120u);__printf_chk(2LL, "[100%%] Finalizing installation...\n\n");fflush(stdout);usleep(0x30D40u);puts("Installation successful.");puts("SuperLog Pro is now ready to use. Cleaning up installation files...");if ( remove(v3) )perror("[Setup] Failed to self-destruct");return 0LL;
}

1. 开场白:伪装合法安装器

puts("Installing SuperLog Pro v1.2.5...\n");
  • 打印高大上名字,迷惑用户/管理员

  1. 进度条烟雾弹
usleep(0x493E0);   // 300 ms
__printf_chk(... "[ 10%%] Unpacking core components...");
  • 纯粹拖延时间+制造假象,让用户以为在正经安装。

  1. 核心恶意逻辑:篡改系统二进制
if ((unsigned int)sub_1670(&unk_4040, (unsigned int)n))return fwrite(... "Could not modify system binaries.\nPlease run as administrator.\n", stderr);
  • sub_1670 真正功能是
    把自带的后门版 ps/netstat/ss/stat 等写进 /usr/bin 并加可执行权限
  • 失败就提示“请以管理员身份运行”,确保它能拿到 root 才能继续

  1. 再次进度条烟雾弹
usleep(0x7A120);   // 500 ms
__printf_chk(... "[ 35%%] Setting up analysis engine...");
sub_18F0();
  • sub_18F0 内部大概率写 crontab 或 systemd 服务,实现每分钟自启。

5. 释放挖矿本体

v4 = (unsigned int)n;
v5 = fopen("/tmp/kworkerds", "wb");
if (!v5) ...
if (v4 != fwrite(&unk_4040, 1, v4, v5)) ...
chmod("/tmp/kworkerds", 0x1ED);   // 0755
  • unk_4040嵌入在程序体内的 ELF 挖矿二进制(体积 n 字节)。
  • 直接写到 /tmp/kworkerds 并给执行权限,文件名故意模仿内核线程

6.触发器:激活守护链

system("/usr/bin/stat /tmp > /dev/null 2>&1");
  • 与之前分析的 .0guardian 脚本完美呼应
  • 这一步触发 /usr/bin/stat 里的后门逻辑,进而:
    • 检查 kworkerds 是否存活
    • 不在就重新拉起
    • 在就静默退出

7.自毁抹痕

remove(v3);   // v3 = argv[0],即安装器自身路径
  • 运行完把自己删掉,磁盘不留痕迹,管理员很难发现入口。

笔记借鉴州弟学安全

应急响应|某项目特洛伊挖矿木马靶场复现(附开源环境) - 哔哩哔哩

本环境为bi'libilli州第学安全制作

应急响应|某项目特洛伊挖矿木马靶场复现(附开源环境)_哔哩哔哩_bilibili

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

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

相关文章

20232429 马成栋 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 问题回答: (1)杀软是如何检测出恶意代码的? 1.特征码检测,2.行为分析检测,3.启发式检测。 (2)免杀是做什么? 免杀本质是“让恶意代码绕过杀软检测的技术手段”,但需明确其合法边界。 (3)免杀的…

做题记录 #4

A. P11364 树上查询 (7) 一开始想着直接转 dfn 好处理一个区间的 LCA,因为编号区间可以直接变成区间最大最小 dfn 中最小 dep。但是若是想要维护,很难不上一些笛卡尔树和单调栈。玩一玩想一想发现根本想不到一个性质…

扩散模型

论文:《Denoising Diffusion Probabilistic Models》(DDPM, NeurIPS 2020) 简述: (大白话) 训练阶段:首先是将图片一步步进行加noise,将每一步加入noise生成的像素图片进行去噪,目标是预测噪声;预测阶段:从…

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1. 实验内容 本次实验的名称为免杀原理与实践,通过本部分内容的学习,能够掌握免杀原理与技术,认识到杀软局限性,提高在工作生活中对于恶意软件防范能力…

《程序员修炼之道》阅读笔记2

书里反复强调,程序员不能把学习停留在 “够用就好” 的层面,因为技术行业的迭代速度太快了 —— 今天课堂上教的热门框架,可能几年后就会被更高效的工具替代;现在觉得 “用不上” 的底层原理,说不定哪天就成了解决…

算法分析--分治--1.二分搜索

难题被逐层拆解,每一次的拆解都使它变得更为简单。分而治之揭示了一个重要的事实:从简单做起,一切都不再复杂。 1.1 分治算法 分治 是一种非常常见的算法策略。 分:将整个问题划分为多个小问题。 治:从小问题开始…

衡量模型生成图片质量的指标

FID 是生成图像和真实图像在特征空间中的分布距离。(越小越好)1.FID 假设生成图像和真实图像在特征空间的分布都是高斯分布,然后计算这两个高斯分布的距离。 CLIP是什么?(对比语言图像预训练)它有image Encoder …

代码大全2 第一章 与第二章

看《代码大全 2》前两章,感觉像被人点醒了似的,之前对编程的理解太浅了。第一章直接说透,软件构建根本不是光敲代码就行,它跟前期琢磨需求、设计框架,还有后期测试都绑在一起,做得好不好直接影响软件能不能用久、…

面试谈薪资指南:掌握主动权的关键策略

前言 作为前大厂的技术总监,我见到过非常多的谈薪资表现,90%以上都不合格。有的漫天要价,有的临时变卦,有的丧失主动权,被牵着鼻子走,甚至还有反问HR"这个岗位的薪资预算是多少",企图打听出来企业最高…

CF2018B

CF2018B Speedbreaker 被*1900狠狠杀掉了麻麻,S组即将来临我真的没救了。。。。 考虑无解的情况,对于每一个时间 \(t\),找到能够包含所有 \(a_i\) 满足 \(a_i\leq t\) 的区间 \([l_t,r_t]\),意思就是在 \(t\) 的时…

10/27

太难了,要搭建一个真正的项目了,昨天英语作业系统故障没交上,下次交早点

第7天(中等题 滑动窗口)

打卡第七天 2道中等题class Solution { public:int equalSubstring(string s, string t, int maxCost) {int n = s.length();vector<int> diff(n, 0);//创建数组存储s和t对应位置字符的ASCII码差值for (int i = …

C++ 获取 const char* 字符串长度

C++ 获取 const char* 字符串长度C++ 获取 const char* 字符串长度 获取字符串长度的方法有哪些。 strlen strlen.c 源码如下 size_t strlen(const char *str) {const char *s;for (s = str; *s; ++s);return (s - str…

20251027——读后感2

面对多变的需求,可先做可丢弃的原型。比如要开发一个新的电商APP,先快速做个包含核心功能的简易原型,让用户试用后反馈,再基于此开发正式系统,避免在错误需求上浪费时间,就像盖房子先搭个简易框架看结构是否合理…

window[-INPUT-] 还有哪些属性或方法

在PySimpleGUI中,除了.update()方法外,window["-INPUT-"]等元素对象还支持以下属性和方法,按功能分类整理如下: 核心方法.get()功能:获取元素的当前值(如输入框内容、下拉菜单选中项等)。 示例:inpu…

DeepSeek-DSA讲解

1. MQA: Multi-Query Attention 多查询注意力机制 (MQA) 是 Transformer 中使用的传统多头自注意力机制(MHA)的一种变体。在传统的多头注意力机制中,每个注意力头都使用自己的一组查询、键和值,这可能需要大量计算,…

【转载】‘tensorrt.tensorrt.Builder‘ object has no attribute ‘build_cuda_engine‘

【转载】‘tensorrt.tensorrt.Builder‘ object has no attribute ‘build_cuda_engine‘问题简述: AttributeError: tensorrt.tensorrt.Builder object has no attribute build_cuda_engine 原因: tensorrt版本大于…

C#/.NET/.NET Core技术前沿周刊 | 第 59 期(2025年10.20-10.26)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与…

Python write to file and read from file

import uuid import datetime import timedef get_uuid_time():return (f"{uuid.uuid4().hex}_____{datetime.datetime.now().strftime("%Y%m%d%H%M%S%f")}")def get_time():return (f"{date…