攻防世界-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上面进行远程的动态调试

我们拿到逆向逻辑之后写出解密脚本即可

posted @   Ylin07  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
点击右上角即可分享
微信分享提示