这个题,我们查壳之后是upx壳。
但是当我们用upxunpack解包的时候我们解不出来。
说明有人动过这个包。
然后我们打开010eider,修改他的魔改

将此处,我们改成UPX我们在解包就可以了。然后我重新使用upxunpack
之后我们成功得到未加密的文件,我们IDA打开

我个人习惯是从后往前看,因为一般都得逆着写代码,所以索性就从后往前看了
然后我们打开关键函数


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

进入这个函数之后我们发现,就是这个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;
}
然后我们返回去看前面的函数

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

关键函数,我们直接写解密代码就好了
#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
751

被折叠的 条评论
为什么被折叠?



