这个题,我们查壳之后是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