攻防世界-RE-BABYRE
这道题目比较有趣,首先我们分析它是一个不套壳的程序,然后直接用IDA打开
他的加密逻辑也很直观:
- flag一定十个长度为14的字符串
- judge在这里是一个函数指针,指向judge数组的第一位
可是当我们点击judge
却无法查看它的程序逻辑。
我们注意到在上面有这样一段程序
for ( i = 0; i <= 181; ++i )
judge[i] ^= 0xCu;
也就是说我们此时在内存中看到的judge是被异或混淆后的数据,此时我们有两种方法来查看judge的程序内容:
- 动态调试下断点,进入查看逻辑
- 用IDApython解密数组数据,重新进行反编译
方法一:
首先观察数组的起点与数据类型
我们使用IDA内置的python脚本来转换数组数据:
import idc
s = 0x600B00
for i in range(182):
idc.patch_byte(s+i,idc.get_bytes(s+i,1)[0]^0xc)
此时数据被转换为正确的形式,我们先用U
对原数组进行解定义,再用C
对数据重新反汇编,最后再用P
实现反编译
最终我们得到程序的逆向逻辑:
我们注意到密文被拆分为v2和v3两个模块,但由于二者在内存上是连续的,所以我们将其作为一个数组处理
我们可以写出以下解密脚本,拿到flag
#include<stdio.h>
int main(){
char key[15] = "fmcd k7d;V`;np";
key[4] = 127;
for(int i =0;i<=13;i++){
key[i]^=i;
printf("%c",key[i]);
}
getchar();
}
方法二:
因为文件结构是elf所以我们需要拿到linux上面进行远程的动态调试
我们拿到逆向逻辑之后写出解密脚本即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现