BUUCTF Reverse [ACTF新生赛2020]rome 逆向分析与爆破算法实战

[ACTF新生赛2020]rome 详解 偏移量=-79-(-64)+97-64。偏移量=-51-(-64)+65-64。然后这里就有两个思路了,第一种就是计算偏移量进行逆向倒推出flag。先写出正常凯撒加密的代码假设偏移量为先右偏移了4,W为输入的明文,E为加密后的密文。这里计算方法就是用题目中的-51减去-64加上题目中的65-64得出偏移量为14。这里计算方法就是用题目中的-79减去-64加上题目中的97-64得出偏移量为18。先计算偏移量,看源码大写字母和小写字母的偏移量是不同的。第二种方法,暴力破解,就不需要分析出偏移量了。 阅读详情

1. 从零开始:拿到题目文件与初步检查

大家好,我是老张,一个在安全圈摸爬滚打了十来年的老逆向。今天咱们来一起盘一盘BUUCTF平台上的一道经典逆向题——[ACTF新生赛2020]rome。这道题特别适合刚入门逆向的朋友,它没有复杂的混淆和壳,核心就是考察你对基础加密算法的识别和爆破能力。很多新手朋友一看到“逆向”两个字就发怵,觉得要懂汇编、懂底层,其实没那么玄乎。咱们今天就用这道题,手把手带你走一遍从拿到文件到最终爆出flag的完整流程,保证你看完就能上手操作。

首先,咱们得把题目文件拿到手。在BUUCTF平台上下载附件,你会得到一个名为“rome.exe”的可执行文件。拿到任何未知可执行文件,第一步千万别急着双击运行,尤其是在自己的主力机上。我的习惯是,先把它丢到虚拟机或者沙箱环境里。不过对于CTF题目,第一步更常规的操作是进行“文件指纹识别”。这里我用的是Exeinfo PE这个小工具,它轻量又免费,是逆向分析的好帮手。把“rome.exe”拖进Exeinfo PE的窗口,工具会快速分析文件头信息。几秒钟后,结果就出来了:这是一个32位的PE文件,并且最重要的是,它显示为“Microsoft Visual C++”编译,而且无壳。

看到“无壳”这两个字,我心里就踏实了一大半。壳(Pack)就像是给程序穿上的“盔甲”,有压缩壳、加密壳等等,它的存在会干扰我们的静态分析,需要先进行脱壳处理。这道题没加壳,意味着我们可以直接用静态分析工具打开它,查看最原始的代码逻辑,这大大降低了入门门槛。所以,对于逆向新手来说,遇到无壳程序,就等于成功了一半。确认了是32位无壳程序后,我们接下来就要请出逆向分析领域的“瑞士军刀”——IDA Pro了。因为程序是32位的,所以我们打开IDA 32位版本(也就是常说的IDA32),准备开始真正的分析之旅。

2. 静态分析核心:用IDA Pro定位关键逻辑

打开IDA32,把“rome.exe”拖进去。IDA会先进行自动分析,包括识别函数、字符串、数据结构等,这个过程需要一点时间,耐心等待进度条走完。分析完成后,我们会看到IDA的反汇编窗口,里面满是汇编指令,对于新手来说可能有点眼花。别慌,我们有“捷径”可走。

逆向分析中,字符串常量往往是重要的突破口。程序在运行中输出的提示信息、进行比较的密钥、加密后的flag等,常常以明文或某种编码形式存储在程序的静态数据区。在IDA中,我们可以快速查看所有这些字符串。按下快捷键 Shift + F12,就能打开“Strings window”(字符串窗口)。这里列出了程序里所有的字符串常量。我快速浏览了一下,一眼就看到了一个非常可疑的字符串:Qsw3sj_lz4_Ujw@l。这串字符看起来毫无规律,既不像英文单词,也不像常规的Base64编码,非常符合CTF题目中“加密后的flag”的特征。我双击这行字符串,IDA会自动跳转到该字符串在数据段(通常是.rdata段)的存储位置。

接下来,我们需要找到是哪段代码在使用这个字符串。在数据窗口,这个字符串的地址上通常会显示对其的交叉引用(xref)。我们可以在字符串地址上按 X 键,或者在右键菜单中选择“List cross-references to...”。这时,IDA会弹出一个窗口,显示所有引用了这个地址的代码位置。不出所料,只有一个函数引用了它。我们双击这个引用,IDA就会跳转到引用该字符串的汇编代码处。

通常,引用关键字符串的代码就在程序的主逻辑函数附近,甚至可能就是主函数本身。我们按 F5 键,IDA强大的Hex-Rays插件就会将当前函数的汇编代码,反编译成非常易读的C语言伪代码。这简直是逆向工程师的福音,它把晦涩的汇编指令转换成了接近源码的逻辑,极大提升了分析效率。F5之后,一个清晰的函数结构就展现在我们面前。我习惯先快速浏览一下这个函数的整体结构:看到了明显的循环、条件判断以及对那个可疑字符串的字符数组访问(比如 v12[i]),这基本可以确定,我们找对地方了,这就是处理flag加密/解密的核心函数,很可能就是main函数。

3. 深入代码:逆向解析加密算法

现在,我们聚焦到IDA F5生成的伪代码上。我们的目标是把这段代码的逻辑彻底搞清楚。伪代码里定义了一个字符数组,内容正是我们之前看到的 Qsw3sj_lz4_Ujw@l,我们给它起个名字叫 encrypted_flag。然后是一个双重循环结构。

外层循环 for (i = 0; i < 17; ++i) 很容易理解:它遍历 encrypted_flag 字符串的每一个字符,字符串长度是16(索引0到15),但循环条件是 i < 17,这可能是因为字符串末尾还有一个结束符 \0,循环也把它包含了进去,不过在实际比较时,\0字符通常不会匹配我们设定的可打印字符范围,所以不影响结果。

内层循环 for ( j = 32; j <= 126; ++j ) 是关键。它遍历了所有ASCII码中的可打印字符(从空格32到波浪号126)。这意味着,程序在尝试对encrypted_flag中的每一个字符,用所有可能的可打印字符进行一种变换,然后看变换后的结果是否与encrypted_flag中的那个字符相等。

那么变换规则是什么呢?看内层循环里的两个if判断:

if ( j > 64 && j <= 90 )
{
    j = (j - 51) % 26 + 65;
}
if ( j > 96 && j <= 122 )
{
    j = (j - 79) % 26 + 97;
}

这里要注意,代码里直接对循环变量 j 进行了修改,在分析时我们最好引入一个临时变量(比如 x)来理解,避免混淆。

第一个if判断:如果 j(即我们尝试的字符的ASCII码)在大写字母‘A’(65)到‘Z’(90)之间(注意条件是 j > 64 && j <= 90),就执行 x = (x - 51) % 26 + 65。这其实是一个典型的凯撒移位变种。(x - 65) 可以得到字母在字母表中的序号(0-25),这里减51再模26,等效于先减 51 % 26 = 25,也就是减25。因为模26运算下,减25等于加1。所以这个变换实际上是:将大写字母在字母表中向后移动1位(Z移动后变成A)。+65 是将数字序号重新转换回ASCII码。

第二个if判断:如果 j 在小写字母‘a’(97)到‘z’(122)之间,执行 x = (x - 79) % 26 + 97。同理,79 % 26 = 1,所以这个变换是:将小写字母在字母表中向后移动1位。

总结一下算法逻辑:对于encrypted_flag中的每个字符,程序会遍历所有可打印字符。对于每个被遍历的字符,如果是英文字母,就将其在字母表内循环后移一位(大写归大写,小写归小写),数字和符号则保持不变。然后,用变换后的字符与encrypted_flag中的对应字符进行比较。如果相等,那么当前遍历的这个原始字符(变换前的 j),就是flag中对应位置的真实字符!

这实际上是一个解密算法的逆向。我们已知加密后的字符串 encrypted_flag,加密规则是“将原文中的英文字母后移一位”。那么解密规则自然就是“将密文中的英文字母前移一位”。程序这里用爆破的方式(遍历所有可能输入)来反向寻找原文。

4. 编写爆破脚本:将分析转化为答案

分析清楚了算法,我们就有多种方法得到flag。最直接的是心算或笔算解密:看到密文字母,就将其前移一位(‘B’变‘A’,‘b’变‘a’),非字母字符不变。但作为CTF练习,同时也是为了应对更复杂的变换,编写一个爆破脚本是更通用、更可靠的方法。而且,题目原始文章给出的就是一段C语言爆破代码,我们也来亲手实现一下,并理解其原理。

根据上面的分析,我们可以用Python快速写一个脚本。思路和伪代码一致:准备密文,遍历每个字符,对于每个可能输入(32-126),应用那个“后移一位”的变换,然后比较。

encrypted = "Qsw3sj_lz4_Ujw@l"
flag = ""

for enc_char in encrypted:
    for possible_ascii in range(32, 127): # 遍历所有可打印字符
        x = possible_ascii
        # 如果是大写字母,后移一位
        if 65 <= possible_ascii <= 90:  # 'A' to 'Z'
            x = (possible_ascii - 65 + 1) % 26 + 65
        # 如果是小写字母,后移一位
        elif 97 <= possible_ascii <= 122: # 'a' to 'z'
            x = (possible_ascii - 97 + 1) % 26 + 97
        # 如果变换后的字符等于密文中的字符
        if chr(x) == enc_char:
            flag += chr(possible_ascii) # 则原始字符就是flag的一部分
            break # 找到后跳出内层循环,处理下一个密文字符

print("Flag is: flag{" + flag + "}")

运行这个脚本,瞬间就能得到输出:Flag is: flag{Cae3ar_th4_Gre@t}。

等等,这里有个细节!我们对比一下原始文章给出的C代码。它的变换公式是 (x - 51) % 26 + 65 和 (x - 79) % 26 + 97。我们刚才分析,这等价于“后移一位”。但我们自己写的Python脚本,直接用了“后移一位”的逻辑 (ord-65+1)%26+65。这两者数学上是等价的吗?我们来验证一下:对于大写字母‘C’,ASCII是67。按照C代码:(67-51)=16,16%26=16,16+65=81 即‘Q’。按照我们的“后移一位”逻辑:‘C’后移一位是‘D’,ASCII是68,不对。哦,这里我犯了个错误!密文是Q,原始文章代码是用j(可能输入)去变换,然后看是否等于密文。所以这个变换是从可能输入到密文的。如果输入是‘C’(67),变换后得到了‘Q’(81)。这可不是后移一位,这是一个特定的映射。

让我们重新审视:(67 - 51) % 26 + 65 = (16) % 26 + 65 = 16 + 65 = 81。所以这个公式把‘C’映射成了‘Q’。这更像是一个凯撒加密的变种,但密钥不是1。(x - 51) % 26 等价于 (x - (51%26)) % 26 即 (x - 25) % 26。在模26运算中,减25等于加1。所以 (x - 25) % 26 + 65 等价于 (x + 1) % 26 + 65?不对,(x - 25) mod 26 和 (x + 1) mod 26 是相等的。因为 -25 ≡ 1 (mod 26)。所以,(x - 51) % 26 + 65 确实等价于 (x + 1) % 26 + 65!也就是说,对于大写字母,它执行了 (x + 1) % 26 + 65。这不是“后移一位”,这是“前移一位”吗?(x+1) 才是后移。我们验证:输入‘C’(67),(67+1)=68,68%26=16? 等等,68除以26余16,16+65=81,确实是‘Q’。所以这个公式是:先给字母序号加1(后移一位),然后模26,最后加65转回ASCII。这正是标准的凯撒加密(移位为1)!只不过它用了一个绕一点的写法 -51。

同理,小写字母的 (x - 79) % 26 + 97,因为 -79 ≡ -1 ≡ 25 (mod 26),所以等价于 (x + 25) % 26 + 97,也就是 (x - 1) % 26 + 97?这里有点绕。我们验算:对于小写字母‘a’(97),(97-79)=18,18%26=18,18+97=115 即‘s’。如果按(x-1)算,‘a’前移一位是‘’,不对。我们直接计算 (97 + 25) % 26 + 97 = (122) % 26 + 97 = 18 + 97 = 115,也是‘s’。所以小写部分的 -79等价于+25,而 +25在模26下等价于-1`。所以小写字母的变换是 前移一位。

结论:这个加密算法对大写字母后移一位,对小写字母前移一位,对数字符号不变。那么解密算法(即从密文反推原文)就应该是:大写字母前移一位,小写字母后移一位。我们根据这个正确的解密逻辑,修改Python脚本:

encrypted = "Qsw3sj_lz4_Ujw@l"
flag = ""

for enc_char in encrypted:
    found = False
    for possible_ascii in range(32, 127):
        x = possible_ascii
        # 加密过程(用于与密文比较)
        if 65 <= possible_ascii <= 90:  # 大写字母,加密时后移
            x = (possible_ascii - 65 + 1) % 26 + 65
        elif 97 <= possible_ascii <= 122: # 小写字母,加密时前移
            x = (possible_ascii - 97 - 1) % 26 + 97 # 注意是-1
        # 比较
        if chr(x) == enc_char:
            flag += chr(possible_ascii)
            found = True
            break
    if not found: # 处理非字母字符(如数字、符号)
        flag += enc_char

print("Flag is: flag{" + flag + "}")

运行后,我们得到 Flag is: flag{Cae3ar_th4_Gre@t}。和原始文章的结果一致。对于数字‘3’、‘4’和符号‘_’、‘@’,它们在加密过程中没有变化,所以在爆破时,内层循环会直接命中(当 possible_ascii 等于其本身ASCII时,x不变,等于密文字符),因此也能正确还原。

5. 算法还原与深度理解:凯撒密码的变种

通过上面的爆破,我们拿到了flag。但作为一个学习者,我们不应该止步于此。我们应该能正面推导出加解密算法,而不仅仅是暴力破解。从爆破过程中,我们反向推导出了加密规则:大写字母后移1位,小写字母前移1位。这是一个带大小写区分的、移位方向相反的凯撒密码变种。

标准的凯撒密码是所有的字母都朝同一个方向移动固定的位置。而这道题玩了个小花样,让大小写字母的移动方向相反。这可能是为了增加一点迷惑性,但本质上依然是单表替换密码,安全性非常弱,通过爆破或频率分析很容易破解。

为什么我们能用爆破?因为密钥空间极小。对于每个字符,如果是字母,其可能性只有26种(大小写分开算);即使遍历所有可打印字符,也才95种可能。对于长度仅为16的字符串,总的尝试次数最多是 95^16,看起来很大,但因为我们是对每个字符独立进行爆破(算法中没有跨字符的依赖),所以实际复杂度是 O(n*m),其中n是字符串长度,m是字符集大小(95)。在计算机上,这几乎是瞬间完成的。

在真正的逆向工程中,我们遇到的情况会比这复杂得多。但这道题提供了一个完美的入门范例:定位关键字符串 -> 反编译主函数 -> 分析算法逻辑 -> 编写解密脚本。这个流程是通用的。当你掌握了这个流程,再遇到更复杂的保护(如混淆、壳、反调试、多线程),你就有了一套基础的应对框架:先想办法脱壳、去混淆,让代码可读,然后再套用这个分析流程。

6. 举一反三:扩展思考与实战建议

做完这道题,我们可以再深入思考几个问题,这对提升逆向能力很有帮助。

第一,如果加密算法更复杂怎么办? 比如,移位量不是固定的1,而是依赖于字符在字符串中的位置(i),或者依赖于一个密钥字符串。我们的爆破方法依然有效,但需要调整内层循环。如果算法是可逆的,我们更推荐直接编写解密函数,而不是爆破。例如本题,我们可以直接写出解密算法:遍历密文,大写字母减1,小写字母加1。这样效率更高,代码也更优雅。爆破是在算法复杂或难以直接逆向时的“万能钥匙”。

第二,如何验证自己的分析? 一个很好的方法是动态调试。我们可以用x32dbg或OllyDbg附加到“rome.exe”进程,在关键比较指令处下断点,单步跟踪寄存器和内存值的变化,亲眼看到加密/解密过程。动态调试能直观地验证静态分析的结论。对于这道题,你可以在内存中看到 encrypted_flag 字符串,然后跟踪循环,观察每个候选字符经过计算后是否与密文字符相等。这个过程能让你对程序运行时的行为有更深的理解。

第三,关于IDA的使用技巧。 本题我们用了 Shift+F12 查字符串和 F5 反编译,这是最常用的两个功能。除此之外,你还需要熟悉重命名变量(按N键)、添加注释(按冒号:键)、修改函数原型(按Y键)等操作。良好的命名和注释能让伪代码的可读性大大提升。比如,把 v12 重命名为 encrypted_flag,把循环变量 i 重命名为 index,一眼就能看懂代码在做什么。

第四,CTF逆向题的常见套路。 像“rome”这类题目,往往暗示了加密算法。“rome”(罗马)很容易让人联想到“凯撒”(Caesar),因为凯撒密码起源于古罗马。所以,看到题目名、函数名、字符串中的一些提示(比如本题flag里的“Cae3ar”),要大胆猜测可能用了古典密码。常见的还有“base64”、“xor”、“rabbit”、“tea”等关键词,都可能直接指向了所用的加密算法。

最后,给新手朋友一点实战建议:逆向工程就像解谜,需要耐心和细心。不要被庞大的汇编代码吓倒,总是从入口点(main函数)、输入输出(字符串、文件、网络)和关键判断(if、switch、比较指令)入手。多动手,多写脚本,哪怕最开始只是照猫画虎。像今天这样,分析一道题,就彻底吃透它的算法、它的漏洞、它的解题思路,积累下来,你的能力就会在不知不觉中快速增长。这道“[ACTF新生赛2020]rome”就是一个非常棒的起点,它几乎涵盖了入门逆向所需的所有基础步骤。希望这篇详细的拆解能帮你打开逆向世界的大门。

CTF逆向题“rome”解析:从算法分析到Python爆破脚本实战 在软件安全与逆向工程领域,理解程序验证逻辑并实现高效求解是核心技能。其原理在于通过静态与动态分析,还原程序对输入数据的处理算法,进而构造破解方案。这项技术的价值在于提升安全研究人员快速定位漏洞、分析恶意代码的能力。应用场景广泛,包括CTF竞赛、软件漏洞挖掘及安全评估。本文以一道经典CTF逆向题为例,深入剖析其字符变换算法,并演示如何编写Python爆破脚本,其中涉及逆向分析和算法识别等关键热词,帮助读者掌握从分析到实现的全流程实战技巧。 阅读详情

相关推荐

BUUCTF Reverse [ACTF新生赛2020]rome 题解

3.拖入IDA32 SHIFT+F12定位主函数 F5查看伪代码。所以flag为:flag{Cae3ar_th4_Gre@t}2.拖入exeinfo 是32位的文件 无壳。1.下载文件,得到一个.exe。

qq_33348179的博客 1050

BUUCTF [ACTF2020新生赛]rome

c语言32windows程序逆向。

jokerboxs的博客 458

BUUCTF逆向wp [ACTF新生赛2020]rome

接下来的代码块是一系列嵌套的 if 语句,用于检查 v2 到 v11 的值是否依次为 'A', 'C', 'T', 'F', '{', '}'。循环结束后,再次将 v12[17] 的整数值设置为 0,并开始另一个循环,检查 v1 数组中的字符是否与 v12 中相应位置的字符相匹配。while ( *(int *)&v12[17] <= 15 ) - 开始一个循环,循环条件是 v12[17] 的整数值小于等于 15。- 每次循环结束时,将 v12[17] 的整数值加 1。的字符串变量,存储了待处理的字符串。

2302_81740139的博客 1481

buuctf刷题记录8 [ACTF新生赛2020]rome

ida打开,逻辑很清晰 v15 = 81; v16 = 115; v17 = 119; v18 = 51; v19 = 115; v20 = 106; v21 = 95; v22 = 108; v23 = 122; v24 = 52; v25 = 95; v26 = 85; v27 = 106; v28 = 119; v29 = 64; v30 = 108; v31 = 0; printf("Please input:"); scan

ytj00的博客 999

(4-4)目标跟踪:粒子滤波器算法

粒子滤波器(Particle Filter)是一种用于状态估计的贝叶斯滤波方法,通常用于处理非线性系统模型或非高斯噪声的情况。与传统的卡尔曼滤波器和扩展卡尔曼滤波器不同,粒子滤波器通过使用一组随机样本(粒子)来近似表示概率分布,从而对目标状态进行估计和跟踪。实现粒子滤波器的基本步骤如下所示:(1)初始化:首先,根据先验信息或初始观测数据,生成一组具有随机状态的粒子。这些粒子代表了目标状态的可能性分布。(2)预测:在预测步骤中,根据系统的动态模型,对每个粒子进行状态预测。

码农三叔 1965

gRPC之gRPC开发流程与入门案例

gRPC之gRPC开发流程与入门案例

YIYIYI 3759

BUUCTF-RE-[ACTF新生赛2020]rome

BUUCTF-[ACTF新生赛2020]romePEID查壳关键代码审计编写解密脚本get flag PEID查壳 PEID查壳发现没有壳 关键代码审计 将程序放入IDA pro进行分析 int __cdecl main(int argc, const char **argv, const char **envp) { __main(); func(); return 0; } 进入_main函数为程序初始化函数,我们看到关键代码func int func() { int result;

Henlenl的博客 484

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.youkuaiyun.com/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2846

【BUUCTF逆向题】[ACTF新生赛2020]rome

应该就是正确出口,往上看就是错误出口及其循环判断,判断v12开始的某些字符是否等于v1开始的某些字符,不满足则跳出,再网上看v12部分字符已知,那么应该就是由已知推未知输入的题型,现在就是找到v1是什么,和我们的输入字符串有什么关系。下面的程序是将输入的v7、8、9、10段的数据传给v1(刚好16字节),然后经过一个循环加密处理,之后就是上面分析的检验程序,因为这里有取模运算,逆向判断可能复杂,我这里选择正向爆破,用所有的ASCII字符做字典,最后判断是否等于已知字符,脚本如下:(按照已知代码写就行了)

Power的博客 1280

SMR实战指南:从GWAS数据到eQTL分析的完整流程

本文提供了基于汇总数据的孟德尔随机化(SMR)实战指南,详细解析了如何从GWAS汇总数据出发,整合eQTL数据,完成从数据准备、BESD格式转换到最终SMR与HEIDI分析的完整流程。文章重点阐述了核心操作步骤、常见避坑技巧与结果解读,旨在帮助遗传学研究者高效掌握这一分析基因表达与复杂性状潜在因果关系的强大工具。

weixin_29246195的博客 1068

2024年捡垃圾指南:E5 V3/V4服务器CPU怎么选?从游戏多开到深度学习,附华南X99主板搭配清单

本文详细解析2024年E5 V3/V4服务器CPU的选购策略,涵盖游戏多开、深度学习等多种应用场景。通过对比E5 V3与V4系列的制程、功耗及性能差异,提供高性价比的CPU型号推荐及华南X99主板搭配方案,帮助用户在有限预算下打造高效能工作站。

weixin_42549451的博客 1582

【BUUCTF-Reverse】0x12.[ACTF新生赛2020]rome

首先第一个if,他是判断ASCII值在64~90之间的字符,也就是大写字母,如果在此区间,进行(x-51)% 26 +65的操作。2.&v12[17]可能是反编译的问题,这里应该就是指代"Qsw3sj_lz4_Ujw@l"这个字符串。按键盘的\键可以将这些((char ))、*(_DWORD *)这些隐藏,可以让我们更好的判断代码。ps:这里可以将v12替换成其他的更好理解,因为是经过这个循环后才获得的v12这个字符串。1.在上方代码可以发现,v1是0,所以可以将v1无视。一种是在要求的范围内,一种不在。

weixin_44245267的博客 331

Copula函数

Copula是处理统计中随机变量相关性问题的一种方法。本文是对Copula函数的各种定义,Copula函数的思想,Copula函数的性质,Copula函数的类型等理论资料总结

Explore 5万+

BUUCTF reverse wp 21 - 30

无壳, 直接拖进IDA32y键把v2改成char[49], n键重命名为iuput0-4位是'ACTF{'最后1位是'}'直接爆破5-20位。

fa1c4的blog 395

N32在Keil中J-Link识别失败的排查与修复指南

本文详细解析了在Keil开发环境中,J-Link调试器无法识别N32系列MCU的常见问题。通过分步指导,从检查修改Keil工程配置文件、更新J-Link驱动,到手动添加N32专用设备支持包,系统性地提供了排查与修复方案,帮助开发者快速恢复调试连接,确保开发流程顺畅。

304

扫地机器人设计与实现——基于嵌入式系统的智能家居解决方案

本文介绍了基于嵌入式技术的扫地机器人设计与实现。通过利用STM32单片机、传感器、驱动系统等硬件组件,并结合路径规划与控制算法、远程控制等软件技术,设计出了一款具有智能避障、路径规划、自动充电等功能的扫地机器人。系统的开发不仅提高了清洁效率,也为进一步研究和优化扫地机器人提供了实践基础。

2201_76125393的博客 1639

凯撒加密

1、凯撒加密(Caesarcipher) 凯撒加密是一种简单的消息编码方式:它根据字母表将消息中的每个字母移动常量位k(密钥)。 例如:如果k等于3,则在编码后的消息中,每个字母都会向前移动3位:a(明文)会被替换为d(密文);b会被替换成e;依此类推。字母表末尾将回卷到字母表开头。于是,w会被替换为z,x会被替换为a。 如果是将移动的位数用随机数进行代替,并且记录下该随机数,则破解密码的难度将大...

qq_41415874的博客 3270

Anomalib库安装以及使用

Anomalib是一个专注于异常检测的深度学习库。它的目标是收集最新的异常检测算法,并提供用于在公共和私有数据集上进行基准测试的工具。该库提供了一系列已实现的异常检测算法,这些算法在最近的文献中有所描述。此外,Anomalib还提供了一套工具,方便开发人员开发和实现自定义模型。该库特别注重基于图像的异常检测,旨在识别数据集中的异常图像或图像中的异常像素区域。通过使用Anomalib,用户可以快速构建和评估各种异常检测算法,以满足其特定需求。

mingo_敏 5199

BUU ctf 之[ACTF新生赛2020]rome

1.这是一道简单的写脚本的题吧,不是很难。 2.查看字符串,定位,查看伪代码 int func() { int result; // eax int v1; // [esp+14h] [ebp-44h] int v2; // [esp+18h] [ebp-40h] int v3; // [esp+1Ch] [ebp-3Ch] int v4; // [esp+20h] [ebp-38h] unsigned __int8 v5; // [esp+24h] [ebp-34h] unsi

weixin_47158947的博客 2784

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

BUUCTF -re -[ACTF新生赛2020]rome

BUUCTF -re -[ACTF新生赛2020]rome 无壳 定位到主函数 int func() { int result; // eax int v1[4]; // [esp+14h] [ebp-44h] unsigned __int8 v2; // [esp+24h] [ebp-34h] BYREF unsigned __int8 v3; // [esp+25h] [ebp-33h] unsigned __int8 v4; // [esp+26h] [ebp-32h] un

yzl_007的博客 516

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

利用粒子滤波算法对摄像头输入的实时视频进行目标跟踪(opencv-python)

基于粒子滤波的实时目标跟踪

JiaDi1246的博客 2043

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

粒子滤波跟踪算法及实现

粒子滤波跟踪算法实现的基本步骤如下: 初始化步骤:选择目标,计算目标模型颜色直方图,初始化粒子。 粒子采样及权重计算:在上一帧目标附近按高斯分布散布粒子,统计每个粒子的颜色直方图。与目标模型颜色直方图对比,根据巴氏距离计算权值,再对权值进行归一化处理。 样本重采样:得到粒子权值之后,需要对粒子重新采样。去除权值较小的粒子,用权值较大的粒子代替,更新粒子。 目标捕获:根据重采样后的粒子位置权重计算...

tagong7920的博客 2868

buuctf——[ACTF新生赛2020]rome && buuctf——[GUET-CTF2019]re && buuctf——[FlareOn4]login

[ACTF新生赛2020]rome 加密运算 很像凯撒密码 第二个for循环进行了校验,把输入的值和v15-v30的初始值进行对比。 程序很简单,就是让我们输入一个字符串,然后判断大小写,进行相应的运算,最后得到了程序开头的数组 v15= [ ‘Q’,‘s’,‘w’,‘3’,‘s’,‘j’, ‘’,‘l’,‘z’,‘4’,’’,‘U’,‘j’,‘w’,’@’,‘l’ ] 由于加密运算里的那个%运算的逆运算很神奇,所以我就采取了最简单值观的暴力破解。 v15= [ 'Q','s','w','3','s'

Dicked的博客 559

基于matlab的粒子群视频跟踪算法仿真

基于matlab的粒子群视频跟踪算法仿真。

FPGA/MATLAB学习教程/源码/项目合作开发 1508

学习笔记之——基于粒子滤波器的目标跟踪算法(内含卡尔曼滤波的学习笔记)

https://blog.youkuaiyun.com/guoyunlei/article/details/78183530https://blog.youkuaiyun.com/hujingshuang/article/details/45535423

gwpscut的博客 3万+

粒子滤波跟踪算法

#include <opencv2/core/core.hpp> #include "opencv2/imgproc/imgproc.hpp" #include <opencv2/highgui/highgui.hpp> #include <stdio.h> #include <iostream> using namespace cv; using...

fforwardd的博客 1736
上一篇: Silicon Labs开发板避坑指南:EFR32BG22的ADC测量AVDD时为何要禁用内部LDO?
下一篇: 【STM32】STM32F103C8T6编码器测速实战:外部中断与输入捕获法性能对比与优化
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值