news 2026/3/14 16:46:31

【攻防世界】reverse | elrond32 详细题解 WP

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【攻防世界】reverse | elrond32 详细题解 WP

【攻防世界】reverse | elrond32 详细题解 WP

下载附件

main函数伪代码:

int__cdeclmain(inta1,char**a2){if(a1>1&&sub_8048414(a2[1],0)){puts("Access granted");sub_8048538(a2[1]);}else{puts("Access denied");}return0;}

sub_8048414函数伪代码:

int__cdeclsub_8048414(_BYTE*a1,inta2){intresult;// eaxswitch(a2){case0:if(*a1==105)gotoLABEL_19;result=0;break;case1:if(*a1==101)gotoLABEL_19;result=0;break;case3:if(*a1==110)gotoLABEL_19;result=0;break;case4:if(*a1==100)gotoLABEL_19;result=0;break;case5:if(*a1==97)gotoLABEL_19;result=0;break;case6:if(*a1==103)gotoLABEL_19;result=0;break;case7:if(*a1==115)gotoLABEL_19;result=0;break;case9:if(*a1==114)LABEL_19:result=sub_8048414(a1+1,7*(a2+1)%11);elseresult=0;break;default:result=1;break;}returnresult;}

sub_8048538函数伪代码:

int__cdeclsub_8048538(inta1){intv2[33];// [esp+18h] [ebp-A0h] BYREFinti;// [esp+9Ch] [ebp-1Ch]qmemcpy(v2,&unk_8048760,sizeof(v2));for(i=0;i<=32;++i)putchar(v2[i]^*(char*)(a1+i%8));returnputchar(10);}

exp:

# 1. 提取unk_8048760的33个低字节(核心密文)unk_8048760_bytes=[0x0F,0x1F,0x04,0x09,0x1C,0x12,0x42,0x09,0x0C,0x44,0x0D,0x07,0x09,0x06,0x2D,0x37,0x59,0x1E,0x00,0x59,0x0F,0x08,0x1C,0x23,0x36,0x07,0x55,0x02,0x0C,0x08,0x41,0x0A,0x14]# 2. 验证通过的输入字符串(isengard)及其ASCII值(十六进制)input_str="isengard"input_ascii=[ord(c)forcininput_str]# [0x69, 0x73, 0x65, 0x6E, 0x67, 0x61, 0x72, 0x64]# 3. 异或计算Flag(i%8循环取输入字符)flag=[]foriinrange(33):xor_result=unk_8048760_bytes[i]^input_ascii[i%8]flag.append(chr(xor_result))# 4. 输出最终Flagprint("Flag: "+''.join(flag))

运行 exp 脚本:

flag{s0me7hing_S0me7hinG_t0lki3n}

【攻防世界】reverse | elrond32 详细题解 WP 原理深度解析:

【CTF 逆向实战】攻防世界 elrond32 深度解析:从状态机验证到异或解密的完整解题链路

一、题目概述

本题来自攻防世界 reverse 类别,题目名称为elrond32。核心目标是通过逆向分析程序逻辑,找到符合验证条件的输入字符串,并利用该字符串生成最终的 Flag。程序整体逻辑分为输入验证Flag 生成两个阶段,涉及递归状态机、循环异或等典型逆向考点,是 CTF 逆向中 “验证 + 解密” 组合题型的经典案例。

二、程序核心逻辑拆解

通过 IDAPro 等工具反编译程序后,我们可以得到关键函数的伪代码,整体流程如下:

main函数 ├─ 接收命令行参数(第一个参数为待验证输入) ├─ 调用sub_8048414(input, 0)进行输入验证 │ ├─ 验证通过 → 输出"Access granted",调用sub_8048538生成Flag │ └─ 验证失败 → 输出"Access denied" └─ 程序退出

从流程可见,解题的关键在于两步:

  1. 破解sub_8048414的验证逻辑,找到合法输入;
  2. 分析sub_8048538的 Flag 生成规则,利用合法输入计算 Flag。

三、输入验证函数 sub_8048414 深度分析

sub_8048414是一个递归状态机,通过switch语句检查输入字符,并根据当前状态计算下一个状态,直到触发终止条件。

3.1 状态机核心逻辑拆解

// 函数功能:递归状态机验证输入字符串是否符合预设规则// 调用约定:__cdecl(C默认),参数从右到左入栈,调用者清理栈// 参数说明:// a1:_BYTE* (unsigned char*) → 指向输入字符串的当前待验证字符// a2:int → 当前验证状态(控制switch分支的核心变量)// 返回值:int → 1=验证通过,0=验证失败int__cdeclsub_8048414(_BYTE*a1,inta2){intresult;// 函数返回值临时存储(eax寄存器承接,符合x86调用规范)// 核心逻辑:根据当前状态a2,检查对应字符是否匹配switch(a2){// 状态0:验证当前字符是否为 'i'(ASCII=105)case0:// 检查当前指针指向的字符是否等于105('i')if(*a1==105)gotoLABEL_19;// 字符匹配,跳转到递归调用入口result=0;// 字符不匹配,标记验证失败break;// 退出switch分支// 状态1:验证当前字符是否为 'e'(ASCII=101)case1:if(*a1==101)gotoLABEL_19;result=0;break;// 状态3:验证当前字符是否为 'n'(ASCII=110)case3:if(*a1==110)gotoLABEL_19;result=0;break;// 状态4:验证当前字符是否为 'd'(ASCII=100)case4:if(*a1==100)gotoLABEL_19;result=0;break;// 状态5:验证当前字符是否为 'a'(ASCII=97)case5:if(*a1==97)gotoLABEL_19;result=0;break;// 状态6:验证当前字符是否为 'g'(ASCII=103)case6:if(*a1==103)gotoLABEL_19;result=0;break;// 状态7:验证当前字符是否为 's'(ASCII=115)case7:if(*a1==115)gotoLABEL_19;result=0;break;// 状态9:验证当前字符是否为 'r'(ASCII=114)【特殊:LABEL_19直接在该分支内】case9:// 检查当前字符是否为114('r')if(*a1==114)LABEL_19:// 所有字符匹配分支的统一递归入口// 递归调用:验证下一个字符 + 计算下一个状态// a1+1:指针后移,指向输入字符串的下一个字符// 7*(a2+1)%11:状态转移公式,计算下一个验证状态result=sub_8048414(a1+1,7*(a2+1)%11);elseresult=0;// 字符不匹配,标记验证失败break;// 退出switch分支// 默认分支:无匹配状态(a2不在0/1/3/4/5/6/7/9范围内)default:result=1;// 递归终止条件:所有前置字符均匹配,验证通过break;// 退出switch分支}returnresult;// 返回最终验证结果(1=通过,0=失败)}

函数伪代码中,a1为输入字符串的当前字符指针,a2为当前状态。核心逻辑:

  • 对当前状态a2,检查a1指向的字符是否符合条件;
  • 符合条件则递归调用自身,传入下一个字符(a1+1)和计算出的下一个状态;
  • 状态无匹配case时(default),递归终止(验证通过)。

整理状态与字符的对应关系及下一个状态计算规则(下一个状态 = 7*(当前状态 + 1) % 11):

当前状态(a2)要求字符(ASCII)字符下一个状态
0105‘i’7*(0+1)%11=7
1101‘e’7*(1+1)%11=3
3110‘n’7*(3+1)%11=6
4100‘d’7*(4+1)%11=2
597‘a’7*(5+1)%11=9
6103‘g’7*(6+1)%11=5
7115‘s’7*(7+1)%11=1
9114‘r’7*(9+1)%11=4
其他(如 2)--default(终止)

3.2 逆向推导合法输入

状态机的验证过程是 “正向递归”,但逆向破解时更高效的方式是从终止状态倒推

  1. 终止条件:状态 = 2(无对应 case,触发 default);

  2. 状态 2 的上一状态:只有状态 4 的下一个状态是 2(见表格),因此上一字符必须是 ‘d’(状态 4 要求);

  3. 状态 4 的上一状态:状态 9 的下一个状态是 4,因此上一字符必须是 ‘r’(状态 9 要求);

  4. 依次倒推:

    状态 9 ← 状态 5(字符 ‘a’)

    状态 5 ← 状态 6(字符 ‘g’)

    状态 6 ← 状态 3(字符 ‘n’)

    状态 3 ← 状态 1(字符 ‘e’)

    状态 1 ← 状态 7(字符’s’)

    状态 7 ← 状态 0(字符 ‘i’)

最终得到合法输入字符串:i → s → e → n → g → a → r → d,即"isengard"(长度 8,后续会用到这个长度特性)。

四、Flag 生成函数 sub_8048538 解析

验证通过后,sub_8048538会生成 Flag,核心逻辑是固定数据与输入字符的循环异或

4.1 函数逻辑拆解

int__cdeclsub_8048538(inta1)// a1为合法输入字符串{intv2[33];// 存储从unk_8048760复制的数据inti;qmemcpy(v2,&unk_8048760,sizeof(v2));// 复制33个intfor(i=0;i<=32;++i)putchar(v2[i]^*(char*)(a1+i%8));// 异或后输出returnputchar(10);}

关键信息:

  • unk_8048760是程序中的固定数据,共 33 个 int(每个 int 占 4 字节,小端存储);
  • 输出时取v2[i]的低字节(因putchar只处理 1 字节)与输入字符串的第i%8个字符异或;
  • 输入字符串长度为 8(isengard),因此i%8会循环使用输入的 8 个字符。

4.2 提取 unk_8048760 的关键字节

由于程序是 32 位小端存储(低字节在前),每个 int 的低字节(第一个字节)才是参与异或的有效数据。从内存中提取 33 个低字节:

unk_8048760_bytes=[0x0F,0x1F,0x04,0x09,0x1C,0x12,0x42,0x09,0x0C,0x44,0x0D,0x07,0x09,0x06,0x2D,0x37,0x59,0x1E,0x00,0x59,0x0F,0x08,0x1C,0x23,0x36,0x07,0x55,0x02,0x0C,0x08,0x41,0x0A,0x14]

4.3 计算 Flag

输入字符串"isengard"的 ASCII 值为:

[0x69, 0x73, 0x65, 0x6E, 0x67, 0x61, 0x72, 0x64](对应 i/s/e/n/g/a/r/d)

循环异或计算(v2[i]低字节 ^ 输入[i%8]):

# 输入ASCII值input_ascii=[0x69,0x73,0x65,0x6E,0x67,0x61,0x72,0x64]# 计算每个字符flag=[]foriinrange(33):xor_result=unk_8048760_bytes[i]^input_ascii[i%8]flag.append(chr(xor_result))print("Flag: "+''.join(flag))# 输出flag{s0me7hing_S0me7hinG_t0lki3n}

五、原理深度解析

5.1 递归状态机的验证逻辑

状态机本质是通过 “状态→字符→下一状态” 的映射控制输入格式,常见于密码验证、协议解析等场景。逆向时:

  • 优先梳理状态转移表(如本文的表格);
  • 从终止条件倒推(避免正向枚举所有可能路径);
  • 注意递归终止条件(如本题的 default 分支)。

5.2 小端存储与字节提取

x86 架构下数据默认小端存储(低字节存于低地址),因此多字节数据(如 int)参与单字节操作(如 putchar)时,需提取低字节(data & 0xFF)。这是逆向中极易踩坑的点,需通过内存查看工具(如 IDA 的 Hex View)确认原始字节。

5.3 循环异或的加密特性

异或是 CTF 中最常见的对称加密方式,特点是:

  • 可逆性:a ^ b = c → c ^ b = a
  • 循环密钥:当密钥长度小于明文时,会重复使用(如本题i%8循环);
  • 破解关键:获取密钥(本题的输入字符串)和密文(unk_8048760的字节)即可还原明文(Flag)。

六、举一反三:同类型题目解题技巧

6.1 输入验证类题目

  1. 状态机识别:当看到switch+ 递归 / 循环 + 字符检查时,大概率是状态机,需整理状态转移表;
  2. 终止条件优先:逆向状态机时,从 “验证通过” 的终止条件倒推路径(如本题的 default 分支);
  3. 长度推断:若后续有循环使用输入(如i%n),则输入长度通常为n(本题i%8对应输入长度 8)。

6.2 异或解密类题目

  1. 密文提取:确认参与异或的原始数据(如本题unk_8048760的低字节);
  2. 密钥获取:密钥可能是固定字符串、输入、或动态生成(需逆向密钥生成逻辑);
  3. 验证计算:用少量数据验证异或逻辑(如本题先计算前 3 个字符确认正确性)。

6.3 实战工具推荐

  • 反编译:IDAPro、Ghida(查看伪代码);
  • 内存查看:IDA 的 Hex View(提取原始字节);
  • 动态调试:GDB(验证输入是否通过验证,观察异或过程);
  • 脚本辅助:Python(快速实现异或、状态推导等计算)。

七、总结

elrond32作为典型的 “状态机验证 + 异或解密” 题目,核心考点在于:

  1. 逆向递归状态机,从终止条件推导出合法输入;
  2. 处理小端存储的数据提取,理解循环异或的逻辑。

掌握这类题目的解题思路后,面对类似的 “验证 + 解密” 组合题型,可快速定位关键函数,梳理数据流向,结合逆向工具与脚本辅助,高效破解 Flag。

最终 Flagflag{s0me7hing_S0me7hinG_t0lki3n}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 16:59:01

终极防锁屏指南:2025年最全电脑防休眠解决方案

终极防锁屏指南&#xff1a;2025年最全电脑防休眠解决方案 【免费下载链接】movemouse Move Mouse is a simple piece of software that is designed to simulate user activity. 项目地址: https://gitcode.com/gh_mirrors/mo/movemouse 你是否经历过这样的困扰&#x…

作者头像 李华
网站建设 2026/3/12 15:03:07

AI赋能靶向蛋白降解:革新药物发现的新引擎

靶向蛋白降解技术&#xff0c;尤其是蛋白水解靶向嵌合体与分子胶&#xff0c;正引领药物发现进入一个能够直接“清除”致病蛋白的新时代。然而&#xff0c;其理性设计长期受限于三元复合物形成的复杂性、配体发现的困难以及类药性优化等挑战。如今&#xff0c;人工智能的迅猛发…

作者头像 李华
网站建设 2026/3/13 8:25:30

如何快速部署Papermerge文档管理系统:面向新手的完整教程

如何快速部署Papermerge文档管理系统&#xff1a;面向新手的完整教程 【免费下载链接】papermerge Open Source Document Management System for Digital Archives (Scanned Documents) 项目地址: https://gitcode.com/gh_mirrors/pa/papermerge Papermerge是一款专为数…

作者头像 李华
网站建设 2026/3/9 1:49:12

【程序源代码】大学校园二手书籍交易小程序(含前后端源码)

关键字&#xff1a;大学校园二手书籍交易小程序&#xff08;含前后端源码&#xff09;&#xff08;一&#xff09;系统介绍1.1 系统介绍大学校园二手书籍交易小程序&#xff08;含前后端源码&#xff09;此小程序主要是服务于当前大学生&#xff0c;解决大学生在校园存在资源冗…

作者头像 李华
网站建设 2026/3/14 10:11:11

业务逻辑多变?XinServer 的表结构好改吗?

业务逻辑多变&#xff1f;XinServer 的表结构好改吗&#xff1f; 兄弟们&#xff0c;不知道你们有没有遇到过这种情况&#xff1a;产品经理拿着新需求过来&#xff0c;说“咱们这个用户表&#xff0c;能不能加个‘会员等级’字段&#xff1f;哦对了&#xff0c;还得关联一下他的…

作者头像 李华
网站建设 2026/3/12 18:37:57

Vue树状图组件终极指南:5分钟快速上手可视化数据展示

Vue树状图组件终极指南&#xff1a;5分钟快速上手可视化数据展示 【免费下载链接】Vue-Tree-Chart A Vue component to display tree chart 项目地址: https://gitcode.com/gh_mirrors/vu/Vue-Tree-Chart Vue-Tree-Chart是一个专为Vue.js设计的强大树状图可视化组件&…

作者头像 李华