查壳:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505183510173-1856065087.png)
64位,先看看运行有问题吗:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505183537150-1505979826.png)
任意输入给你弹了一个wrong
进IDA看看:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505183629673-2071123908.png)
解释:输入一个字符串,要满足字符串的长度为33,不然就报错。接下来是在输入的字符串中拿出特定的字符,进行异或后得到一个新的字符串,最后与特定的字符串对比。
这样看来,我们先看要对比的字符串:
![](https://img2023.cnblogs.com/blog/3074711/202305/3074711-20230505184039287-1463411409.png)
还不短,但是我们只拿我们需要的,也就是只拿33个字符(数据)(这些数据由上分析,是经过加密后的,那么拿它来解密得到原型):
知道你想写脚本了,但是你先别急,我们只拿我们需要的数据,就33位。其他的不用:(好了可以写脚本了)
Des = [0x67, 0x79, 0x7B, 0x7F, 0x75, 0x2B, 0x3C, 0x52, 0x53, 0x79,
0x57, 0x5E, 0x5D, 0x42, 0x7B, 0x2D, 0x2A, 0x66, 0x42, 0x7E,
0x4C, 0x57, 0x79, 0x41, 0x6B, 0x7E, 0x65, 0x3C, 0x5C, 0x45,
0x6F, 0x62]
Des2 = [0x09, 0x0A, 0x0F, 0x17, 0x07, 0x18, 0x0C, 0x06, 0x01, 0x10, 0x03, 0x11, 0x20, 0x1D, 0x0B, 0x1E, 0x1B, 0x16,
0x04, 0x0D, 0x13, 0x14, 0x15, 0x02, 0x19, 0x05, 0x1F, 0x08, 0x12, 0x1A, 0x1C, 0x0E]
flag = ''
for i in range(len(Des)):
flag += chr(Des[i] ^ Des2[i])
print(flag)
得到一串乱的字符串“nsthr30TRiTO}_p31pFs_ClCr{z4N_sl”看着很像flag吧,我也觉得。再去分析函数,发现这些字符都是从输入的字符串中提取的,我们再写脚本给他放回去
这里采用的是c++,(本人比较差,不怎么会用python)
char flag1[33];
int main(){
string flag = "nsthr30TRiTO}_p31pFs_ClCr{z4N_sl";
int a[] = {9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14,};
for (int i = 0; i < 32; i++) {
flag1[a[i]] = flag[i];
}
flag1[0] = 'f';
cout << flag1 <<endl;
return 0;
}
得到flag{Tr4nsp0sltiON_Clph3r_1s_3z}收工。