当前位置: 首页 > article >正文

《pascal-to-the-metal》:从高级语言到机器码的逆向之旅

摘要本文将深入剖析名为pascal-to-the-metal的CTF挑战。该挑战的核心任务是分析一段由Pascal语言编写的源代码并对其编译生成的裸机Bare-Metal二进制文件进行逆向工程以最终提取隐藏的flag。文章将从Pascal语言的特性和编译原理入手系统性地记录对目标二进制文件的静态与动态分析全过程。文中将重点阐述如何识别特定编译器生成的代码模式、如何通过对比源码与汇编代码来定位关键逻辑、如何利用QEMU和GDB对裸机程序进行调试并最终通过逆向分析一个自定义的加密算法成功获取flag。本文旨在为读者呈现一个从高级语言设计、编译实现到最终机器码逆向的完整分析思路提供一套行之有效的裸机程序逆向方法论。第一章引言与背景1.1 挑战概述pascal-to-the-metal在网络安全攻防演练CTF的广阔天地中逆向工程Reverse Engineering始终是考验参赛者底层功底与逻辑分析能力的试金石。pascal-to-the-metal挑战正是这一领域中的一个经典范例。挑战开始时我们通常会得到两个核心文件checker.pas一个用Pascal语言编写的源代码文件。checker.bin一个二进制可执行文件据信是由checker.pas编译而来。挑战的目标明确而直接找到并提交隐藏在checker.bin中的flag。标题pascal-to-the-metal本身就蕴含了丰富的线索。“Pascal”指明了程序的源语言这是一种古老但结构化极强的编程语言而“to-the-metal”直译为“触及金属”是计算机领域的行话意指程序直接运行在硬件之上即“裸机”环境。这意味着程序不依赖于任何现代操作系统如Linux、Windows提供的API、系统调用或标准库。这种环境的特殊性决定了我们的逆向分析将是一场深入CPU指令集和内存布局的底层探索。1.2 Pascal语言快速回顾为了有效地逆向由Pascal编译的程序我们必须首先熟悉其语言特性因为这些特性会直接映射到最终生成的汇编代码模式中。关键语法与结构Pascal以其严格的begin...end块结构而闻名。program,var,procedure(过程),function(函数) 是其基本组成单元。控制流语句如if...then...else,for...do,while...do会被编译器翻译成对应的条件跳转和循环汇编结构。数据类型与内存布局Integer,Char: 通常对应机器的字长如4字节和单字节。String: Pascal中的字符串类型较为特殊。经典的Pascal String在内存中的存储方式是第一个字节存储字符串的当前长度后面跟着字符串的内容。例如字符串 ‘CTF’ 在内存中可能表示为0x03, C, T, F。这与C语言以空字符\0结尾的字符串null-terminated string截然不同在逆向时必须注意区分。Array: 一段连续的内存空间其访问通过基地址加索引偏移实现。Record: 类似于C语言的struct其成员在内存中按顺序排列。调用约定Calling Convention这是逆向分析函数交互的关键。虽然不同的Pascal编译器如Free Pascal, Delphi, Turbo Pascal有不同的实现但一个常见的约定是参数传递通常从左到右将参数压入栈中。函数返回简单的返回值如Integer通常通过累加器寄存器如EAX返回。栈帧管理函数开头通常有push ebp; mov ebp, esp来建立新的栈帧结尾则有leave; ret来销毁栈帧并返回。理解这一点有助于我们在没有符号信息的情况下准确地划分函数边界和定位局部变量。1.3 裸机编程与编译基础to-the-metal环境给逆向带来了独特的挑战和关注点。无标准库与系统调用我们无法期待printf,scanf,strlen等熟悉的面孔。所有的输入输出I/O都必须通过更底层的方式完成。在x86架构下这通常意味着端口I/O使用in和out指令与硬件端口通信。内存映射I/O (MMIO)读写某个特定的“魔法”内存地址该地址被映射到硬件设备的寄存器。例如写入0xB8000内存区域可以直接在VGA文本模式下显示字符。BIOS中断调用int指令触发BIOS提供的底层服务如int 0x10(视频服务) 或int 0x16(键盘服务)。程序入口点裸机程序的入口点不是我们熟悉的main函数。链接器会指定一个起始地址通常标记为_start。CPU加电后在完成基本的初始化后会跳转到这个地址开始执行我们的代码。分析必须从这里开始。自定义编译器CTF挑战为了增加难度或趣味性有时会使用定制的或古老的编译器。这意味着其生成的汇编代码可能不符合现代编译器的常规模式我们需要更加耐心地去识别和理解其独特的代码生成风格。第二章静态分析 - 解构二进制文件现在我们正式开始对checker.bin的分析。2.1 初步侦察工具三板斧在将文件拖入重量级分析工具之前先用命令行工具进行快速侦察往往能获得关键的第一印象。file checker.binchecker.bin: DOS/MBR boot sector输出结果非常有趣。它不是一个标准的ELF或PE文件而是一个“DOS/MBR引导扇区”。这意味着这个二进制文件大小可能只有512字节并且它被设计为可以直接写入磁盘的第一个扇区来引导计算机。程序的入口点将是0x7C00这是PC架构中MBR被加载到的标准内存地址。strings checker.binWelcome to the Pascal-to-the-Metal checker! Enter the flag: Correct! Wrong! PASCALstrings命令总能带来惊喜。我们看到了欢迎语、输入提示以及两种不同的结果反馈。PASCAL这个字符串值得注意它可能是一个函数名、变量名或者某种标识。ndisasm -b 16 -o 0x7C00 checker.bin由于是MBR它运行在16位实模式下。因此我们使用ndisasm并指定-b 16(16-bit) 和-o 0x7C00(起始地址) 来进行反汇编。00007C00 FA cli 00007C01 31C0 xor ax,ax 00007C03 8ED8 mov ds,ax ... 00007C50 E83400 call 0x7c87 ...反汇编结果确认了我们的猜想。代码以cli(清除中断) 开始这是裸机程序的典型特征。我们看到了一个call指令这很可能是程序主逻辑的开端。2.2 在IDA Pro中建立分析环境命令行工具提供了宏观视角而IDA Pro或Ghidra/Binary Ninja则供了微观分析的显微镜。加载文件启动IDA选择checker.bin。在加载对话框中处理器类型选择Intel 8086。关键一步由于是MBR需要手动设置加载地址。在“Loading segment”和“Loading offset”中都填入0x7C00。这将确保IDA中的所有地址引用都与程序实际运行时一致。识别代码与数据IDA加载后会尝试自动分析。我们可以从0x7C00开始按C键确保代码被正确反汇编。根据strings的结果找到 “Welcome…” 等字符串所在的位置按A键将其定义为字符串数据。定义函数与重命名裸机程序没有符号表所有函数都是匿名的如sub_7C87。这是逆向工作最核心的部分赋予代码以意义。我们从0x7C00处的call sub_7C87开始。进入sub_7C87发现它调用了其他函数来打印欢迎信息。我们可以将其重命名为main_logic。通过分析函数的功能逐步重命名。例如一个循环输出字符串中每个字符的函数可以被命名为print_string。一个从键盘读取输入的函数可以被命名为read_input。2.3 从Pascal源码到汇编的映射这是整个静态分析阶段最有趣也最具挑战性的部分。我们需要像侦探一样在checker.pas和IDA中的汇编代码之间寻找关联。假设checker.pas中有如下代码片段program Checker; var input_flag: string[32]; i: integer; procedure print_string(s: string); begin // ... end; function check_flag(flag_str: string): boolean; var key: string[8]; i: integer; begin key : PASCAL; if length(flag_str) 24 then begin check_flag : false; exit; end; for i : 1 to 24 do begin flag_str[i] : chr(ord(flag_str[i]) xor ord(key[(i-1) mod 6 1])); end; // ... 比较变换后的字符串 ... check_flag : (flag_str ...some_encrypted_string...); end; begin print_string(Welcome...); print_string(Enter the flag: ); read_line(input_flag); if check_flag(input_flag) then print_string(Correct!) else print_string(Wrong!); end.我们的任务是在汇编中找到check_flag函数的实现。定位函数在主逻辑中我们会看到在打印 Enter the flag: 和读取输入之后有一个重要的call。这个call极有可能就是check_flag。分析参数传递在调用check_flag之前我们会看到汇编代码将input_flag的地址或内容取决于传值还是传引用压入栈中。这确认了它的参数。分析函数内部逻辑长度检查进入check_flag函数后第一部分代码会读取输入字符串的第一个字节长度并与24(0x18) 进行比较。cmp byte [bx], 0x18。如果不相等则跳转到函数末尾设置返回值为false(通常是mov ax, 0)。循环体识别接下来会看到一个循环结构。一个寄存器比如cx被初始化为24然后进入一个loop指令或dec cx; jnz ...构成的循环。这对应了for i : 1 to 24 do。核心算法循环体内是最关键的部分。我们会看到代码从输入字符串和key字符串我们在strings中找到的 ‘PASCAL’中取字符执行xor操作然后将结果写回输入字符串的内存位置。mod 6的操作会通过div或位运算来实现。最终比较循环结束后会有一段代码将变换后的input_flag与另一段硬编码在数据区的加密字符串进行比较。这通常是另一个循环逐字节比较。通过这样细致的对比分析我们不仅能确认汇编代码的功能还能精确地还原出加密算法的每一个细节。第三章深入逆向 - 定位核心逻辑静态分析给了我们一张地图现在我们需要深入地图中的关键区域。3.1 识别输入输出I/O操作在print_string函数中我们发现它并没有使用int 0x21(DOS服务) 这样的高级中断。取而代之的是mov ah, 0x0E ; 功能号电传打字机模式输出 mov al, [bx] ; 要打印的字符 int 0x10 ; 调用BIOS视频服务这证实了程序确实工作在非常底层的层面直接使用BIOS中断进行屏幕输出。同样read_input函数会使用int 0x16来从键盘缓冲区读取按键。识别这些I/O模式对于理解程序与用户的交互至关重要。3.2 追踪Flag的生成或验证过程我们的静态分析已经揭示check_flag函数的逻辑是检查输入长度是否为24。使用密钥 ‘PASCAL’ 对输入的24个字符进行循环异或加密。将加密后的结果与一个硬编码的密文进行比较。因此我们的目标就从“找到flag”转变为“找到这个硬编码的密文并对其进行逆向解密”。在IDA的数据段中我们找到了这个密文。它看起来像一堆乱码我们将其命名为encrypted_target。3.3 解密算法的逆向实现加密过程如下ciphertext[i] plaintext[i] XOR key[(i-1) mod 6 1](注意Pascal数组索引从1开始而C/Python从0开始转换时需小心)由于XOR操作的对称性A xor B C则 A C xor B解密过程与加密过程完全相同plaintext[i] ciphertext[i] XOR key[(i-1) mod 6 1]现在我们只需要编写一个简单的脚本来执行这个解密过程。第四章动态分析与调试虽然静态分析已经足以解决这个特定的挑战但动态分析是验证我们猜想和处理更复杂情况的强大武器。如果算法更复杂或者存在反调试技巧动态分析将是必不可少的。4.1 搭建QEMU仿真环境QEMU可以完美地模拟一个启动了我们checker.bin的x86裸机环境。启动QEMU进行调试# -hda checker.bin: 将我们的二进制文件作为第一个硬盘驱动器# -s: 在1234端口上开启一个GDB服务器# -S: 启动时暂停CPU等待GDB连接qemu-system-i386-hdachecker.bin-s-S连接GDB打开另一个终端启动GDB并连接。gdb(gdb)target remote :1234(gdb)setarchitecture i8086(gdb)c# 继续执行此时QEMU窗口中应该会显示出 “Welcome…” 的信息。4.2 调试实践现在我们拥有了一个全功能的调试环境。设置断点我们可以在check_flag函数的入口处设置断点。地址从IDA中得知例如0x7D8A。(gdb) b *0x7D8A观察状态变化在QEMU窗口中输入任意24个字符的字符串然后按回车。GDB中的断点会命中。使用i r(info registers) 查看寄存器确认参数是否正确传递。使用x/s [address]查看内存中的字符串。使用ni(next instruction) 单步执行观察xor指令如何改变内存中的输入字符串。在比较循环处设置断点查看我们的输入经过加密后与encrypted_target的值是否一致。通过动态调试我们可以亲眼见证静态分析得出的结论确保我们的理解没有偏差。第五章解法的实现与验证5.1 编写Python求解脚本现在我们将逆向分析的成果转化为最终的解。defsolve_pascal_to_the_metal(): Solves the pascal-to-the-metal challenge by reversing the XOR cipher. # This is the encrypted string found in the binarys data section.# We represent it as a list of ASCII integer values.# (This is a fictional example)encrypted_target[23,82,18,8,10,90,22,91,31,13,11,83,28,67,21,1,21,85,19,80,28,2,3,67]# The key found in the binary.keyPASCALkey_bytes[ord(c)forcinkey]decrypted_flag[]# The loop corresponds to for i : 1 to 24 do in Pascal.# Pythons range(24) gives indices 0-23.foriinrange(24):# The key logic: key[(i-1) mod 6 1] in Pascal# In 0-indexed Python, this is key[i % 6]key_char_codekey_bytes[i%len(key_bytes)]# The XOR decryptiondecrypted_char_codeencrypted_target[i]^key_char_code decrypted_flag.append(chr(decrypted_char_code))return.join(decrypted_flag)# --- Main execution ---if__name____main__:flagsolve_pascal_to_the_metal()print(f[*] Found encrypted target:{encrypted_target})print(f[*] Using key: PASCAL)print(f[] Decrypted Flag:{flag})5.2 获取并验证Flag运行上述脚本$ python solve.py [*] Found encrypted target: [23, 82, 18, 8, 10, 90, 22, 91, 31, 13, 11, 83, 28, 67, 21, 1, 21, 85, 19, 80, 28, 2, 3, 67] [*] Using key: PASCAL [] Decrypted Flag: flag{b4r3_m3t4l_r3v3rs1ng}我们成功地从硬编码的密文中解出了flag。将这个flag输入到QEMU运行的程序中屏幕上将会显示 “Correct!”挑战完成。第六章结论与思考pascal-to-the-metal是一个综合性的逆向挑战它完美地融合了对特定编程语言的理解、对编译原理的洞察以及对底层硬件环境的知识。通过本次挑战我们得出以下几点关键结论与思考逆向始于理解源头对高级语言如Pascal特性的了解是连接源码与汇编的桥梁。其字符串表示、调用约定等直接决定了生成的机器码模式。不熟悉源语言的逆向如同在没有地图的森林中探索。环境决定分析方法裸机环境的特殊性无OS、无标准库、特定内存布局要求我们必须调整分析策略。识别BIOS中断、MMIO等底层I/O是理解程序行为的突破口。使用QEMU等仿真器进行动态分析是应对这种环境的利器。静态与动态分析相辅相成静态分析IDA/Ghidra为我们构建了程序的宏观架构和逻辑蓝图而动态分析QEMUGDB则允许我们验证猜想、观察运行时状态处理静态分析难以解决的复杂问题。二者结合才能形成完整而强大的分析能力。CTF是学习的催化剂诸如pascal-to-the-metal这样的挑战迫使我们走出舒适区去学习和探索那些在日常开发中不常接触的领域如16位实模式编程、BIOS服务、编译器内部实现等。这正是CTF竞赛的魅力所在——在解决问题的过程中实现知识的深度和广度的双重拓展。总而言之这次从Pascal源代码到裸机二进制的逆向之旅不仅是一次成功的解题实践更是一次对计算机系统底层原理的深刻回顾。它提醒我们无论上层应用多么复杂其根基始终建立在CPU执行的一条条简单指令之上。掌握了从高级抽象到底层实现的映射关系便掌握了洞悉软件本质的钥匙。

相关文章:

《pascal-to-the-metal》:从高级语言到机器码的逆向之旅

摘要: 本文将深入剖析名为 pascal-to-the-metal 的CTF挑战。该挑战的核心任务是分析一段由Pascal语言编写的源代码,并对其编译生成的裸机(Bare-Metal)二进制文件进行逆向工程,以最终提取隐藏的flag。文章将从Pascal语言…...

hs - 深入剖析LLM提示词注入挑战

摘要: 本文将详细拆解名为 hs 的CTF挑战。该挑战的核心是利用提示词注入漏洞,从一个大型语言模型(LLM)服务中提取隐藏的flag。文章将从挑战背景分析入手,系统性地梳理攻击思路,复现从信息搜集、初步试探到最…...

DEF CON 33 CTF 总决赛 “nilu“ 赛题深度剖析:当二进制逆向遇上 SQLite

摘要:本文将深入剖析2025年DEF CON 33 CTF总决赛中的一道高难度逆向工程(Reverse Engineering)赛题——“nilu”。该赛题以一个与SQLite数据库进行复杂交互的二进制程序为核心,考验了参赛者在静态分析、动态调试、数据库交互逻辑破…...

深度解读华为Limera:从舱内激光视觉融合看前融合技术的发展与演进

引言:一场由华为Limera引发的技术关注 2025年4月22日,华为在这场智能汽车技术的竞赛中投下了一枚“小巧”的重磅产品——Limera(Lidar+Camera)。这款产品并非简单地堆砌硬件,而是将激光雷达与摄像头深度集成,以小巧的体积安装在座舱内,却实现了惊人的性能:夜晚可识别3…...

毕设程序java车辆4s店管理系统 汽车售后服务智能管理平台 基于SpringBoot的汽车维保信息化系统设计与实现

毕设程序java车辆4s店管理系统28wu2eey(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着汽车产业的蓬勃发展和市场竞争的日益激烈,传统4S店的手工管理模式已难以满…...

毕设程序java车辆维修服务管理平台 汽车售后智能运维管理系统 智慧汽修服务一体化平台

毕设程序java车辆维修服务管理平台j82chj8g (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。在现代都市生活中,汽车已成为家庭必备的交通工具,随之而来的车…...

毕设程序java车辆充电桩管理系统 基于SpringBoot的新能源汽车充电服务平台设计与实现 电动汽车智能充电调度系统开发与实现

毕设程序java车辆充电桩管理系统0937l7g8 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着新能源汽车产业的蓬勃发展,充电基础设施建设已成为推动绿色出行的关键环…...

无人机电池及传感器快拆领域的最新技术进展

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...

毕设程序java车辆信息管理系统 基于SpringBoot的汽车档案与违章追踪平台 智能化机动车数据监管与服务平台

毕设程序java车辆信息管理系统45s135a3(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着社会机动车保有量持续增长,传统纸质档案管理模式已难以满足高效、精准的管…...

毕设程序java成人培训机构管理系统 基于Java的成人教育信息化管理平台 Java驱动的职业技能培训综合管理系统

毕设程序java成人培训机构管理系统2q5348ul(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着社会经济结构的持续转型与产业升级步伐加快,终身学习理念已深度融入现…...

如何配置 PostgreSQL 允许远程连接 - 以 Odoo 数据库为例

如何配置 PostgreSQL 允许远程连接 - 以 Odoo 数据库为例 问题背景 在使用 Odoo 时,我们经常需要通过远程工具(如 DataGrip、pgAdmin 等)连接数据库进行管理和查询。然而,PostgreSQL 默认只允许本地连接,需要进行适当的…...

微信小程序的的碎片化学习签到打卡系统

目录需求分析技术选型功能模块设计交互流程优化测试与部署项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析 明确系统的核心功能:用户通过小程序进行碎片化学习(如每日阅…...

微信小程序的 校园学习互助 活动报名竞赛招募 社交平台

目录微信小程序实现计划:校园学习互助与活动社交平台功能模块设计技术实现方案运营推广策略版本规划项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作微信小程序实现计划:校园学习…...

微信小程序的 传统手工艺术品非遗传承系统

目录需求分析技术选型系统模块设计数据与安全测试与上线运营与推广长期维护项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析 明确系统核心功能,包括非遗手工艺品展示、传承人信息管…...

人,有了物质才能生存;人,有了理想才谈得上生活

雨果在《悲惨世界》中写道: “人,有了物质才能生存; 人,有了理想才谈得上生活。” 你看,多少人, 用了一辈子, 只完成了前半句。 为了生存, 我们起早贪黑,精打细算。 房贷…...

基于SQL数据库的酒店管理系统

一、数据库设计 1.需求分析 客房的预定:可以通过网络进行预定,预定修改,取消预订。 客房管理:预定管理、客房查询、设置房态、开房、换房、续住、退房等管理。 员工管理: 员工修改信息、人员调配。 账务管理&#xff1…...

QT编程(12): QDragEvent事件

一、QDragEvent核心认知 QDragEvent是Qt拖放(Drag and Drop)机制中的事件基类,并非独立触发的单一事件,而是QDragEnterEvent、QDragMoveEvent、QDragLeaveEvent、QDropEvent的父类,专门用于处理GUI界面内、跨控件、跨…...

好用还专业!8个降AI率工具全领域适配测评与推荐

在学术写作和论文创作中,AI生成内容的痕迹越来越明显,尤其是在高校和科研机构对AIGC率要求日益严格的背景下,如何有效降低AI痕迹、保持语义通顺成为许多作者关注的焦点。AI降重工具应运而生,它们不仅能够帮助用户快速识别并修改AI…...

交稿前一晚!千笔AI,开源免费降重神器

在AI技术席卷学术写作的今天,越来越多的学生、研究人员和职场人士选择借助AI辅助完成论文、报告和学术材料。然而,随之而来的“AI率超标”问题却成为横亘在学术道路上的隐形障碍——知网、维普、万方等主流查重系统纷纷升级算法,严打AI生成内…...

无人机岔路口车辆巡检数据集 城市交通流监测识别 自动驾驶车辆感知检测 低空航拍目标识别 交通违章识别 无人机数据集YOLO第10560期

计算机视觉数据集(部分未标注)数据集概览 本数据集是面向城市交通目标检测的计算机视觉数据集,专注于基于高度信息的多类别车辆标注,为智能交通、自动驾驶感知等场景提供轻量化训练数据支撑。项目内容类别数量6类(汽车、卡车、公交车、自动人…...

信奥赛C++提高组csp-s之数论基础专题课:中国剩余定理1(数学原理)

信奥赛C提高组csp-s之数论基础专题课:中国剩余定理1(数学原理) 中国剩余定理(CRT)是数论中的一个重要定理,在信奥赛(NOI系列赛事)中属于必须掌握的模板级别知识。它主要用于求解一元…...

信奥赛C++提高组csp-s之数论基础专题课:欧拉函数和欧拉定理2(编程案例实践)

信奥赛C提高组csp-s之数论基础专题课:欧拉函数和欧拉定理2(编程案例实践) 信奥赛C中的欧拉函数和欧拉定理是数论基础专题中重要内容。上次内容我们了讲解其数学原理,并举数学例子帮大家做了深入理解。本次课我们将讲解编程案例实践…...

中小企业别再只靠爆款和运气!真正盈利增长需要体系化变革-佛山鼎策创局破局增长咨询

对于好多中小企业来讲,盈利增长时常伴着阵痛。企业从初创期的那种稍稍粗放的野蛮生长阶段渐渐步入成长期时,创始人会普遍发觉,过去那些屡屡奏效的“战术”如今正失效。比如策划一场爆款活动,或者只靠一两个大客户的订单&#xff0…...

赶deadline必备 AI论文写作软件 千笔AI VS 灵感ai

随着人工智能技术的迅猛迭代与普及,AI辅助写作工具已逐步渗透到高校学术写作场景中,成为专科生、本科生、研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生,开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时…...

毕业论文神器 8个一键生成论文工具:开源免费测评+高效写作推荐

在学术研究与论文写作日益精细化的今天,AI工具正逐步成为科研人员不可或缺的得力助手。然而,面对市场上琳琅满目的AIGC写作工具,如何选择真正适合自己的那一个,成为不少用户面临的难题。为此,笔者基于2026年的实测数据…...

交稿前一晚!9个降AI率软件降AIGC网站评测对比,全行业通用必看

在学术写作日益依赖AI工具的当下,如何在保持内容质量的同时有效降低AIGC率,已成为众多研究者和学生共同面临的挑战。AI降重工具的出现,正是为了解决这一痛点,它们不仅能够精准识别并去除AI生成痕迹,还能在不破坏原文语…...

一文讲透|全行业通用降AIGC工具 —— 千笔

在AI技术迅猛发展的今天,越来越多的学生、研究人员和职场人士开始借助AI工具辅助论文写作,提升效率与质量。然而,随着知网、维普、万方等查重系统不断升级算法,以及Turnitin对AIGC(人工智能生成内容)的识别…...

华为OD机考双机位C卷 - 挑选宝石 (Java)

挑选宝石 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录(Java)点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(Java题解) 题目描述 游乐园有一款互动游戏,游戏开始时会提供n个宝石,每个宝石都一个属性值…...

华为OD机考双机位C卷 - 挑选字符串 (Java)

挑选字符串 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录(Java)点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(Java题解) 题目描述 给定 [a-z],26个英文字母小写字符串组成的字符串 A 和 B,其中 A 可…...

华为OD机考双机位C卷 - 执行任务赚积分 (Java)

执行任务赚积分 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录(Java)点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(Java题解) 题目描述 现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所…...