mpirun结合numactl对每个进程进行精细的核心、内存绑定
1 |
|
对于intel mpi:
1 | mpirun -genv I_MPI_PIN=off bind.sh hostname |
可以使用numactl -s
来打印绑定情况:
1 | mpirun -genv I_MPI_PIN=off bind.sh numactl -s |
mpirun结合numactl对每个进程进行精细的核心、内存绑定
1 |
|
对于intel mpi:
1 | mpirun -genv I_MPI_PIN=off bind.sh hostname |
可以使用numactl -s
来打印绑定情况:
1 | mpirun -genv I_MPI_PIN=off bind.sh numactl -s |
宿主机ipconfig获取宿主机ip地址,然后7890.
1 | proxy_on() { |
resolv.conf
1 | # /etc/wsl.conf |
文件不存在则创建。
1 | rm /etc/resolv.conf |
/etc/resolv.conf
1 | nameserver 8.8.8.8 |
然后重启虚拟机。(wsl --shutdown
)
在不开启proxy的情况下能curl通 www.baidu.com
即成功。
抓包然后把pass=false改为true。
去搜每一年的选手writeup,有些选手会截图排名,里面有参加人数。
论文里有336这个数字。
1 | from transformers import AutoTokenizer |
去3d打印文件在线浏览网站操作一下就行。
在pdf搜flag可以看到一个隐藏的flag here文本。转word然后移开哪里的东西,可以看到一个被覆盖在底层的flag图片。
抓包可以看到100对数字。在结束前改掉js里要发送的那个变量。
百度地图搜索。
搜索看到B站一个up主发的视频,评论区询问得知活动日期是发布日期前几天,枚举。
搜图可以得到。
由于问题4正确性比较确定,所以直接枚举安徽所有2字公园。
没做出来。
可以搜到是怀密号,CRH6A-A
打印中间变量并测试可以发现,似乎每3个字符在MultiByteToWideChar
后变成两个.
对flag里的每两个字符爆破。
最后加的 you_cant_get_the_flag
,使用\0
截断处理。
1 |
|
搜索那些没被过滤的字符,学习它们的用法。
$_
获取在此之前执行的命令或者脚本的最后一个参数。也就是input
。
再用一些字符串截断技巧,得到:
1 | # i: ${_:1-6:1} |
接下来按理说应该构造命令然后去获得其他字母。理论上 ip nt
是可以获得很多输出,但是题目环境没这个命令,比较棘手。
所以去题目环境 $PATH
目录下,用正则表达式搜索,看看有哪些input可以构造出的命令。
发现一个 i386
,敲一下发现直接获得了shell。。还是比较意外的。
所以只需要${_:1-6:1}386
,然后cat /flag
看到那些键值访问就想到了这种比赛天天出的原型链污染。利用这个特性给cmd加上一个自己的命令。
第一题爬虫。
第二题sql注入,获得shown=false的那些条目,就是flag。
16可以被10000整除。所以枚举出所有可能的最低4位数。
这两题是一样的,问gpt会知道一个叫DFN的东西,简单学习后可以编写出对应的状态机。
然后就是从状态机构造正则表达式。一开始尝试自己构造,但总是过长。后来找到了从gpt得知pyformlang
这个工具,可以自动构造。
但是构造出来的表达式无法通过题目测试,用ctrl点进去这个库看注释,发现它用了自己的一套语法,所以手动给纠正过来。
也就是
1 | print(str(regex).replace(".", "")) |
(他好像说是用了 .
来表示拼接?)
1 | import random |
只会做第一问,就是手动构造一下完事了。第二问尝试了对$\frac{1}{1+x^2}$泰勒展开,但是精度不够。
完形填空。
hash那个函数,可以用模数为合数的二次剩余和线性同余方程直接解,网上有相关代码,于是得到crc的返回结果。
观察crc函数发现,当两个输入input1和input2,只有最后一个字节不同,且不同之处为这个字节的最高位bit时,crc(input1) ^ crc(input2) == flip
。
所以可以获得flip,推出原文。
1 | import itertools |
(代码比较乱,需多次修改多次运行)
还是可以用第二题的方法得到很多C那一行。
我们现在获得了flip,可以预测任意输入的哈希,所以让他返回哈希已经没有什么用了。考虑让他返回data。
可以想到让他返回 answer_c.txt
的data。也就是构造一个字符串,让他的crc经过base85刚好是 answer_c
.
也就是需要从crc的输出,构造出一个合法的输入。可以用z3solver解,暴力串行跑一个晚上可以出来。理论上可以并行85倍。
也可以优化:计算出what_digest_add_chr_x_to_get_digest_y。也就是已知一个crc和它的输入的最后一个字符,可以求出去掉这个字符后的crc。
(虽然优化写了但是懒得加进去,暴力跑一个晚上就完事了)
1 | import base64 |
首先模拟键盘输入可以把代码传进去。
一开始想传个二维码库进去,发现要传十分钟还是算了,还是直接这样:
然后二值化一下,识别中心点的黑白即可。自动化截图的流程,半个消失就能截完。
另外,可以分段sha256,看看某一段有没有错误。
还有这道题如果在半夜做,因为人少会比较流畅(
1 | # 模拟键盘自动化输入 |
1 | # 从图片提取数据 |
在windows里,用securecrt
这个客户端可以正常使用ZMODEM。
一眼也是没什么思路,那么看看第二题加了什么限制。
发现限制了device和privileged这俩参数。那么第一题可以privileged以及挂载/dev/vdb。
然后发现实际上可以用-u 1000:1000 -u 1000:0来控制用户组为root。而root用户组是可以访问/dev/vdb的。
高强度搜索docker相关漏洞,从https://psych.green/2024/03/02/Docker%E5%AE%B9%E5%99%A8%E9%80%83%E9%80%B8/ 可以得到一个利用docker.sock来逃逸的漏洞。
具体来说,这个文件是docker客户端和docker守护进程通信的文件。我们通过修改宿主机里的这个文件,就可以操控宿主机里的docker守护进程。例如,让宿主机里新建一个docker,并且以root权限挂载/dev/vdb。
然后docker.sock刚好是root用户组可以访问的。把它挂载进去虚拟机,然后
1 | docker -H unix://var/run/docker.sock 让宿主机执行的docker参数 |
这个感觉就是个操作系统大作业题(
第一题就很简单了,用共享内存交换。
第二题先把B的两个文件合并,然后和A交换,再把A拆成file1和file2.
合并需要能动态调整文件的大小,可以搜到truncate系统调用有这个功能。但它只能释放文件的尾部,不能释放头部。
假设我们要把file1和file2合并,可以这样做:从file2尾部每次读取一些字节,追加到file1头部,然后truncate file2里的这些字节。这样我们得到了文件file,它等于file1+逆序的file2.
然后在A里用相同方法分割之后,file2又回到了正序的。
最后就是要重命名,好像是没有重命名权限,一时想不到什么方法,就用truncate把文件复制两次(第一次之后会变成逆序,所以需要两次),这样就能改变文件名。
最后的最后,写的时候踩到一个大坑:
在自旋锁实现中,
1 | while(1) { |
用 -Og
编译,编译器还是会把整个循环优化掉。调了好几个小时一直以为是哪里有竞争,最后才发现是自旋锁的问题。。
需要
1 | int a; |
只会做第一问。可以用send导出镜像文件,然后在windows里的UFS软件打开,可以直接搜到flag。
第一问是直接拒绝交易,第二问是通过无限循环耗尽gas。代码给gpt写就完事了。
第三问不会。
也是让gpt写代码。
调用getflag1函数。
1 |
|
忘记了。
1 |
|
也是忘记了。。好像是自己写一个getflag3.
1 |
|
只会做第二问。
既然内存不能用,那就直接在寄存器上排序就好了。反正有32个寄存器,够用。
汇编代码写了1000行,没有用循环,总之很暴力。
实际上第一问应该也好做,当时实在太困了没发现shift指令是可以用的。
问O1可以得到一个rust字符串切片的特性:从utf8字符中间切片会导致崩溃。
所以传GET 你好
就行。
可以搜到zutty的相关cve。在本地配置好zutty环境(配了半天)进行测试,发现程序printf显示那个poc后,还需要停止,才能让zutty执行命令。
(有人和我一样先做出的第二题发现还要用到第一题的东西吗
只会前3问。把对应的异或关系整理出来,然后z3solver。
1 | # def convert_switch_array_to_lights_array(switch_array: numpy.array) -> numpy.array: |
有提示
而且有的时候助教想改改代码,又懒得手动重启,所以还开了
--reload
。
所以自己写个服务端,直接去把服务端python文件给覆盖了就行。
只会第一问。就是0xfF和0xff会解析成同一个二进制,又能绕过检测。
第一问模拟键盘输入就行。
第二问用一下零知识证明相关的库,不需要有什么逆向。
第二问应该只是让做第三问的人让人熟悉一下zk这些库吧,可惜第三问没去做。
1 | # -*- coding: utf-8 -*- |
用github下载的英文词表对照,还是死活做不出来。后来用llm生成很多次,整理成词表,发现有个xxxx我一直翻译成race,实际上可以是game,就过了。
大模型是一个一个token输出的:从某段文本生成一个token,然后加入该文本末尾,继续生成。
即使seed不同,一样的输出token肯定也在概率最高的几个里面。
基于这两点,可以进行dfs。
关于让llama从某个前缀开始生成,可以先调试定位到它添加<|im_end|>\n<|im_start|>assistant\n
的地方,然后把添加这个后缀的代码去掉。具体在llama_chat_format.py
的575行左右。
另外这玩意是可以上卡的,不过编译gpu版本需要很长时间。开始写代码之前新建一个venv装gpu版本的llama cpp,代码写完也差不多编译好了。用自己机器上4060,总体还是快很多的。
1 | import random |
hackergame打了23和24两年,实际上今年花在hg的时间是比去年多一些的,但排名反而降了。。
主要还是没做出一百人通过的不等式第二问。还有旅行照片3,零零总总几个小时也没搞出来,在比赛结束前5分钟找到了后来群里说的那个视频,但时间不够了没能找到医院。。有够刺激的。这两道加起来400分了😭。
还有就是码力还是太弱了,基本上天天都在写bug和找gpt生成的bug,调试花费了大量时间。最后有好多题目甚至都没来得及看。。(顺便吐槽一下题目是不是有点多了)
最后,被大一学弟薄纱了…
远程服务器无法连接互联网的情况下使用vscode copilot
https://github.com/orgs/community/discussions/52369#discussioncomment-9920089
Step by step:
cmd+shift+p
to open the command panel
1 | >Preferences: Open Remote Settings (JSON) (SSH: ...) |
Update the file to
1 | { |
Save
cmd+shift+p
to open the command panel
1 | >Developer: Reload window |
tcp的frp会被运营商阻断。测试环境:frps、frpc均为0.59.0版本,frps在国内阿里云(无备案),frpc在:与frps同一台机器、azure新加坡,都可以正常连接,但frpc在校园网windows、校园网linux、移动云电脑linux无法连接,报错:
1 | login to the server failed: i/o deadline reached. With loginFailExit enabled, no additional retries will be attempted |
推测是被运营商阻断。
解决方法是使用quic协议。主要是设置frps的quicBindPort
(可以和bindPort
相同),以及frpc的 transport.protocol = "quic"
。
另外由于quic是基于udp的(?),所以记得开放服务器安全组的udp协议端口。
配置文件:
1 | # frpc.toml |
1 | # frps.toml |
输出到控制台。
解决输出日志设置不生效的问题。
1 | import logging |
1 | spack compilers |
列出可用的编译器列表。
1 | spack compiler find |
添加已有编译器,可以检测系统自带编译器并添加。
1 | export SPACK_USER_CONFIG_PATH=/home/team1/zrh/softwares/spack/etc/spack/defaults |
设置配置文件为只使用自己安装目录的,而不是用户目录 ~/.spack
和系统目录。多人使用同用户的情况下,可以防止干扰。
1 | spack clean -a |
清除缓存
1 | spack module tcl refresh --delete-tree |
生成modulefile
。
1 | /home/team1/zrh/softwares/spack/share/spack/modules/linux-debian12-zen3/ |
生成的modulefile
的位置
1 | export MODULEPATH=/home/team1/zrh/softwares/spack/share/spack/modules/linux-debian12-zen3/:$MODULEPATH |
添加进MODULEPATH。这样module ava
可以识别到该目录。
既然是提权,进去之后 cat /etc/passwd
,发现有一个r00t用户。
sudo -l
,发现W4terCTFPlayer
用户可以无密码以r00t
用户身份运行/usr/sbin/nginx
.
然后发现flag在 /tmp/flag
下,且文件读权限属于 r00t
。
以r00t
身份配置nginx开启一个web服务,输出flag即可。
但没有权限修改/etc/nginx/nginx.conf
,所以在所有用户都可以访问的 /tmp
下创建配置文件,然后 nginx -c
指定之。
但还是会报错,查阅后修改pid
文件路径就行。
1 | pid /tmp/nginx.pid; |
1 | sudo -u r00t /usr/sbin/nginx -c /tmp/nginx.conf |
搜索找到工具
可以猜出的明文有:
总共14个字母。
读代码可知,
枚举key长度,然后对这14个已知明文,枚举对应位置的key,复杂度14 * 26 * 10,发现可以稳定排除到只剩下一种key长度。
多开几次终端,直到随机到的key长度为10,发现剩下800种可能的key。
生成800个可能的明文,然后用2字母单词表,排除所有不合法的明文,最后只剩下30个明文,且flag都是相同的。
1 | import copy |
1 | import socket |
1 | import itertools |
用这玩意解码,得到emoji,然后用emoji aes解码,用🔑作为密码可以解(我们3个人想了3天)。
得到
然后就卡了两天。。发现这个网站有问题,换一个就可以
后面看起来就是base64(异或个数?),ciberchef工具可解。
队友做的,我也不知道怎么想到的。。太抽象。
生成一个接近114514的随机数就行。发现seed和随机次数都是我们可控的,且范围限制了,枚举可以生成接近114514的组合就行。
1 | from flask import Flask, request, jsonify, send_from_directory |
1 | import requests |
1 | assert 114514 * x**2 - 11680542514 * y**2 + 1919810== 2034324 |
这个方程化简后,搜索可知叫什么pell方程,有在线工具可解。
1 | x = 34834945635419823491817566563399234823053176449889821571800075702352062905044231520196782430564993617886316750841220280683153456634693274516582390418863033711415731372881163288179660369032440262647344962570809308551786423557604581792293023628226671539671001863522824415876161727357840363896909435994314597682318687286109212360132261705780761350223208855493439905713509683216585447535669179103840355151676900348955850726834778558748576176596609474037298456423607570516459873639794526160082489103786303332253388597560031538949333472681857144605196440020688999368156212067614295618998719682195870452330682061061500341728481458877113934526003865064359452801 |
hint1和hint2,用那个什么费马小定理还是大定理忘了,反正跟取模和阶乘有关的,可以算出 e % hint1
.
hint5 和 pq == n
联立,得到一个一元二次方程,求根公式可解p、q。
接下来只要知道e就能求出d,进而解flag了。由于我们知道e % hint1
,所以枚举e实际上复杂度可以是18位(<1000*1000 = 1e6
),一秒内可解。
1 | import math |
1 | from pwn import * |
发现次数是可以>10的,那么就可以栈溢出,溢出到后门函数就行了。
1 | from pwn import * |
开了canary那么先泄露出来,用那个打印history的操作可以泄露。但canary第一位固定是\x00,所以得覆盖成别的,才能让字符串不被截断。
然后这题没有后门,只能进libc用system("/bin/sh")
了,所以需要泄露一个libc的地址。想了很多方法都很麻烦,最后想到main的返回地址应该是回到libc的,实验发现确实可以通过main的返回地址推出libc的基地址。
题目给了libc版本,直接可以得到system和 "/bin/sh"
的偏移。然后还需要修改rdi作为system的参数,发现ROPgadget是可以搜到libc里的 pop rdi; ret
的,这样就做完了。
1 | from pwn import * |
参考w4terctf2023的wp,是可以直接自己构造二进制来生成文件的。
一开始以为栈上没数组,就觉得是堆漏洞,后来一查才发现 alloca
是在函数栈帧上分配内存的(怎么会有这么奇怪的函数)。
那么溢出点就只有 loaded_macho
了。它是通过 seg->filesize
来控制偏移量的。这里就有一个显然的漏洞,alloca分配的是文件大小,而seg->filesize
是我们可控制的量,构造 seg->filesize
就可以利用这个栈溢出。
然而,随便修改seg->filesize
也不可行,因为 memcpy(loaded_macho, data + seg->fileoff, seg->filesize)
会超过data导致段错误(data是mmap分配的)。我的做法是构造多个seg,它们的seg->fileoff
是一样的,这样可以让loaded_macho偏移到我们控制的位置,也可以让memcpy
不访问data外的内容,以及方便控制好文件大小filesize。
溢出后很容易覆盖返回地址为后门函数 command
。但是还需要一个字符串,以及一个rdi来传入 cat /flag
的指针。字符串我们可以写入data,且地址可知(因为mmap指定了)。使用ROPGadget没有搜到 pop rdi; ret
。于是想到libc,但发现即使没开PIE,libc的地址也是会变的,而本题是一次性交互,没办法泄露地址再来搞事情。
既然没法控制rdi那么就回到command看看,发现最后call system的rdi是从rax拿的,而rax又是从rbp偏移的栈上拿的,那么可以控制好rbp,使得rbp+command处是我们在data上提前写入的cat flag的地址,然后直接跳转到call system的前两行。
rbp可以通过覆盖栈上的saved_rbp来控制,这样就可以一次性get shell。(感觉十分优雅
1 | import struct |
搜到传入phar时,file_exists有反序列化漏洞。
GIF89a文件头可以绕过图片检测。
1 |
|
URL传入:phar://p.phar/test.txt
这个地方传入 ../../../../../../../../../../../../
之类的东西就可以访问到根目录,但是测试发现只有严格符合它的规则(3个斜杠)才会被捕获。
然后搜到%2f
似乎可以绕过这种。
加个png或者gif文件头就可以绕过图片检测。
但是图片会被重命名,搜到nginx漏洞,在路径后加入 /.php
就会解析成php。
传入两个元素,然后给order_by加上条件,就可以盲注。条件为真增序,假则反序。
1 | import requests |
但是当时没写二分让它慢慢跑导致痛失前3血(flag怎么这么长)
得让cre解密出来是flag。发现可以下载公钥(PUBLIC),直接用下载下来的公钥加密flag和 /tmp/flag
(一开始没看docker file,导致找半天不知道flag在哪。但是做完这个去做priv escape就很快找到 /tmp/flag
搜索transform,反序列化,read object等关键词可以找到 “CC2链”。具体地,priority_queue在readobject的时候,会调用其元素的Comparator的compare函数。
模仿CC2链,构造一个priority_queue,指定Comparator,并在Comparator里套娃另一个comparator,就可以实现一个链式的调用。
1 | import java.io.FileOutputStream; |
IDA搜索flag、W4terCTF、success、congratula等字符串,可以定位到入口点,很容易发现是一个简单的异或逻辑。
1 | hex_data = "7A 05 6E 01 02 69 54 6B 49 09 58 54 53 67 62 4F 77 50 60 4E 60 63 7A 69 18 79 1C 49 68 4B 15 63 4B 4D 53 45 20 49 5D 5B 74 71 46 71 6C 41 2C 49 4D" |
第一层是异或再*17,第二层是base64魔改,第三层是一个加密算法的魔改。
第三层直接逆向,第二层似乎难以逆向,于是直接暴力。
1 | import string |
可以发现逻辑是
主要是func3. 硬刚即可。
1 | def compute_values(int1): |
使用vb decompiler可以反编译。但是开优化的话会有错误(var_B0那里)
然后一直以为leftRotate是左旋转,后面找到一个工具VBDEC.exe去调试pcode,才知道是单纯位移。
1 |
|
第一层是异或。第二层是按照每个字母的顺序生成一个矩阵。第三层是矩阵乘法。
第三层求逆矩阵,第二层IDA搜索找出原数组,第一层异或回去。
1 | import numpy as np |
拖进jadx。
第一层是石头剪刀布,对面的出拳是写死的。第二层去逆向那个数字就行。第三层混淆了但没完全混淆。
1 | right_choice = ['2', '3', '2', '2', '2', '2', '2', '3', '2', '1', '1', '2', '1', '1', '1', '2', '2', '3', '1', '2', '2', '3', '2', '2', '2', '3', '1', '3', '2', '2', '1', '2', '2', '1', '3', '2', '1', '1', '3', '3', '2', '3', '3', '2', '3', '2', '2', '3', '2', '3', '1', '2', '2', '3', '2', '2', '2', '3', '2', '3', '3', '3', '1', '3', '2', '1', '3', '2', '1', '2', '2', '3', '2', '3', '3', '3', '2', '2', '3', '3', '2', '3', '2', '1', '1', '3', '1', '1', '2', '3', '3', '3', '2', '3', '3', '2', '2', '3', '3', '2', '2', '3', '2', '3', '2', '1', '3', '3', '2', '2', '1', '2', '2', '1', '1', '1', '1', '2', '2', '1', '2', '1', '2', '1', '3', '3', '1', '3', '2', '3', '1', '2', '1', '2', '2', '1', '2', '1', '3', '2', '3', '1', '1', '2', '2', '3', '1', '3', '2', '1', '2', '2', '2', '1', '3', '2', '2', '1', '2', '3', '2', '3', '1', '3', '2', '2', '1', '2', '2', '3', '1', '2', '2', '1', '2', '1', '2', '3', '3', '3', '2', '2', '3', '1', '2', '1', '1', '1', '2', '1', '2', '2', '2', '3', '1', '2', '1', '2', '2', '1', '2', '1', '3', '2', '3', '3', '3', '2', '2', '3', '1', '2', '2', '3', '1', '3', '2', '1', '2', '1', '3', '1', '3', '3', '2', '1', '3', '2', '2', '2', '2', '1', '2', '1', '3', '2', '1', '1', '1', '2', '2', '1', '3', '2', '2', '1', '2', '2', '2', '1', '2', '3', '1', '3', '3', '3'] |
1 | def add(a, b): return a + b |
1 | def add(a, b): return a + b |
使用工具反混淆得到
1 | const M = [[99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118], [202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192], [183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21], [4, 199, 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, 235, 39, 178, 117], [9, 131, 44, 26, 27, 110, 90, 160, 82, 59, 214, 179, 41, 227, 47, 132], [83, 209, 0, 237, 32, 252, 177, 91, 106, 203, 190, 57, 74, 76, 88, 207], [208, 239, 170, 251, 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, 159, 168], [81, 163, 64, 143, 146, 157, 56, 245, 188, 182, 218, 33, 16, 255, 243, 210], [205, 12, 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, 100, 93, 25, 115], [96, 129, 79, 220, 34, 42, 144, 136, 70, 238, 184, 20, 222, 94, 11, 219], [224, 50, 58, 10, 73, 6, 36, 92, 194, 211, 172, 98, 145, 149, 228, 121], [231, 200, 55, 109, 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, 174, 8], [186, 120, 37, 46, 28, 166, 180, 198, 232, 221, 116, 31, 75, 189, 139, 138], [112, 62, 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, 134, 193, 29, 158], [225, 248, 152, 17, 105, 217, 142, 148, 155, 30, 135, 233, 206, 85, 40, 223], [140, 161, 137, 13, 191, 230, 66, 104, 65, 153, 45, 15, 176, 84, 187, 22]], |
然后从后往前逆。
那个I有点难解密,就尝试了一下套娃I(I(x)), 发现是对称的。
1 | t = ['4b000aec37eca4a5adb8a52427dcb15d', |
以及每逆出一层就去console里试试对不对。
打开IDA搜索W4terCTF。
刷的是freshtomato,参考了http://beyondlogic.top/index.php/archives/3/以及恩山的几篇博客。
在cfe upload的时候,报错
1 | The file transferred is not a valid firmware image. |
后来发现上传的不是zip,而是解压后的trx文件。
刷不成功,就重启多试几次。即使ping -t通了,也可能还没刷完。
快刷完的时候,指示灯变红,路由器风扇轰鸣,有点吓人。
刷完指示灯是黄色的。
安装完anaconda后,使用conda activate xxx
会报错
1 | argument command: invalid choice: 'activate' |
直接使用activate xxx
,则环境没有成功导入。
同时,打开powershell的时候会有红色报错:
1 | 无法加载文件 C:\Users\ZRHan\Documents\WindowsPowerShell\profile.ps1。未对文件 C:\Users\ZRHan\Documents\WindowsPower |
使用以下ChatGPT解决方案:
1 | Get-ExecutionPolicy |
如果你想允许所有 PowerShell 脚本运行(请确保你了解风险),可以设置执行策略为 “Unrestricted”。输入以下命令:
1 | Set-ExecutionPolicy Unrestricted |