[网鼎杯 2022 青龙组]fakeshell

发布于:2025-04-14 ⋅ 阅读:(22) ⋅ 点赞:(0)

这个题,我们查壳之后是upx壳。

但是当我们用upxunpack解包的时候我们解不出来。

说明有人动过这个包。

然后我们打开010eider,修改他的魔改

image-20250412221140585

将此处,我们改成UPX我们在解包就可以了。然后我重新使用upxunpack

之后我们成功得到未加密的文件,我们IDA打开

image-20250412221243401

我个人习惯是从后往前看,因为一般都得逆着写代码,所以索性就从后往前看了

然后我们打开关键函数

image-20250412221331750

image-20250412221344302

我们可以看到这段函数是最主要的。但是我们还要认清楚,我当时就吃了这个亏了,这个a1到底代表什么,我们需要仔细看清楚,不要看错了

他在这两个函数里面的含义是不一样的

image-20250412221501590

进入这个函数之后我们发现,就是这个byte_14001D330这个数组来跟我们的加密数据来进行比较,我们直接提取出来

​
    unsigned int enc[21] = {
        0x0000004B, 0x00000048, 0x00000079, 0x00000013, 0x00000045, 0x00000030, 0x0000005C, 0x00000049, 
        0x0000005A, 0x00000079, 0x00000013, 0x00000070, 0x0000006D, 0x00000078, 0x00000013, 0x0000006F, 
        0x00000048, 0x0000005D, 0x00000064, 0x00000064
    };
​
并且写出这一段的解密函数    
    char flag[20]={0,};
    for(int i=0;i<20;i++){
        flag[i]=(enc[i]^0x50)-10;
    }

然后我们返回去看前面的函数

image-20250412221657407

里面又嵌套两个函数,我就不一一截图了,你们自己点进去看

image-20250412221729270

关键函数,我们直接写解密代码就好了

#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
​
int main ()
{
    unsigned int enc[21] = {
        0x0000004B, 0x00000048, 0x00000079, 0x00000013, 0x00000045, 0x00000030, 0x0000005C, 0x00000049, 
        0x0000005A, 0x00000079, 0x00000013, 0x00000070, 0x0000006D, 0x00000078, 0x00000013, 0x0000006F, 
        0x00000048, 0x0000005D, 0x00000064, 0x00000064
    };
    char flag[20]={0,};
    for(int i=0;i<20;i++){
        flag[i]=(enc[i]^0x50)-10;
        flag[i]=flag[i]^0x66;
        printf("%c",flag[i]);
    }
    
    
    
    
    
    
    
    
    
    
    return 0;
}

然后我们直接就可以得到结果

why_m0dify_pUx_SheLL


网站公告

今日签到

点亮在社区的每一天
去签到